from django.db import models
from traduction.helpers import TranslatableMixin


class ContactInfo(TranslatableMixin, models.Model):
    """Informations de contact par departement"""
    DEPARTMENT_TYPES = [
        ('general', 'Contact general'),
        ('admissions', 'Admissions'),
        ('scholarships', 'Bourses'),
        ('partnerships', 'Partenariats'),
        ('research', 'Recherche'),
    ]

    department_name = models.CharField('Nom du departement', max_length=100)
    department_type = models.CharField('Type', max_length=20, choices=DEPARTMENT_TYPES, unique=True)

    email = models.EmailField('Email principal')
    secondary_email = models.EmailField('Email secondaire', blank=True)
    phone = models.CharField('Telephone', max_length=30, blank=True)
    fax = models.CharField('Fax', max_length=30, blank=True)

    address_line1 = models.CharField('Adresse ligne 1', max_length=200, blank=True)
    address_line2 = models.CharField('Adresse ligne 2', max_length=200, blank=True)
    city = models.CharField('Ville', max_length=100, blank=True)
    postal_code = models.CharField('Code postal', max_length=20, blank=True)
    country = models.CharField('Pays', max_length=100, blank=True)

    office_hours = models.CharField('Heures d\'ouverture', max_length=200, blank=True)

    order = models.PositiveIntegerField('Ordre', default=0)
    is_active = models.BooleanField('Actif', default=True)

    class Meta:
        verbose_name = 'Information de contact'
        verbose_name_plural = 'Informations de contact'
        ordering = ['order']

    def __str__(self):
        return self.get_translated('department_name') or self.department_name

    @property
    def full_address(self):
        parts = [self.address_line1, self.address_line2, f"{self.postal_code} {self.city}", self.country]
        return ', '.join(p for p in parts if p.strip())


class ContactMessage(models.Model):
    """Messages recus via le formulaire de contact"""
    SUBJECT_CHOICES = [
        ('admissions', 'Admissions'),
        ('scholarships', 'Bourses'),
        ('program', 'Programme'),
        ('research', 'Recherche'),
        ('partnership', 'Partenariat'),
        ('other', 'Autre'),
    ]

    STATUS_CHOICES = [
        ('new', 'Nouveau'),
        ('read', 'Lu'),
        ('replied', 'Repondu'),
        ('closed', 'Clos'),
    ]

    first_name = models.CharField('Prenom', max_length=100)
    last_name = models.CharField('Nom', max_length=100)
    email = models.EmailField('Email')
    phone = models.CharField('Telephone', max_length=30, blank=True)

    subject_category = models.CharField('Sujet', max_length=20, choices=SUBJECT_CHOICES)
    subject = models.CharField('Objet', max_length=200)
    message = models.TextField('Message')

    submission_date = models.DateTimeField('Date de soumission', auto_now_add=True)
    status = models.CharField('Statut', max_length=20, choices=STATUS_CHOICES, default='new')

    assigned_to = models.ForeignKey(
        'team.Person',
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        related_name='assigned_messages',
        verbose_name='Assigne a'
    )

    response_text = models.TextField('Reponse', blank=True)
    response_date = models.DateTimeField('Date de reponse', blank=True, null=True)

    ip_address = models.GenericIPAddressField('Adresse IP', blank=True, null=True)
    user_agent = models.TextField('User Agent', blank=True)

    class Meta:
        verbose_name = 'Message'
        verbose_name_plural = 'Messages'
        ordering = ['-submission_date']

    def __str__(self):
        return f"{self.first_name} {self.last_name} - {self.subject}"

    @property
    def full_name(self):
        return f"{self.first_name} {self.last_name}"


class UniversityContact(models.Model):
    """Contacts par universite"""
    university = models.ForeignKey(
        'universities.University',
        on_delete=models.CASCADE,
        related_name='contacts',
        verbose_name='Universite'
    )

    contact_person = models.CharField('Personne de contact', max_length=200)
    title = models.CharField('Titre/Fonction', max_length=200, blank=True)
    email = models.EmailField('Email')
    phone = models.CharField('Telephone', max_length=30, blank=True)

    department = models.CharField('Departement', max_length=200, blank=True)
    office = models.CharField('Bureau', max_length=100, blank=True)

    is_primary = models.BooleanField('Contact principal', default=False)
    order = models.PositiveIntegerField('Ordre', default=0)

    class Meta:
        verbose_name = 'Contact universite'
        verbose_name_plural = 'Contacts universites'
        ordering = ['university', '-is_primary', 'order']

    def __str__(self):
        return f"{self.contact_person} - {self.university.abbreviation or self.university.name}"


class NewsletterSubscriber(models.Model):
    """Abonnes a la newsletter"""
    email = models.EmailField('Email', unique=True)
    first_name = models.CharField('Prenom', max_length=100, blank=True)
    last_name = models.CharField('Nom', max_length=100, blank=True)

    subscription_date = models.DateTimeField('Date d\'inscription', auto_now_add=True)
    is_active = models.BooleanField('Actif', default=True)
    is_verified = models.BooleanField('Verifie', default=False)

    verification_token = models.CharField('Token de verification', max_length=100, blank=True)
    unsubscribe_token = models.CharField('Token de desinscription', max_length=100, blank=True)

    ip_address = models.GenericIPAddressField('Adresse IP', blank=True, null=True)

    class Meta:
        verbose_name = 'Abonne newsletter'
        verbose_name_plural = 'Abonnes newsletter'
        ordering = ['-subscription_date']

    def __str__(self):
        return self.email
