from django.db import models
from apps.users.models import User, Session
import uuid


class Conversation(models.Model):
    class Status(models.TextChoices):
        ACTIVE = "active", "Active"
        ENDED = "ended", "Ended"

    user = models.ForeignKey(
        "users.User", on_delete=models.CASCADE, null=True, blank=True, related_name="conversations"
    )
    session = models.ForeignKey(
        "users.Session", on_delete=models.CASCADE, null=True, blank=True, related_name="conversations"
    )
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    room_name = models.CharField(max_length=255, db_index=True)
    room_sid = models.CharField(max_length=255, null=True, blank=True)
    status = models.CharField(max_length=20, choices=Status.choices, default=Status.ACTIVE, db_index=True)
    detected_language = models.CharField(max_length=10, null=True, blank=True)
    agent_job_id = models.CharField(max_length=255, null=True, blank=True)
    started_at = models.DateTimeField(auto_now_add=True)
    ended_at = models.DateTimeField(null=True, blank=True)
    metadata = models.JSONField(default=dict, blank=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        db_table = "conversations_conversation"
        constraints = [
            models.CheckConstraint(
                check=models.Q(user__isnull=False) | models.Q(session__isnull=False),
                name="conversation_has_user_or_session",
            )
        ]


class UserTurn(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    conversation = models.ForeignKey(
        Conversation, on_delete=models.CASCADE, related_name="user_turns"
    )
    order_index = models.PositiveIntegerField(default=0)
    transcribed_text = models.TextField(help_text="STT output - user transcript")
    detected_language = models.CharField(max_length=10, null=True, blank=True)
    stt_provider = models.CharField(max_length=50, null=True, blank=True)
    stt_confidence = models.FloatField(null=True, blank=True)
    audio_storage_path = models.CharField(max_length=512, null=True, blank=True)
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        db_table = "conversations_user_turn"
        ordering = ["conversation", "order_index"]


class AgentResponse(models.Model):
    conversation = models.ForeignKey(
        Conversation, on_delete=models.CASCADE, related_name="agent_responses"
    )
    user_turn = models.OneToOneField(
        UserTurn, on_delete=models.CASCADE, related_name="agent_response", null=True, blank=True
    )
    response_text = models.TextField(help_text="LLM output - agent transcript")
    llm_provider = models.CharField(max_length=50, null=True, blank=True)
    tts_provider = models.CharField(max_length=50, null=True, blank=True)
    voice_id = models.CharField(max_length=255, null=True, blank=True)
    audio_storage_path = models.CharField(max_length=512, null=True, blank=True)
    language_used = models.CharField(max_length=10, null=True, blank=True)
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        db_table = "conversations_agent_response"


class APIUsage(models.Model):
    conversation = models.ForeignKey(
        Conversation, on_delete=models.SET_NULL, null=True, blank=True, related_name="api_usage"
    )
    provider = models.CharField(max_length=50, db_index=True)
    operation = models.CharField(max_length=50)
    request_id = models.CharField(max_length=255, null=True, blank=True)
    metadata = models.JSONField(default=dict, blank=True)
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        db_table = "conversations_api_usage"
