"""Profiles models."""

from django.db import models
from django.shortcuts import reverse
from dry_rest_permissions.generics import authenticated_users
from .utils import get_promotion_range
from datetime import datetime
from .notifications import SendDocs

import telegram
from django.conf import settings
from django.template.loader import render_to_string


class ProfileMixin:
    """Mixin with common functionnality for profiles."""

    detail_view_name = None

    def __str__(self):
        """Represent with full name or email."""
        full_name = self.user.get_full_name()
        if full_name:
            return full_name
        return self.user.email

    def get_absolute_url(self):
        return reverse(self.detail_view_name, args=[self.pk])

    @staticmethod
    @authenticated_users
    def has_read_permission(request):
        return True

    @authenticated_users
    def has_object_read_permission(self, request):
        return True


class Student(ProfileMixin, models.Model):
    """Represents a student profile."""

    detail_view_name = 'api:student-detail'

    updated_date = models.DateTimeField(auto_now=True)

    user = models.OneToOneField(
        'users.User',
        on_delete=models.CASCADE,
        null=True,
        verbose_name='utilisateur',
        related_name='student')

    registration = models.OneToOneField(
        'register.Registration',
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        verbose_name="dossier d'inscription",
        related_name='student',
    )

    classType = models.CharField(max_length=50,
                                 null=True,
                                 blank=True,
                                 verbose_name="général/techno",
                                 )

    nationality = models.CharField(max_length=50,
                                   null=True,
                                   blank=True,
                                   verbose_name="nationalité",
                                   )

    specialTeaching = models.CharField(max_length=50,
                                       null=True,
                                       blank=True,
                                       verbose_name="enseignement de spécialité",
                                       )

    zipCode = models.CharField(max_length=10,
                               null=True,
                               blank=True,
                               verbose_name="code postal",
                               )

    gender = models.CharField(max_length=20,
                              null=True,
                              blank=True,
                              verbose_name="genre",
                              )

    addressNumber = models.IntegerField(
        null=True,
        blank=True,
        verbose_name="numéro de rue"
    )

    street = models.CharField(max_length=70,
                              null=True,
                              blank=True,
                              verbose_name="nom de rue"
                              )

    city = models.CharField(max_length=50,
                            null=True,
                            blank=True,
                            verbose_name="nom de ville"
                            )

    personalPhone = models.CharField(max_length=12,
                                     null=True,
                                     blank=True,
                                     verbose_name="numéro de téléphone personnel"
                                     )

    parentsPhone = models.CharField(max_length=12,
                                    null=True,
                                    blank=True,
                                    verbose_name="numéro de téléphone parental"
                                    )

    parentsEmail = models.EmailField(max_length=70,
                                     null=True,
                                     blank=True,
                                     verbose_name="adresse mail parentale"
                                     )

    school = models.CharField(max_length=70,
                              null=True,
                              blank=True,
                              verbose_name="établissement"
                              )

    grade = models.CharField(max_length=20,
                             null=True,
                             blank=True,
                             verbose_name="niveau de la classe"
                             )

    scholarship = models.CharField(max_length=50,
                                   null=True,
                                   blank=True,
                                   verbose_name="boursier"
                                   )

    fatherActivity = models.CharField(max_length=70,
                                      null=True,
                                      blank=True,
                                      verbose_name="métier du père"
                                      )

    motherActivity = models.CharField(max_length=70,
                                      null=True,
                                      blank=True,
                                      verbose_name="métier de la mère"
                                      )

    parentsStatus = models.CharField(max_length=70,
                                     null=True,
                                     blank=True,
                                     verbose_name="statut des parents"
                                     )

    dependantsNumber = models.IntegerField(
        null=True,
        blank=True,
        verbose_name="nombre de personnes à charge"
    )

    year = models.CharField(max_length=10,
                            null=True,
                            blank=True,
                            verbose_name="année"
                            )

    @staticmethod
    def has_write_permission(request):
        return True

    def has_object_write_permission(self, request):
        return request.user == self.user

    def save(self, *args, **kwargs):
        """Updates the year field based on the last modified date"""
        if self.city != None:  # Ne mettre à jour que quand les données personnelles sont remplies
            date_now = datetime.now()
            if date_now.month >= 9:
                self.year = f"{date_now.year}/{date_now.year+1}"
            else:
                self.year = f"{date_now.year-1}/{date_now.year}"

            # send email with link to registration docs
            SendDocs(user=self.user).send()

            # send a telegram message to oserSECGEN
            telegram_settings = settings.TELEGRAM
            if telegram_settings['bot_token'] != None:
                message_telegram = "Un tutoré a renseigné ses données personnelles, il attend ta validation !"
                bot = telegram.Bot(token=telegram_settings['bot_token'])
                bot.send_message(
                    chat_id="@%s" % telegram_settings['channel_name'], text=message_telegram, parse_mode=telegram.ParseMode.HTML)

        return super(Student, self).save(*args, **kwargs)

    class Meta:  # noqa
        verbose_name = 'lycéen'


class Tutor(ProfileMixin, models.Model):
    """Represents a tutor profile."""

    detail_view_name = 'api:tutor-detail'

    user = models.OneToOneField(
        'users.User',
        on_delete=models.CASCADE,
        null=True,
        verbose_name='utilisateur',
        related_name='tutor')

    address = models.OneToOneField(
        'core.Address',
        on_delete=models.SET_NULL,
        null=True,
        verbose_name='adresse',
        related_name='tutor')

    PROMOTION_CHOICES = tuple(
        (year, str(year)) for year in get_promotion_range()
    )
    promotion = models.IntegerField(choices=PROMOTION_CHOICES,
                                    default=PROMOTION_CHOICES[0][0])

    class Meta:  # noqa
        verbose_name = 'tuteur'