from django.db import models


class JobOffer(models.Model):
    """
    Offre d'emploi publiée par l'admin (Senegal Academy).
    Ex: "AVIS RECRUTEMENT - 2 stagiaires", poste, date limite, photo ou PDF obligatoire.
    """
    title = models.CharField(max_length=300, verbose_name="Titre (ex: AVIS RECRUTEMENT - 2 stagiaires)")
    post = models.CharField(max_length=255, verbose_name="Intitulé du poste")
    description = models.TextField(blank=True, default="", verbose_name="Description")
    deadline = models.DateField(verbose_name="Date limite de candidature")
    image = models.ImageField(upload_to="jobs/offers/", blank=True, null=True, verbose_name="Photo / image")
    document = models.FileField(upload_to="jobs/offers/", blank=True, null=True, verbose_name="Document PDF")
    is_active = models.BooleanField(default=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        ordering = ["-created_at"]
        verbose_name = "Offre d'emploi"
        verbose_name_plural = "Offres d'emploi"

    def __str__(self):
        return f"{self.title}"


class JobApplication(models.Model):
    """
    Candidature à une offre : infos candidat + CV + lettre de motivation.
    Génère un NUMERO DEPOT à la création ; envoi email de confirmation.
    """
    class Status(models.TextChoices):
        PENDING = "PENDING", "En attente"
        VALIDATED = "VALIDATED", "Validée"
        REJECTED = "REJECTED", "Non retenu"

    job_offer = models.ForeignKey(JobOffer, on_delete=models.CASCADE, related_name="applications")
    # Candidat
    first_name = models.CharField(max_length=150, verbose_name="Prénom")
    last_name = models.CharField(max_length=150, verbose_name="Nom")
    email = models.EmailField(verbose_name="Email")
    phone = models.CharField(max_length=50, verbose_name="Contact / Téléphone")
    address = models.CharField(max_length=255, verbose_name="Adresse")
    region = models.CharField(max_length=150, verbose_name="Région")
    # CV : fichier ou lien
    cv_file = models.FileField(upload_to="jobs/cvs/", blank=True, null=True, verbose_name="CV (PDF)")
    cv_url = models.URLField(blank=True, default="", verbose_name="Lien CV (URL)")
    # Lettre de motivation : texte ou PDF
    cover_letter_text = models.TextField(blank=True, default="", verbose_name="Lettre de motivation (texte)")
    cover_letter_file = models.FileField(upload_to="jobs/letters/", blank=True, null=True, verbose_name="Lettre de motivation (PDF)")
    # Suivi
    deposit_number = models.CharField(max_length=30, unique=True, editable=False, verbose_name="Numéro de dépôt")
    status = models.CharField(max_length=20, choices=Status.choices, default=Status.PENDING)
    start_date = models.DateField(blank=True, null=True, verbose_name="Date de début (si validée)")
    admin_notes = models.TextField(blank=True, default="", verbose_name="Notes admin")
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ["-created_at"]
        verbose_name = "Candidature"
        verbose_name_plural = "Candidatures"

    def __str__(self):
        return f"{self.deposit_number} - {self.last_name} {self.first_name}"

    def save(self, *args, **kwargs):
        if not self.deposit_number:
            from django.utils import timezone
            year = timezone.now().strftime("%Y")
            prefix = f"SA-{year}-"
            last = JobApplication.objects.filter(deposit_number__startswith=prefix).order_by("-id").first()
            if last:
                try:
                    num = int(last.deposit_number.replace(prefix, "")) + 1
                except ValueError:
                    num = 1
            else:
                num = 1
            self.deposit_number = f"{prefix}{num:05d}"
        super().save(*args, **kwargs)


class JobOfferSubscriber(models.Model):
    """
    Candidats ou visiteurs qui s'abonnent pour recevoir les nouvelles offres par email
    (sans être obligatoirement utilisateurs de la plateforme).
    """
    email = models.EmailField(unique=True, verbose_name="Email")
    subscribed = models.BooleanField(default=True, verbose_name="Abonné")
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        verbose_name = "Abonné offres d'emploi"
        verbose_name_plural = "Abonnés offres d'emploi"

    def __str__(self):
        return f"{self.email} ({'abonné' if self.subscribed else 'désabonné'})"
