from django.db import models
from datetime import datetime
# Create your models here.
from django_userforeignkey.models.fields import UserForeignKey
from django.contrib.auth import get_user_model  # Para tomar el usuario
from django.utils.translation import gettext_lazy as _  # Traduccion

user = get_user_model()  # Toma el usuario

# Definiendo permisos de acceso
NO = 0
READ = 1
WRITE = 2

ACCESS = (  # Permisos de acceso
    (NO, _('No access')),  # Sin permisos
    (READ, _('Only read')),  # Solo lectura
    (WRITE, _('Read & write')),  # Lectura y escritura
)


class T001_BUSINESS(models.Model):
    """Tabla de clientes y unidades de negocio
    Un cliente puede tener varias unidades de negocio"""
    # Campos
    pater = models.ForeignKey('self', on_delete=models.SET_NULL,
                              blank=True, null=True,
                              help_text=_("Nested with PATER"))
    code = models.CharField(max_length=50, blank=True, null=True,
                            help_text=_("Code"))
    alias = models.CharField(max_length=25, unique=True,
                             help_text=_("Short name"))
    name = models.CharField(max_length=50, help_text=_("Name"))
    detail = models.TextField(max_length=250, help_text=_("Detail"))
    order0 = models.IntegerField(default=0, help_text=_("Order 0"))
    order1 = models.IntegerField(default=0, help_text=_("Order 1"))
    order2 = models.IntegerField(default=0, help_text=_("Order 2"))
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    created_by = UserForeignKey(
        auto_user_add=True, on_delete=models.SET_NULL, blank=True, null=True,
        verbose_name=_("The user that is automatically assigned"),
        related_name="business_created_by")
    updated_by = UserForeignKey(
        auto_user=True, on_delete=models.SET_NULL, blank=True, null=True,
        verbose_name=_("The user that is automatically assigned"),
        related_name="business_updated_by")
    enabled = models.BooleanField(default=True)

    # Metadata
    class Meta:
        ordering = ["alias"]
        #db_table = 'business'

    # Métodos
    def __str__(self):
        return '{} <- ({})'.format(self.alias, self.pater)


class T002_GOB(models.Model):
    """Tabla de grupo de usuarios del negocio,
    los que gobiernan partes del negocio"""

    # Campos
    business = models.ForeignKey(T001_BUSINESS, on_delete=models.SET_NULL,
                                 blank=True, null=True,
                                 verbose_name=_('Client/Business Unit'))
    code = models.CharField(max_length=50, blank=True, null=True,
                            help_text=_("Code"))
    alias = models.CharField(max_length=25, unique=True,
                             help_text=_("Short name"))
    name = models.CharField(max_length=50, help_text=_("Name"))
    detail = models.TextField(max_length=250, help_text=_("Detail"))
    order0 = models.IntegerField(default=0, help_text=_("Order 0"))
    order1 = models.IntegerField(default=0, help_text=_("Order 1"))
    order2 = models.IntegerField(default=0, help_text=_("Order 2"))
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    created_by = UserForeignKey(
        auto_user_add=True, on_delete=models.SET_NULL, blank=True, null=True,
        verbose_name=_("The user that is automatically assigned"),
        related_name="gob_created_by")
    updated_by = UserForeignKey(
        auto_user=True, on_delete=models.SET_NULL, blank=True, null=True,
        verbose_name=_("The user that is automatically assigned"),
        related_name="gob_updated_by")
    enabled = models.BooleanField(default=True)
    access = models.IntegerField(choices=ACCESS, default=2)

    # Metadata
    class Meta:
        ordering = ["alias"]

    # Métodos
    def __str__(self):
        return '{} <- ({})'.format(self.alias, self.business)


class T003_AUXILIAR(models.Model):
    """Tabla para tablas auxiliares"""

    # Definiendo TIPOS
    CLASES = 0
    CAMPOS = 1

    TIPO = (  # Permisos de acceso
        (CLASES, 'Clasificacion-elegir'),  # Clasificaciones para elegir
        (CAMPOS, 'Campos-entrada'),  # Campos de entradas de datos
    )

    # Campos
    governances = models.ManyToManyField(T002_GOB,
                                         help_text=_('Groups of Gobernance'))
    pater = models.ForeignKey('self', on_delete=models.SET_NULL,
                              blank=True, null=True,
                              help_text=_('Nested with PATER'))
    code = models.CharField(max_length=50, blank=True, null=True,
                            help_text=_("Code"))
    alias = models.CharField(max_length=25, unique=True,
                             help_text=_("Short name"))
    name = models.CharField(max_length=50, help_text=_("Name"))
    detail = models.TextField(max_length=250, help_text=_("Detail"))
    order0 = models.IntegerField(default=0, help_text=_("Order 0"))
    order1 = models.IntegerField(default=0, help_text=_("Order 1"))
    order2 = models.IntegerField(default=0, help_text=_("Order 2"))
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    created_by = UserForeignKey(
        auto_user_add=True, on_delete=models.SET_NULL, blank=True, null=True,
        verbose_name=_("The user that is automatically assigned"),
        related_name="auxiliar_created_by")
    updated_by = UserForeignKey(
        auto_user=True, on_delete=models.SET_NULL, blank=True, null=True,
        verbose_name=_("The user that is automatically assigned"),
        related_name="auxiliar_updated_by")
    enabled = models.BooleanField(default=True)
    access = models.IntegerField(choices=ACCESS, default=2)
    type = models.IntegerField(choices=TIPO, default=0)

    # Metadata
    class Meta:
        ordering = ["alias"]

    # Métodos
    def __str__(self):
        return '{} <- ({})'.format(self.alias, self.pater)


class T004_CLASSFIELD(models.Model):
    """ Tabla CLASES o CAMPOS de las tablas auxiliares """

    # Definiendo TIPOS
    NO = 0
    ENTERO = 1
    DECIMAL = 2
    FECHAHORA = 3
    FECHA = 4
    HORA = 5
    TEXTOCORTO = 6
    TEXTOLARGO = 7
    BOOLEAN = 8
    BINARIO = 9

    TIPO = (  # Permisos de acceso
        (NO, _('No type')),  # Sin tipo de campo
        (ENTERO, _('Integer number')),
        (DECIMAL, _('Decimal number')),
        (FECHAHORA, _('DateTime')),
        (FECHA, _('Date')),
        (HORA, _('Time')),
        (TEXTOCORTO, _('Text(50)')),
        (TEXTOLARGO, _('Text(250)')),
        (BOOLEAN, _('Boolean')),
        (BINARIO, _('Binary')),
    )

    # Campos
    auxiliars = models.ManyToManyField(T003_AUXILIAR,
                                       help_text=_('Auxiliar parameters tables'))
    pater = models.ForeignKey('self', on_delete=models.SET_NULL,
                              blank=True, null=True,
                              help_text=_('Nested with PATER'))
    code = models.CharField(max_length=50, blank=True, null=True,
                            help_text=_("Code"))
    alias = models.CharField(max_length=25, unique=True,
                             help_text=_("Short name"))
    name = models.CharField(max_length=50, help_text=_("Name"))
    detail = models.TextField(max_length=250, help_text=_("Detail"))
    order0 = models.IntegerField(default=0, help_text=_("Order 0"))
    order1 = models.IntegerField(default=0, help_text=_("Order 1"))
    order2 = models.IntegerField(default=0, help_text=_("Order 2"))
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    created_by = UserForeignKey(
        auto_user_add=True, on_delete=models.SET_NULL, blank=True, null=True,
        verbose_name=_("The user that is automatically assigned"),
        related_name="classfield_created_by")
    updated_by = UserForeignKey(
        auto_user=True, on_delete=models.SET_NULL, blank=True, null=True,
        verbose_name=_("The user that is automatically assigned"),
        related_name="classfield_updated_by")
    enabled = models.BooleanField(default=True)
    access = models.IntegerField(choices=ACCESS, default=2)
    type_field = models.IntegerField(choices=TIPO, default=0)

    # Metadata
    class Meta:
        ordering = ["alias"]
        # unique_together = ("auxiliars", 'self') no permitido

    # Métodos
    def __str__(self):
        return '{} <- ({})'.format(self.alias, self.pater)


class T005_GROUPCLASSFIELD(models.Model):
    """ Grupos de clases o campos"""

    name = models.CharField(max_length=128, help_text=_('Group name'))
    members = models.ManyToManyField(T004_CLASSFIELD,
                                     help_text=_('Class or Field relationship'))
    # Métodos

    def __str__(self):
        return self.name


class T100_INVENTORY(models.Model):
    """ Tabla de inventario"""

    classfields = models.ManyToManyField(T004_CLASSFIELD,
                                         help_text=_('Classes or Fields relationship'))

    pater = models.ForeignKey('self', on_delete=models.SET_NULL,
                              blank=True, null=True,
                              help_text=_('Nested with PATER'))
    date = models.DateTimeField(default=datetime.now,
                                help_text=_('Date Time'))
    code = models.CharField(max_length=50, blank=True, null=True,
                            help_text=_("Code"))
    alias = models.CharField(max_length=25, unique=True,
                             help_text=_("Short name"))
    name = models.CharField(max_length=50, help_text=_("Name"))
    detail = models.TextField(max_length=250, help_text=_("Detail"))
    order0 = models.IntegerField(default=0, help_text=_("Order 0"))
    order1 = models.IntegerField(default=0, help_text=_("Order 1"))
    order2 = models.IntegerField(default=0, help_text=_("Order 2"))
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    created_by = UserForeignKey(
        auto_user_add=True, on_delete=models.SET_NULL, blank=True, null=True,
        verbose_name=_("The user that is automatically assigned"),
        related_name="inventory_created_by")
    updated_by = UserForeignKey(
        auto_user=True, on_delete=models.SET_NULL, blank=True, null=True,
        verbose_name=_("The user that is automatically assigned"),
        related_name="inventory_updated_by")
    enabled = models.BooleanField(default=True)

    # Metadata
    class Meta:
        ordering = ["alias"]

    # Métodos
    def __str__(self):
        return '{} <- ({})'.format(self.alias, self.pater)

    def get_absolute_url(self):
        return reverse('ohathor:inventory-detail', kwargs={'pk': self.pk})
