from django.db import models
from django.utils import timezone

class DoctorRun(models.Model):
    """
    Un exécutable d'audit/restauration (migration_doctor).
    """
    created_at   = models.DateTimeField(default=timezone.now, db_index=True)
    app_label    = models.CharField(max_length=80, db_index=True)
    mode         = models.CharField(max_length=20, choices=[
        ("check", "check"), ("plan", "plan"), ("restore", "restore")
    ])
    ok_files     = models.BooleanField(default=False)
    ok_schema    = models.BooleanField(default=False)
    message      = models.TextField(blank=True, default="")   # résumé humain
    extra        = models.JSONField(default=dict, blank=True)  # stats diverses

    class Meta:
        indexes = [models.Index(fields=["created_at", "app_label", "mode"])]

    def __str__(self):
        return f"{self.created_at:%Y-%m-%d %H:%M} [{self.app_label}] {self.mode}"

class MigrationSnapshot(models.Model):
    """
    Instantané des migrations: côté fichiers ET côté DB (django_migrations).
    """
    run          = models.ForeignKey(DoctorRun, on_delete=models.CASCADE, related_name="migration_snaps")
    source       = models.CharField(max_length=10, choices=[("files","files"),("db","db")])  # files|db
    name         = models.CharField(max_length=150)  # ex: 0001_initial
    present      = models.BooleanField(default=True) # pour uniformité
    details      = models.JSONField(default=dict, blank=True)

    class Meta:
        indexes = [models.Index(fields=["run", "source", "name"])]

class TableSnapshot(models.Model):
    """
    Instantané des tables: côté 'model' (attendues) et côté 'db' (réelles).
    """
    run          = models.ForeignKey(DoctorRun, on_delete=models.CASCADE, related_name="table_snaps")
    source       = models.CharField(max_length=10, choices=[("model","model"),("db","db")])  # model|db
    table_name   = models.CharField(max_length=180, db_index=True)
    present      = models.BooleanField(default=True)
    details      = models.JSONField(default=dict, blank=True) # pk, fields, etc. (optionnel)

    class Meta:
        indexes = [models.Index(fields=["run", "source", "table_name"])]

class Finding(models.Model):
    """
    Une divergence ou information (warning/info/critical) trouvée par le doctor.
    """
    SEVERITY = [("info","info"), ("warning","warning"), ("critical","critical")]
    KIND = [
        ("missing_file", "Migration en DB mais pas de fichier"),
        ("unapplied_file", "Fichier présent mais pas appliqué"),
        ("absent_in_db", "Table attendue manquante en DB"),
        ("orphan_in_db", "Table orpheline en DB"),
        ("summary", "Résumé"),
    ]
    run          = models.ForeignKey(DoctorRun, on_delete=models.CASCADE, related_name="findings")
    severity     = models.CharField(max_length=10, choices=SEVERITY, db_index=True)
    kind         = models.CharField(max_length=32, choices=KIND, db_index=True)
    label        = models.CharField(max_length=180)                   # nom court (ex: 0003_..., translation_key…)
    details      = models.JSONField(default=dict, blank=True)         # données brutes utiles
    created_at   = models.DateTimeField(default=timezone.now)

    class Meta:
        indexes = [models.Index(fields=["run", "severity", "kind"])]
