from django.conf import settings
from django.db import models

from .crypto import encrypt_key, decrypt_key, mask_key


class LLMProvider(models.Model):
    """A configurable LLM provider (Gemini / OpenRouter / OpenAI-compatible / Custom).
    Multiple can be defined; one is marked default. API keys are stored encrypted."""

    class Provider(models.TextChoices):
        GEMINI = "GEMINI", "Google Gemini"
        OPENROUTER = "OPENROUTER", "OpenRouter"
        OPENAI = "OPENAI", "OpenAI-compatible"
        CUSTOM = "CUSTOM", "Custom"

    name = models.CharField(max_length=120, help_text="A label, e.g. 'Gemini Flash (Dev)'")
    provider = models.CharField(max_length=20, choices=Provider.choices)
    api_key_encrypted = models.TextField(blank=True, default="")
    base_url = models.CharField(max_length=500, blank=True, default="",
        help_text="Override endpoint. Blank = provider default.")
    model = models.CharField(max_length=200, help_text="e.g. gemini-2.0-flash, openai/gpt-4o-mini")
    max_tokens = models.PositiveIntegerField(default=800)
    temperature = models.FloatField(default=0.7)
    is_active = models.BooleanField(default=True)
    is_default = models.BooleanField(default=False)
    created_by = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True,
        on_delete=models.SET_NULL, related_name="llm_providers")
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        db_table = "llm_providers"
        ordering = ["-is_default", "name"]

    def __str__(self):
        return f"{self.name} ({self.provider})"

    # --- key helpers ---
    def set_api_key(self, plaintext: str):
        self.api_key_encrypted = encrypt_key(plaintext)

    @property
    def api_key(self) -> str:
        return decrypt_key(self.api_key_encrypted)

    @property
    def api_key_masked(self) -> str:
        return mask_key(self.api_key)

    def save(self, *args, **kwargs):
        # Guarantee only one default provider.
        if self.is_default:
            LLMProvider.objects.exclude(pk=self.pk).update(is_default=False)
        super().save(*args, **kwargs)


class LLMCallLog(models.Model):
    """One row per real LLM network call (audit + usage, mirrors llm_mark_call)."""
    provider = models.ForeignKey(LLMProvider, null=True, blank=True, on_delete=models.SET_NULL, related_name="calls")
    purpose = models.CharField(max_length=80, blank=True, default="", help_text="e.g. rank, test, screening")
    ok = models.BooleanField(default=True)
    error = models.TextField(blank=True, default="")
    prompt_chars = models.PositiveIntegerField(default=0)
    response_chars = models.PositiveIntegerField(default=0)
    called_by = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True, on_delete=models.SET_NULL)
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        db_table = "llm_call_logs"
        ordering = ["-created_at"]
