from django.db import models
from django.contrib.auth.models import AbstractUser
import datetime
from dateutil.relativedelta import relativedelta

sexo_select = [
    (1, 'masculino'),
    (2, 'femenino'),
]

nacionalidad_select = [
    (1, 'v'),
    (2, 'e'),
]

# Create your models here
class Sucursal(models.Model):
    nombre    = models.CharField(max_length=150 , verbose_name='Sucursal')
    tlf       = models.CharField(max_length=150 , verbose_name='tlf', null=True, blank=True)
    direccion = models.CharField(max_length=250 , verbose_name='Direccion', null=True, blank=True)

    def __str__(self):
        return self.nombre
    
    class Meta:
        verbose_name_plural = 'Sucursales'
        ordering            = ['nombre']
        

class Banco(models.Model):
    nombre = models.CharField(max_length=150 , verbose_name='Banco')

    def __str__(self):
        return self.nombre

    class Meta:
        ordering = ['nombre']
    
class TipoCuenta(models.Model):
    nombre = models.CharField(max_length=150 , verbose_name='Tipo de Cuenta')

    def __str__(self):
        return self.nombre

    class Meta:
        verbose_name        = 'tipo de cuenta'
        verbose_name_plural = 'tipos de cuentas'

class User(AbstractUser):
    created        = models.DateTimeField(auto_now_add=True, verbose_name='Fecha de creación')
    updated        = models.DateTimeField(auto_now=True, verbose_name='Fecha de edición')
    nacionalidad   = models.IntegerField(nacionalidad_select, default=1)
    cedula         = models.IntegerField(verbose_name='Cédula', null = True)
    civ            = models.IntegerField(verbose_name='CIV', null = True)
    nacimiento     = models.DateField(verbose_name='Fecha de Nacimiento', null = True)
    sexo           = models.IntegerField(choices=sexo_select, default=1)
    sucursal       = models.ForeignKey(Sucursal, verbose_name="Sucursal", on_delete=models.CASCADE, default=1622)
    direccion      = models.TextField(verbose_name='Dirección', null = True)
    tlf1           = models.CharField(max_length=50 , verbose_name='Teléfono 1', null = True, blank = True)
    tlf2           = models.CharField(max_length=50 , verbose_name='Teléfono 2', null = True, blank = True)
    banco          = models.ForeignKey(Banco, verbose_name="Banco", on_delete=models.CASCADE, null = True, blank = True)
    tipo_cuenta    = models.ForeignKey(TipoCuenta, verbose_name="Tipo de Cuenta", on_delete=models.CASCADE, null = True)
    cuenta         = models.CharField(max_length=150 , verbose_name='Número de Cuenta', null = True, blank = True)
    fallecido      = models.BooleanField(verbose_name='¿Fallecido?', default=False)
    user_edit      = models.ForeignKey('self', on_delete=models.CASCADE, related_name="get_editor", null = True)
    notificaciones = models.BooleanField(verbose_name='¿Enviar comunicados?', default=True)

    def __str__(self):
        return self.first_name + ' ' + self.last_name if self.first_name else self.username

    class Meta:
        ordering = ['pk']
    

class Parentesco(models.Model):
    nombre = models.CharField(max_length=150 , verbose_name='Parentesco')

    def __str__(self):
        return self.nombre
    
    class Meta:
        ordering = ['pk']
    
class Beneficiario(models.Model):
    agremiado    = models.ForeignKey(User, limit_choices_to={'is_active': True, 'fallecido': False}, verbose_name="Agremiado", on_delete=models.CASCADE, related_name="get_beneficiarios")
    parentesco   = models.ForeignKey(Parentesco, verbose_name="Parentesco", on_delete=models.CASCADE)
    nacionalidad = models.IntegerField(choices=nacionalidad_select, default=1)
    sexo         = models.IntegerField(choices=sexo_select, default=1)
    cedula       = models.IntegerField(verbose_name='Cédula')
    nombre       = models.CharField(max_length=150 , verbose_name='Nombre')
    apellido     = models.CharField(max_length=150 , verbose_name='Apellido')
    nacimiento   = models.DateField(verbose_name='Fecha de Nacimiento')
    fallecido    = models.BooleanField(default=False)

    def __str__(self):
        return self.nombre + ' ' + self.apellido

    def edad(self):
        return int((datetime.now().date() - self.nacimiento).days / 365.25)

    def edad_actuarial(self):
        return int(((datetime.now() + relativedelta(days=20)).date() - self.nacimiento).days / 365.25)

    class Meta:
        ordering = ['parentesco']

class Nota(models.Model):
    created   = models.DateTimeField(auto_now_add=True, verbose_name='Fecha de Registro', null=True)
    updated   = models.DateTimeField(auto_now=True, verbose_name='Fecha de Edición')
    usuario   = models.ForeignKey(User, verbose_name="Usuario", on_delete=models.CASCADE, related_name="get_misnotas")
    agremiado = models.ForeignKey(User, verbose_name="Usuario", on_delete=models.CASCADE, related_name="get_notas")
    nota      = models.TextField(verbose_name='Notas', null = True)

    def __str__(self):
        return self.nota
    
    class Meta:
        ordering = ['-pk']