from sqlalchemy import Column, Integer, String, Text, Enum, Date, DateTime, ForeignKey, Boolean, Numeric, JSON
from sqlalchemy.orm import relationship
from app.db.base import Base, TimestampMixin
import enum


# ─── CUSTOMER ──────────────────────────────────────────────────────────────────

class CustomerStatus(str, enum.Enum):
    potansiyel = "potansiyel"
    gorusuluyor = "gorusuluyor"
    teklif_verildi = "teklif_verildi"
    aktif_musteri = "aktif_musteri"
    tamamlandi = "tamamlandi"


class Customer(Base, TimestampMixin):
    __tablename__ = "customers"

    id = Column(Integer, primary_key=True, index=True)
    user_id = Column(Integer, ForeignKey("users.id", ondelete="CASCADE"), nullable=False, index=True)

    company_name = Column(String(255), nullable=False)
    contact_person = Column(String(100), nullable=True)
    phone = Column(String(20), nullable=True)
    email = Column(String(255), nullable=True)
    website = Column(String(500), nullable=True)
    notes = Column(Text, nullable=True)
    status = Column(Enum(CustomerStatus), default=CustomerStatus.potansiyel, nullable=False, index=True)
    is_deleted = Column(Boolean, default=False, nullable=False)

    user = relationship("User", back_populates="customers")

    def __repr__(self):
        return f"<Customer id={self.id} company={self.company_name}>"


# ─── TRANSACTION ───────────────────────────────────────────────────────────────

class TransactionType(str, enum.Enum):
    gelir = "gelir"
    gider = "gider"


class Transaction(Base, TimestampMixin):
    __tablename__ = "transactions"

    id = Column(Integer, primary_key=True, index=True)
    user_id = Column(Integer, ForeignKey("users.id", ondelete="CASCADE"), nullable=False, index=True)

    date = Column(Date, nullable=False, index=True)
    description = Column(Text, nullable=False)
    category = Column(String(100), nullable=True)
    amount = Column(Numeric(12, 2), nullable=False)
    type = Column(Enum(TransactionType), nullable=False, index=True)
    is_deleted = Column(Boolean, default=False, nullable=False)

    user = relationship("User", back_populates="transactions")

    def __repr__(self):
        return f"<Transaction id={self.id} type={self.type} amount={self.amount}>"


# ─── NOTE ──────────────────────────────────────────────────────────────────────

class Note(Base, TimestampMixin):
    __tablename__ = "notes"

    id = Column(Integer, primary_key=True, index=True)
    user_id = Column(Integer, ForeignKey("users.id", ondelete="CASCADE"), nullable=False, index=True)

    title = Column(String(255), nullable=False)
    content = Column(Text, nullable=True)  # Tiptap JSON veya HTML
    category = Column(String(100), nullable=True)
    tags = Column(JSON, nullable=True)  # ["tag1", "tag2"]
    is_favorite = Column(Boolean, default=False, nullable=False)
    is_deleted = Column(Boolean, default=False, nullable=False)

    user = relationship("User", back_populates="notes")

    def __repr__(self):
        return f"<Note id={self.id} title={self.title[:30]}>"


# ─── CALENDAR EVENT ────────────────────────────────────────────────────────────

class CalendarEvent(Base, TimestampMixin):
    __tablename__ = "calendar_events"

    id = Column(Integer, primary_key=True, index=True)
    user_id = Column(Integer, ForeignKey("users.id", ondelete="CASCADE"), nullable=False, index=True)
    task_id = Column(Integer, ForeignKey("tasks.id", ondelete="SET NULL"), nullable=True)
    project_id = Column(Integer, ForeignKey("projects.id", ondelete="SET NULL"), nullable=True)

    title = Column(String(255), nullable=False)
    description = Column(Text, nullable=True)
    start_datetime = Column(DateTime, nullable=False, index=True)
    end_datetime = Column(DateTime, nullable=True)
    all_day = Column(Boolean, default=False, nullable=False)
    color = Column(String(7), default="#3B82F6", nullable=True)
    is_deleted = Column(Boolean, default=False, nullable=False)

    user = relationship("User", back_populates="calendar_events")
    task = relationship("Task", back_populates="calendar_events")
    project = relationship("Project", back_populates="calendar_events")

    def __repr__(self):
        return f"<CalendarEvent id={self.id} title={self.title[:30]}>"


# ─── GOAL ──────────────────────────────────────────────────────────────────────

class GoalStatus(str, enum.Enum):
    aktif = "aktif"
    tamamlandi = "tamamlandi"
    iptal = "iptal"


class Goal(Base, TimestampMixin):
    __tablename__ = "goals"

    id = Column(Integer, primary_key=True, index=True)
    user_id = Column(Integer, ForeignKey("users.id", ondelete="CASCADE"), nullable=False, index=True)

    title = Column(String(255), nullable=False)
    description = Column(Text, nullable=True)
    target_value = Column(Numeric(12, 2), nullable=False)
    current_value = Column(Numeric(12, 2), default=0, nullable=False)
    unit = Column(String(50), nullable=True)  # "TL", "müşteri", "saat" vs.
    due_date = Column(Date, nullable=True)
    category = Column(String(100), nullable=True)
    status = Column(Enum(GoalStatus), default=GoalStatus.aktif, nullable=False, index=True)
    is_deleted = Column(Boolean, default=False, nullable=False)

    user = relationship("User", back_populates="goals")

    @property
    def progress_pct(self) -> float:
        """İlerleme yüzdesini hesaplar."""
        if self.target_value == 0:
            return 0.0
        return min(round(float(self.current_value) / float(self.target_value) * 100, 1), 100.0)

    def __repr__(self):
        return f"<Goal id={self.id} title={self.title[:30]} progress={self.progress_pct}%>"
