from django.db import models
from django.core.validators import MinValueValidator, MaxValueValidator


class fox_atributo(models.Model):
    clave_ley = models.FloatField()
    nro_campo = models.FloatField()
    tipo_campo = models.CharField(max_length=1)
    nom_campo = models.CharField(max_length=8)
    tabla = models.CharField(max_length=8)
    descrip = models.CharField(max_length=8)
    ubicacion = models.CharField(max_length=8)
    abm = models.CharField(max_length=1)
    usu_comun = models.CharField(max_length=1)
    rel = models.CharField(max_length=1,null=True)
    pg_rel = models.CharField(max_length=1,null=True)
    nivel_inf = models.CharField(max_length=1,null=True)
    p_lisrela = models.FloatField()

    def __str__(self):
        return f"{self.clave_ley} - {self.nro_campo}"

class fox_descripc(models.Model):
    codigon = models.IntegerField(primary_key=True)  # NOT NULL
    descrip = models.CharField(max_length=60, null=True, blank=True)
    descrip_2 = models.CharField(max_length=30, null=True, blank=True)
    sub_linea = models.IntegerField(null=True, blank=True)
    tipo_subl = models.IntegerField(null=True, blank=True)
    division = models.IntegerField(null=True, blank=True)
    sub_divi = models.IntegerField(null=True, blank=True)
    categoria = models.IntegerField(null=True, blank=True)
    linea = models.CharField(max_length=3, null=True, blank=True)
    canal = models.CharField(max_length=3, null=True, blank=True)
    lista = models.CharField(max_length=3, null=True, blank=True)
    vigencia = models.CharField(max_length=3, null=True, blank=True)
    proc = models.CharField(max_length=3, null=True, blank=True)
    origen = models.CharField(max_length=6, null=True, blank=True)
    apertura = models.CharField(max_length=6, null=True, blank=True)
    camplanz = models.CharField(max_length=6, null=True, blank=True)
    campbaja = models.CharField(max_length=6, null=True, blank=True)
    consig = models.CharField(max_length=4, null=True, blank=True)
    marca = models.CharField(max_length=4, null=True, blank=True)
    pr_normal = models.CharField(max_length=5, null=True, blank=True)
    talle = models.CharField(max_length=3, null=True, blank=True)
    empresa = models.CharField(max_length=2, null=True, blank=True)
    mul_emp = models.CharField(max_length=3, null=True, blank=True)
    grupo_fabr = models.IntegerField(null=True, blank=True)
    elaborac = models.IntegerField(null=True, blank=True)
    provdor = models.IntegerField(null=True, blank=True)
    forma_pt = models.CharField(max_length=4, null=True, blank=True)
    cod_medi = models.CharField(max_length=6, null=True, blank=True)
    peso = models.CharField(max_length=9, null=True, blank=True)
    alto = models.CharField(max_length=7, null=True, blank=True)
    largo = models.CharField(max_length=7, null=True, blank=True)
    ancho = models.CharField(max_length=7, null=True, blank=True)
    volumen = models.CharField(max_length=11, null=True, blank=True)
    segmento = models.CharField(max_length=10, null=True, blank=True)
    det_color = models.CharField(max_length=10, null=True, blank=True)
    material = models.CharField(max_length=10, null=True, blank=True)
    coleccion = models.IntegerField(null=True, blank=True)
    caracteris = models.IntegerField(null=True, blank=True)
    pto_precio = models.IntegerField(null=True, blank=True)
    packaging = models.IntegerField(null=True, blank=True)
    envase_2do = models.IntegerField(null=True, blank=True)
    sexo = models.IntegerField(null=True, blank=True)
    target = models.IntegerField(null=True, blank=True)
    con_compra = models.CharField(max_length=3, null=True, blank=True)
    concepto = models.CharField(max_length=3, null=True, blank=True)
    mar_combi = models.CharField(max_length=1, null=True, blank=True)
    mar_doble = models.CharField(max_length=1, null=True, blank=True)
    cuotas = models.CharField(max_length=3, null=True, blank=True)
    id_espe = models.CharField(max_length=10, null=True, blank=True)
    estado = models.CharField(max_length=10, null=True, blank=True)
    fecha_alta = models.CharField(max_length=10, null=True, blank=True)
    digver = models.IntegerField(null=True, blank=True)

    def __str__(self):
        return f"descripc: {self.codigon}"


class fox_leyendas(models.Model):
    clave_camp = models.IntegerField()
    clave = models.IntegerField(unique=True)
    leyenda = models.TextField(blank=True, null=True)
    computable = models.CharField(max_length=1, blank=True, null=True) 
    abrev = models.CharField(max_length=100, blank=True, null=True) 

    def __str__(self):
        return f"descripc: {self.clave_camp}"


class fox_r_tiposb(models.Model):
    sublinea_clave = models.IntegerField(null=True,blank=True)
    tiposb_clave = models.IntegerField(null=True,blank=True)
    def __str__(self):
        return f"descripc: {self.sublinea_clave}"


class fox_a_tiposb(models.Model):
    clave = models.IntegerField(primary_key=True)
    leyenda = models.CharField(max_length=100)
    is_active = models.BooleanField(default=True)
    def __str__(self):
        return f"descripc: {self.clave}"
    


class fox_r_caract(models.Model):
    sublinea_clave = models.IntegerField(null=True,blank=True)
    caract_clave = models.IntegerField(null=True,blank=True)

    def __str__(self):
        return f"descripc: {self.sublinea_clave}"

    


class fox_a_caract(models.Model):
    clave = models.IntegerField(primary_key=True)
    leyenda = models.CharField(max_length=100)
    is_active = models.BooleanField(default=True)
    def __str__(self):
        return f"descripc: {self.clave}"


class fox_a_segmto(models.Model):
    clave = models.IntegerField(primary_key=True)
    leyenda = models.CharField(max_length=100)

    def __str__(self):
        return f"descripc: {self.clave}"
    

class fox_a_concom(models.Model):
    clave = models.IntegerField(primary_key=True)
    leyenda = models.CharField(max_length=100)

    def __str__(self):
        return f"descripc: {self.clave}"
    


class fox_a_materl(models.Model):
    clave = models.IntegerField(primary_key=True)
    leyenda = models.CharField(max_length=100)

    def __str__(self):
        return f"descripc: {self.clave}"
    

class fox_a_color(models.Model):
    clave = models.IntegerField(primary_key=True)
    leyenda = models.CharField(max_length=100)

    def __str__(self):
        return f"descripc: {self.clave}"
    

class fox_a_linea(models.Model):
    clave = models.IntegerField(primary_key=True)
    leyenda = models.CharField(max_length=100)
    especial = models.CharField(max_length=10,blank=True, null=True)
    is_active = models.BooleanField(default=True)
    def __str__(self):
        return f"descripc: {self.clave}"


class fox_r_sublinea(models.Model):
    categoria = models.IntegerField(null=True,blank=True)
    sublinea_clave = models.IntegerField(null=True,blank=True)
    def __str__(self):
        return f"{self.categoria} - {self.sublinea_clave}"
    

class fox_a_sublinea(models.Model):
    ## tabla nueva ## normaliza la tabla leyendas y las sublineas usando r_catept como pivote
    clave = models.IntegerField(primary_key=True)
    leyenda = models.CharField(max_length=100)
    is_active = models.BooleanField(default=True)
    def __str__(self):
        return f"descripc: {self.clave}"
    
     
class fox_cmp_aper(models.Model):
    cabecera = models.IntegerField()
    codigon = models.IntegerField(primary_key=True)
    descrip = models.CharField(max_length=100, null=True)

    def __str__(self):
        return f"{self.codigon} - {self.descrip}"
    

class fox_prove_pf(models.Model):
    codigo = models.IntegerField(primary_key=True)
    filer1 = models.CharField(max_length=100, blank=True, null=True)
    razon_soc = models.CharField(max_length=200, null=True)
    filer2 = models.CharField(max_length=100, blank=True, null=True)
    domicilio = models.CharField(max_length=200, null=True)
    filer3 = models.CharField(max_length=100, blank=True, null=True)
    localidad = models.CharField(max_length=150, null=True)
    filer4 = models.CharField(max_length=100, blank=True, null=True)
    codg_post = models.CharField(max_length=10, null=True)
    filer5 = models.CharField(max_length=100, blank=True, null=True)
    cate_iva = models.CharField(max_length=50,null=True)
    filer6 = models.CharField(max_length=100, blank=True, null=True)
    cuit = models.CharField(max_length=20, null=True)
    file7 = models.CharField(max_length=100, blank=True, null=True)
    telefono = models.CharField(max_length=100, null=True)
    file8 = models.CharField(max_length=100, blank=True, null=True)
    fax = models.CharField(max_length=100, blank=True, null=True)
    file9 = models.CharField(max_length=100, blank=True, null=True)
    observa = models.TextField(blank=True, null=True)
    resto = models.CharField(max_length=100, blank=True,null=True)

    # Campo adicional
    email = models.EmailField(null=True, blank=True)
    user_reference = models.CharField(max_length=100, null=True, blank=True)

    def __str__(self):
        return f"{self.codigo} - {self.razon_soc}"
    


class fox_ifx_calendario(models.Model):
    aa = models.SmallIntegerField(validators=[MinValueValidator(2000)])
    cc = models.SmallIntegerField(validators=[MinValueValidator(1), MaxValueValidator(19)])
    fecha_inicio = models.DateField()
    fecha_fin = models.DateField()
    dias = models.SmallIntegerField()
    aa_indec = models.SmallIntegerField(null=True, blank=True)
    mm_indec = models.SmallIntegerField(null=True, blank=True)
    fecha_actu = models.DateField()
    hora_actu = models.DateTimeField()
    usuario_actu = models.CharField(max_length=8)

    class Meta:
        constraints = [
            models.CheckConstraint(check=models.Q(aa__gte=2000), name='c271_592'),
            models.CheckConstraint(check=models.Q(cc__gte=1, cc__lte=19), name='cc_range'),
        ]
        unique_together = (('aa', 'cc'),)


class fox_indices_indec(models.Model):
    aa = models.SmallIntegerField(validators=[MinValueValidator(2000)])
    mm = models.SmallIntegerField(validators=[MinValueValidator(1), MaxValueValidator(12)])
    indice_ipim = models.DecimalField(max_digits=8, decimal_places=2)
    estado = models.CharField(max_length=1)

    class Meta:
        constraints = [
            models.CheckConstraint(check=models.Q(aa__gte=2000), name='check_aa_min_2000'),
            models.CheckConstraint(check=models.Q(mm__gte=1, mm__lte=12), name='check_mm_range'),
            models.CheckConstraint(check=models.Q(estado__in=['E', 'P', 'D', 'R']), name='check_estado_valor'),

        ]
        unique_together = (('aa', 'mm'),)



class fox_r_catept(models.Model):
    division = models.IntegerField()
    categoria = models.IntegerField()
    sub_linea = models.IntegerField()
    tipo_subl = models.IntegerField()
    sub_divi = models.IntegerField(null=True, blank=True)
    talle = models.IntegerField(null=True, blank=True)
    elaborac = models.IntegerField()
    concepto = models.IntegerField()
    grupo_fabr = models.IntegerField()
    packaging = models.IntegerField()
    coleccion = models.IntegerField()
    envase_2do = models.IntegerField()
    con_compra = models.IntegerField()
    caracteris = models.IntegerField(null=True, blank=True)
    segmento = models.IntegerField()

    def __str__(self):
        return f"Div: {self.division} - Cat: {self.categoria} - Sub: {self.sub_linea}"



class fox_r_catept_v2(models.Model):
    division = models.IntegerField()
    categoria = models.IntegerField()
    sub_linea = models.IntegerField()
    tipo_subl = models.IntegerField()
    sub_divi = models.IntegerField(null=True, blank=True)
    talle = models.IntegerField(null=True, blank=True)
    elaborac = models.IntegerField()
    concepto = models.IntegerField()
    grupo_fabr = models.IntegerField()
    packaging = models.IntegerField()
    coleccion = models.IntegerField()
    envase_2do = models.IntegerField()
    con_compra = models.IntegerField()
    caracteris = models.IntegerField(null=True, blank=True)
    segmento = models.IntegerField()

    def __str__(self):
        return f"Div: {self.division} - Cat: {self.categoria} - Sub: {self.sub_linea}"
    

class fox_empresa(models.Model):
    codigo = models.IntegerField(primary_key=True)
    descrip = models.CharField(max_length=100)
    is_active = models.BooleanField(default=True)
    def __str__(self):
        return f"descripc: {self.codigo}"
    


## tabla fox_divisiones antes fox_abrev ##
class fox_divisiones(models.Model):
    clave = models.IntegerField(primary_key=True)
    leyenda = models.CharField(max_length=100)
    ubi_mpt = models.CharField(max_length=100,null=True)
    is_active = models.BooleanField(default=True)
    def __str__(self):
        return f"{self.clave} - {self.leyenda}"
    


class fox_r_subdiv(models.Model):
    division = models.IntegerField()
    sub_divi = models.IntegerField()
    categoria = models.IntegerField() ### se deja porque viene de fox origianl, SIN USO
    def __str__(self):
        return f"{self.division} - {self.sub_divi} - {self.categoria}"
    
class fox_a_subdiv(models.Model):
    # nueva - no existe en fox nativamente, sino que sus datos están en tabla "leyendas"
    clave = models.IntegerField(primary_key=True)
    leyenda = models.CharField(max_length=100)
    # nuevo campo 
    is_active = models.BooleanField(default=True)
    def __str__(self):
        return f"{self.clave} - {self.leyenda}"

## nueva tabla unificada para categoria
class fox_r_categor(models.Model):
    subdivi = models.IntegerField(null=True,blank=True)
    categoria = models.IntegerField(null=True,blank=True)
    def __str__(self):
        return f"{self.subdivi} - {self.categoria}"
    
class fox_a_categor(models.Model):
    clave = models.IntegerField(primary_key=True)
    leyenda = models.CharField(max_length=100)
    is_active = models.BooleanField(default=True)
    def __str__(self):
        return f"{self.clave} - {self.leyenda}"

### ### se deja porque viene de fox original, SIN USO 
class fox_catehog(models.Model):
    division = models.IntegerField()
    categoria = models.IntegerField()
    def __str__(self):
        return f"{self.division} - {self.categoria}"
    




## Modelos de campaña

class fox_cmp_hist(models.Model):
    camp = models.FloatField()
    ano = models.IntegerField()
    tipo_of = models.IntegerField()
    codigo = models.CharField(max_length=6)
    codigon = models.IntegerField()
    fecha_st = models.DateTimeField(null=True)
    stock_pt = models.IntegerField()
    stock_co = models.IntegerField()
    unidades = models.IntegerField()
    unid_est = models.IntegerField()
    unid_fac = models.IntegerField()
    uxp = models.DecimalField(max_digits=10, decimal_places=4)
    uxp_pre = models.DecimalField(max_digits=10, decimal_places=4)
    uxp_real = models.DecimalField(max_digits=10, decimal_places=4)
    costo_est = models.FloatField()
    fecha_est = models.DateTimeField(null=True)
    tipo_est = models.CharField(max_length=1,null=True)
    costo_real = models.FloatField()
    fecha_real = models.DateTimeField(null=True)
    pr_normal = models.FloatField()
    pr_oferta = models.FloatField()
    coeficie = models.FloatField()
    pagina = models.PositiveSmallIntegerField()
    ubicacion = models.SmallIntegerField()
    ptachado = models.CharField(max_length=100,null=True)
    puntaje = models.IntegerField()
    puntostot = models.IntegerField()
    fact_real = models.FloatField()
    fact_est = models.FloatField()
    mar_real = models.FloatField()
    mar_est = models.FloatField()
    dto = models.FloatField()
    marca = models.CharField(max_length=1)

    def __str__(self):
        return f"{self.camp} - {self.ano}"
    

## nueva tabla campaign
class fox_Campaign(models.Model):
    division = models.PositiveSmallIntegerField() 
    ano = models.PositiveSmallIntegerField()
    camp = models.PositiveSmallIntegerField()
    estado = models.CharField(max_length=1)
    env_pres = models.CharField(max_length=1, null=True, blank=True)
    sequence = models.IntegerField()

    def __str__(self):
        return f"{self.division} - {self.ano} - Camp {self.camp}"


class fox_cmp(models.Model):
    camp = models.FloatField()
    ano = models.IntegerField()
    tipo_of = models.IntegerField()
    codigo = models.CharField(max_length=6)
    codigon = models.IntegerField()
    fecha_st = models.DateTimeField(null=True)
    stock_pt = models.IntegerField()
    stock_co = models.IntegerField()
    unidades = models.IntegerField()
    unid_est = models.IntegerField()
    unid_fac = models.IntegerField()
    uxp = models.DecimalField(max_digits=10, decimal_places=4)
    uxp_pre = models.DecimalField(max_digits=10, decimal_places=4)
    uxp_real = models.DecimalField(max_digits=10, decimal_places=4)
    costo_est = models.FloatField()
    fecha_est = models.DateTimeField(null=True)
    tipo_est = models.CharField(max_length=1,null=True)
    costo_real = models.FloatField()
    fecha_real = models.DateTimeField(null=True)
    pr_normal = models.FloatField()
    pr_oferta = models.FloatField()
    coeficie = models.FloatField()
    pagina = models.PositiveSmallIntegerField()
    ubicacion = models.SmallIntegerField()
    ptachado = models.CharField(max_length=100,null=True)
    puntaje = models.IntegerField()
    puntostot = models.IntegerField()
    fact_real = models.FloatField()
    fact_est = models.FloatField()
    mar_real = models.FloatField()
    mar_est = models.FloatField()
    dto = models.FloatField()
    marca = models.CharField(max_length=1)
    sequence = models.IntegerField()

    def __str__(self):
        return f"{self.camp} - {self.ano}"



class fox_mkrelcat(models.Model):
    categoria = models.FloatField()
    sub_linea = models.FloatField()
    coleccion = models.FloatField()
    mkdesc = models.CharField(max_length=13)
    mkrubro = models.CharField(max_length=3)
    mksrubro = models.CharField(max_length=3)
    mklinea = models.CharField(max_length=3)

    def __str__(self):
        return f"{self.categoria} - {self.sub_linea}"
    

class fox_a_colecn(models.Model):
    clave = models.FloatField()
    leyenda = models.CharField(max_length=100)

    def __str__(self):
        return f"{self.clave} - {self.leyenda}"
    

class fox_a_talle(models.Model):
    clave = models.CharField(max_length=10)
    leyenda = models.CharField(max_length=100)

    def __str__(self):
        return f"{self.clave} - {self.leyenda}"    
    

class fox_pedidos(models.Model):
    campania = models.IntegerField()
    anio = models.IntegerField()
    ped_estim = models.IntegerField()
    ped_reales = models.IntegerField()
    ped_tag = models.IntegerField(null=True)

    def __str__(self):
        return f"{self.campania} - {self.anio}"



class fox_cmp_info(models.Model):
    division = models.IntegerField()
    ano = models.IntegerField()
    camp = models.IntegerField()
    estado = models.CharField(max_length=1)
    env_pres = models.CharField(max_length=1,null=True)


class fox_porcen(models.Model):
    camp = models.IntegerField()
    ano = models.IntegerField()
    codigon = models.IntegerField()
    porcen = models.FloatField()

    def __str__(self):
        return f"{self.camp} - {self.ano}"