# (c) cavaliba.com - home - models.py

from django.db import models
from django.utils.translation import gettext_lazy as _

# ---------------------------------------
# Configuration
# ---------------------------------------


class CavalibaConfiguration(models.Model):
    appname = models.SlugField(
        _("Cavaliba App"), max_length=128, null=False, blank=False, default="home"
    )
    keyname = models.SlugField(_("Keyname(*)"), max_length=128, null=False, blank=False)

    value = models.TextField(_("Value"), blank=True, default="")

    description = models.CharField(_("Description"), max_length=500, blank=True, default="")
    page = models.CharField(_("Page"), max_length=1500, blank=True, default="")
    order = models.IntegerField(_("Order"), default=100)

    # group
    # type : int/string/json/IP/...
    # default value ?

    class Meta:
        db_table = "configuration"
        unique_together = ["appname", "keyname"]
        ordering = ["appname", "page", "order", "keyname"]
        verbose_name = "Cavaliba Configuration"
        verbose_name_plural = "Cavaliba Configurations"
        # unique_together = ('login', 'site',)

    def __str__(self):
        return self.keyname


# ---------------------------------------
# Logs
# ---------------------------------------


class CavalibaEvent(models.Model):
    """Retained log event, ECS semantics with short column names (see app_home.log)."""

    created = models.DateTimeField(_("Created"), db_index=True)
    level = models.CharField(_("Level"), max_length=10, default="INFO")
    severity = models.SmallIntegerField(_("Severity"), default=20)

    domain = models.CharField(_("Domain"), max_length=64, blank=True, default="")
    action = models.CharField(_("Action"), max_length=128, blank=True, default="")
    category = models.CharField(_("Category"), max_length=32, blank=True, default="")
    outcome = models.CharField(_("Outcome"), max_length=8, blank=True, default="")
    reason = models.CharField(_("Reason"), max_length=64, blank=True, default="")

    target_type = models.CharField(_("Target type"), max_length=128, blank=True, default="")
    target_id = models.CharField(_("Target id"), max_length=256, blank=True, default="")

    actor = models.CharField(_("Actor"), max_length=256, blank=True, default="")
    actor_effective = models.CharField(_("Effective actor"), max_length=256, blank=True, default="")
    actor_kind = models.CharField(_("Actor kind"), max_length=16, blank=True, default="")
    client_ip = models.CharField(_("Client IP"), max_length=64, blank=True, default="")

    channel = models.CharField(_("Channel"), max_length=16, blank=True, default="")
    origin = models.CharField(_("Origin"), max_length=200, blank=True, default="")
    request_id = models.CharField(_("Request id"), max_length=64, blank=True, default="")

    duration_ms = models.IntegerField(_("Duration (ms)"), null=True, blank=True)
    count = models.IntegerField(_("Count"), null=True, blank=True)
    message = models.CharField(_("Message"), max_length=2000, blank=True, default="")
    extra = models.JSONField(_("Extra"), default=dict, blank=True)

    class Meta:
        db_table = "log_event"
        ordering = ["-id"]
        verbose_name = "Cavaliba Event"
        verbose_name_plural = "Cavaliba Events"
        indexes = [
            models.Index(fields=["target_type", "target_id"]),
            models.Index(fields=["action"]),
            models.Index(fields=["outcome"]),
            models.Index(fields=["actor"]),
            models.Index(fields=["request_id"]),
            models.Index(fields=["domain", "created"]),
            models.Index(fields=["level", "created"]),
        ]

    def __str__(self):
        return (
            f"{self.created} {self.level} {self.channel} {self.actor} {self.action} {self.outcome}"
        )


class CavalibaAPIStat(models.Model):
    keyname = models.SlugField(_("Keyname"), max_length=128, unique=True)
    last_success = models.DateTimeField(
        _("Last success"), auto_now_add=False, blank=True, null=True
    )
    last_error = models.DateTimeField(_("Last error"), auto_now_add=False, blank=True, null=True)
    success_count = models.IntegerField(_("success count"), default=0)
    error_count = models.IntegerField(_("Error count"), default=0)

    class Meta:
        db_table = "api_stat"
        verbose_name = "Cavaliba API Stat"
        verbose_name_plural = "Cavaliba API Stats"
        indexes = [
            models.Index(fields=["keyname"]),
        ]

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