"""
Conversation and Message Models
"""
from datetime import datetime
from sqlalchemy import Column, Integer, String, Text, DateTime, ForeignKey, JSON, Enum as SQLEnum, Boolean
from sqlalchemy.orm import relationship
import enum

from app.models.base import Base, TimestampMixin


class ChannelType(enum.Enum):
    WEB = "web"
    WHATSAPP = "whatsapp"
    TELEGRAM = "telegram"
    VOICE = "voice"
    API = "api"
    FACEBOOK = "facebook"
    INSTAGRAM = "instagram"


class ConversationStatus(enum.Enum):
    ACTIVE = "active"
    CLOSED = "closed"
    ESCALATED = "escalated"
    ARCHIVED = "archived"


class MessageRole(enum.Enum):
    USER = "user"
    ASSISTANT = "assistant"
    SYSTEM = "system"


class Conversation(Base, TimestampMixin):
    """
    Conversation/Chat Session Model
    """
    __tablename__ = "conversations"

    id = Column(Integer, primary_key=True, index=True)
    client_id = Column(Integer, ForeignKey("clients.id"), nullable=False, index=True)

    # Session Identification
    session_id = Column(String(100), unique=True, nullable=False, index=True)

    # Channel Information
    channel = Column(SQLEnum(ChannelType), default=ChannelType.WEB, nullable=False)
    channel_user_id = Column(String(255), nullable=True)  # WhatsApp number, Telegram ID, etc.

    # User Information (optional - for identified users)
    user_name = Column(String(255), nullable=True)
    user_email = Column(String(255), nullable=True)
    user_phone = Column(String(20), nullable=True)
    user_metadata = Column(JSON, nullable=True)

    # Conversation Details
    status = Column(SQLEnum(ConversationStatus), default=ConversationStatus.ACTIVE)
    subject = Column(String(255), nullable=True)
    tags = Column(JSON, default=[])

    # Timing
    started_at = Column(DateTime, default=datetime.utcnow)
    ended_at = Column(DateTime, nullable=True)
    last_message_at = Column(DateTime, default=datetime.utcnow)

    # Stats
    message_count = Column(Integer, default=0)
    total_tokens_used = Column(Integer, default=0)

    # Sentiment & Analytics
    overall_sentiment = Column(String(20), nullable=True)  # positive, negative, neutral
    resolved = Column(Boolean, default=False)
    resolution_time_seconds = Column(Integer, nullable=True)

    # Source Tracking
    source_url = Column(String(500), nullable=True)  # Where the chat was initiated
    source_ip = Column(String(45), nullable=True)
    user_agent = Column(String(500), nullable=True)

    # Relationships
    client = relationship("Client", back_populates="conversations")
    messages = relationship("Message", back_populates="conversation", cascade="all, delete-orphan", order_by="Message.created_at")

    def __repr__(self):
        return f"<Conversation(id={self.id}, session_id='{self.session_id}')>"


class Message(Base, TimestampMixin):
    """
    Individual Message in a Conversation
    """
    __tablename__ = "messages"

    id = Column(Integer, primary_key=True, index=True)
    conversation_id = Column(Integer, ForeignKey("conversations.id"), nullable=False, index=True)

    # Message Content
    role = Column(SQLEnum(MessageRole), nullable=False)
    content = Column(Text, nullable=False)

    # Token Usage
    input_tokens = Column(Integer, default=0)
    output_tokens = Column(Integer, default=0)
    total_tokens = Column(Integer, default=0)

    # AI Model Used
    model = Column(String(50), nullable=True)

    # Response Metadata
    response_time_ms = Column(Integer, nullable=True)
    finish_reason = Column(String(50), nullable=True)

    # Feedback
    feedback_rating = Column(Integer, nullable=True)  # 1-5 stars
    feedback_text = Column(Text, nullable=True)

    # Attachments (for future use)
    attachments = Column(JSON, nullable=True)

    # Message Status
    is_error = Column(Boolean, default=False)
    error_message = Column(Text, nullable=True)

    # Relationships
    conversation = relationship("Conversation", back_populates="messages")

    def __repr__(self):
        return f"<Message(id={self.id}, role='{self.role.value}')>"
