from django.db import models

from django.contrib.auth.models import AbstractUser

from datetime import date
from datetime import datetime

# from datetime import timedelta
# from django.utils import timezone

# def plus_one_day():
#     return timezone.now() + timedelta(days=1)


class CustomUser(AbstractUser):
    # Numero de telephone
    phone = models.CharField(max_length=20, null=True, blank=True)
    
    is_admin = models.BooleanField(default=False)
    is_manager = models.BooleanField(default=False)
    is_worker = models.BooleanField(default=False)
    code_structure = models.CharField(max_length=20, null=True, blank=True)


class Structure(models.Model):
    name = models.CharField(max_length=200)
    code = models.CharField(max_length=20, null=True, blank=True)
    description = models.TextField(null=True, blank=True)

    updated = models.DateTimeField(auto_now=True)
    created = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.name


class Motif(models.Model):
    name = models.CharField(max_length=200)

    updated = models.DateTimeField(auto_now=True)
    created = models.DateTimeField(auto_now_add=True)
    # updated = models.DateTimeField(default=datetime.datetime.now)
    # created = models.DateTimeField(default=datetime.datetime.now)

    def __str__(self):
        return self.name


class MissionCategory(models.Model):
    name = models.CharField(max_length=200)
    description = models.TextField(null=True, blank=True)
    updated = models.DateTimeField(auto_now=True)
    created = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.name


class StatutCategory(models.Model):
    name = models.CharField(max_length=200)
    description = models.TextField(null=True, blank=True)
    updated = models.DateTimeField(auto_now=True)
    created = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.name

class Service(models.Model):
    name = models.CharField(max_length=200)
    description = models.TextField(null=True, blank=True)
    updated = models.DateTimeField(auto_now=True)
    created = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.name

class Metier(models.Model):
    name = models.CharField(max_length=200)
    description = models.TextField(null=True, blank=True)
    updated = models.DateTimeField(auto_now=True)
    created = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.name


class ProfilRecherche(models.Model):
    name = models.CharField(max_length=200)

    updated = models.DateTimeField(auto_now=True)
    created = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.name


class Competence(models.Model):
    name = models.CharField(max_length=200)

    updated = models.DateTimeField(auto_now=True)
    created = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.name


class Worker(models.Model):
    # A worker is a specific user
    user = models.OneToOneField(
        CustomUser,
        on_delete=models.CASCADE,
        primary_key=True,
    )

    # Etablissement
    structure = models.ForeignKey(
        Structure, on_delete=models.SET_NULL, null=True, blank=True)

    # Statut Salarie/Agent de l'établissement ou Vacataire externe
    statut = models.ForeignKey(
        StatutCategory, on_delete=models.SET_NULL, null=True, blank=True)

    # Matricule
    matricule = models.CharField(max_length=10, null=True, blank=True)

    # Un ou plusieurs métiers (oneToMany ?)
    metiers = models.ForeignKey(
        Metier, on_delete=models.SET_NULL, null=True, blank=True)

    # Une ou plusieurs compétences (oneToMany ?)
    competences = models.ForeignKey(
        Competence, on_delete=models.SET_NULL, null=True, blank=True)

    # working hours
    day = models.BooleanField(default=False)
    night = models.BooleanField(default=False)

    # Ensemble des structures ou il est habilite
    structures_allowed = models.ManyToManyField(
        Structure, null=True, blank=True, related_name='structures_allowed_worker')


    # Profile picture
    profile_pic = models.ImageField(default="doctor_3.png", null=True, blank=True)

    # Cv
    cv = models.FileField(upload_to='images/worker_cv/', null=True, blank=True, default='images/worker_cv/CV_Fictif_ParBa_Default.pdf')
    # default='settings.MEDIA_ROOT/logos/anonymous.jpg
    
    def __str__(self):
        return self.user.username


class Mission(models.Model):
    referenceNumber = models.CharField(max_length=30, default='toto', null=True,  blank=True)
    available = models.BooleanField(default=True)
    # type = models.CharField(max_length=20)
    type = models.ForeignKey(
        MissionCategory, on_delete=models.SET_NULL, null=True, default=1)
    # structure = models.CharField(max_length=200)
    structure = models.ForeignKey(
        Structure, on_delete=models.SET_NULL, null=True)
    # service = models.CharField(max_length=200, null=True, blank=True)
    service = models.ForeignKey(
        Service, on_delete=models.SET_NULL, null=True)
    
    # start = models.DateTimeField()
    # finish = models.DateTimeField()
    startDate = models.DateField(default=date.today)
    finishDate = models.DateField(default=date.today)
    startTime = models.TimeField(default=datetime.now())
    finishTime = models.TimeField(default=datetime.now())

    # profile = models.CharField(max_length=200)
    profil = models.ForeignKey(
        Metier, on_delete=models.SET_NULL, null=True)
    motif = models.ForeignKey(Motif, on_delete=models.SET_NULL, null=True)
    # motif = models.TextField(null=True, blank=True)
    # worker = models.CharField(max_length=200)  # foreign Key
    worker = models.ForeignKey(
        Worker, on_delete=models.SET_NULL, null=True, blank=True,  related_name='chosenWorker')
    candidates = models.ManyToManyField(
        Worker, null=True, blank=True, related_name='candidates')
    # related_name means a worker have candidates to access to all missions
    administrator = models.ForeignKey(CustomUser, on_delete=models.SET_NULL, null=True, blank=True)
    updated = models.DateTimeField(auto_now=True)
    created = models.DateTimeField(auto_now_add=True)
    assigned = models.DateTimeField(null=True, blank=True)
    isCancelled = models.BooleanField(default=False)
    # name = models.CharField(max_length=200)
    # description = models.TextField(null=True, blank=True)
    isExpress = models.BooleanField(default=False)

    # Personne a remplacer
    replacedFirstName = models.CharField(max_length=30, null=True,  blank=True)
    replacedLastName = models.CharField(max_length=30, null=True,  blank=True)

    class Meta:
        ordering = ['-updated', '-created']

    def __str__(self):
        return self.referenceNumber
