"""Support ticket models for CRM functionality."""

from datetime import datetime
from enum import Enum as PyEnum
from uuid import uuid4

from sqlalchemy import Column, DateTime, Enum, ForeignKey, String, Text
from sqlalchemy.dialects.postgresql import UUID
from sqlalchemy.orm import relationship

from app.database import Base


class TicketType(str, PyEnum):
    """Support ticket type."""
    FINANCE = "finance"
    REGISTRAR = "registrar"
    IT = "it"
    ACADEMIC = "academic"
    GENERAL = "general"


class TicketStatus(str, PyEnum):
    """Support ticket status."""
    OPEN = "open"
    IN_PROGRESS = "in_progress"
    RESOLVED = "resolved"
    CLOSED = "closed"


class SupportTicket(Base):
    """Support ticket for student issues."""
    __tablename__ = "support_tickets"

    id = Column(UUID(as_uuid=True), primary_key=True, default=uuid4, index=True)
    student_id = Column(UUID(as_uuid=True), ForeignKey("users.id"), nullable=False, index=True)
    
    ticket_type = Column(Enum(TicketType), nullable=False, index=True)
    subject = Column(String(255), nullable=False)
    description = Column(Text, nullable=False)
    status = Column(Enum(TicketStatus), default=TicketStatus.OPEN, nullable=False, index=True)
    
    # Assignment
    assigned_to = Column(String(100), nullable=True)  # Could be "bursary", "registrar", "it", etc.
    
    # Internal notes (not visible to student)
    internal_notes = Column(Text, nullable=True)
    
    # Resolution
    resolution = Column(Text, nullable=True)
    resolved_at = Column(DateTime, nullable=True)
    resolved_by = Column(UUID(as_uuid=True), ForeignKey("users.id"), nullable=True)
    
    created_at = Column(DateTime, default=datetime.utcnow, nullable=False)
    updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False)
    
    # Relationships
    student = relationship("User", foreign_keys=[student_id])
    resolver = relationship("User", foreign_keys=[resolved_by])
    messages = relationship(
        "SupportTicketMessage",
        back_populates="ticket",
        cascade="all, delete-orphan",
        order_by="SupportTicketMessage.created_at",
    )

    def __repr__(self):
        return f"<SupportTicket {self.id}: {self.subject} - {self.status.value}>"


class SupportTicketMessage(Base):
    """Individual message within a support ticket thread."""
    __tablename__ = "support_ticket_messages"

    id = Column(UUID(as_uuid=True), primary_key=True, default=uuid4, index=True)
    ticket_id = Column(UUID(as_uuid=True), ForeignKey("support_tickets.id"), nullable=False, index=True)
    sender_id = Column(UUID(as_uuid=True), ForeignKey("users.id"), nullable=False, index=True)
    sender_role = Column(String(50), nullable=False)  # e.g. "student", "corporate_partner", "dean"
    content = Column(Text, nullable=False)
    created_at = Column(DateTime, default=datetime.utcnow, nullable=False)

    ticket = relationship("SupportTicket", back_populates="messages")
    sender = relationship("User", foreign_keys=[sender_id])

    def __repr__(self):
        return f"<SupportTicketMessage {self.id} ticket={self.ticket_id}>"
