from django.db import models
from django.utils.timezone import now
from django.contrib.auth.models import User
from mainsite.models import Client

@classmethod
def model_field_exists(cls, field):
    try:
        cls._meta.get_field(field)
        return True
    except:
            return False

models.Model.field_exists = model_field_exists

class Utr(models.Model):
    nombre = models.CharField(max_length=256,blank=False,null=False)
    serial = models.CharField(max_length=256,blank=False,null=False)
    imei = models.CharField(max_length=256,blank=True,null=True)
    entregada = models.BooleanField(default=False)
    cancelada = models.BooleanField(default=False)
    faltante_cables = models.BooleanField(default=False)
    fecha_entrega_faltante_cables = models.DateField(blank=True,null=True)
    faltante_baterias = models.BooleanField(default=False)
    fecha_entrega_faltante_baterias = models.DateField(blank=True,null=True)
    archivo = models.FileField(upload_to ='utr/',null=True,blank=True)
    
    def __str__(self):
        return str(self.id)
    
    class Meta:
        ordering = ['id']
        verbose_name_plural = "Utr's"

class Factura(models.Model):
    factura = models.CharField(max_length=256,blank=False,null=False)
    fecha_facturacion = models.DateField(blank=True,null=True)
    descripcion = models.CharField(max_length=256,blank=True,null=True)
    archivo = models.FileField(upload_to ='facturas/',null=True,blank=True)
    
    def __str__(self):
        return str(self.id)
    
    class Meta:
        ordering = ['id']
        verbose_name_plural = "Facturas"
        
class StatusConstruccion(models.Model):
    statusChoices = [
        ('ING','ETAPA DE INGENIERÍA'),
        ('ACO','APROBADO PARA CONSTRUCCIÓN'),
        ('PFA','EN PROCESO DE FABRICACIÓN'),
        ('TRC','TERMINADO EN REVISIÓN DE CALIDAD'),
        ('EPE','EN PROCESO DE ENTREGA'),
        ('ENT','ENTREGADO'),
    ]
    
    status = models.CharField(max_length=3,choices=statusChoices,default='ING')
    fecha = models.DateTimeField(default=now)
    creado_por = models.ForeignKey(User,on_delete=models.CASCADE)
    
    def __str__(self):
        return str(self.status)
    
    class Meta:
        ordering = ['id']
        verbose_name_plural = "Status de Construcción"
        
class Post(models.Model):
    creado_por = models.ForeignKey(User,on_delete=models.CASCADE)
    fecha = models.DateTimeField(default=now)
    titulo = models.CharField(max_length=128,null=False,blank=False)
    post = models.CharField(max_length=720,null=False,blank=False)
    archivo = models.FileField(upload_to ='post/',null=True,blank=True)
    
    def __str__(self):
        return str(self.titulo)
    
    class Meta:
        ordering = ['id']
        verbose_name_plural = "Posts"

class Comentario(models.Model):
    creado_por = models.ForeignKey(User,on_delete=models.DO_NOTHING)
    fecha = models.DateTimeField(default=now)
    post = models.ForeignKey(Post,on_delete=models.CASCADE)
    comentario = models.CharField(max_length=256,null=False,blank=False)
    archivo = models.FileField(upload_to ='comentario/',null=True,blank=True)
    
    def __str__(self):
        return str(self.comentario)
    
    class Meta:
        ordering = ['id']
        verbose_name_plural = "Comentarios"

class PostVistas(models.Model):
    fecha_lectura = models.DateTimeField(default=now)
    usuario = models.ForeignKey(User,on_delete=models.CASCADE)
    post = models.ForeignKey(Post,on_delete=models.CASCADE)
    
    def __str__(self):
        return str(self.usuario)
    
    class Meta:
        ordering = ['id']
        verbose_name_plural = "Vistas de posts"

class Proyecto(models.Model):
    apType = [
	    ('SR','SERVICIO'),
        ('PR','PROYECTO'),
        ('EQ','EQUIPOS'),
        ('CP','CAPACITACIÓN'),
    ]
    divisionType = [
        ('DI','INDUSTRIAL'),
        ('DC','COMERCIAL'),
    ]
   
    subType = [
        ('TELEM','TELEMETRIA'),
        ('CTRL','CONTROL'),
        ('SCADA','SCADA'),
        ('INST','INSTRUMENTACION'),
        ('IIOT','IIOT'),
        ('LGCY','LEGACY'),
        ('ESP','ESPECIAL'),
    ]
   
    monedaChoices = [
        ('MXN','MXN'),
        ('USD','USD'),
        ('EUR','EUR'),
        ('GBP','GBP'),
    ]
    
    fecha_creacion = models.DateTimeField(default=now)
    creado_por = models.ForeignKey(User,on_delete=models.CASCADE)
    cliente = models.ForeignKey(Client,on_delete=models.CASCADE)
    tipo = models.CharField(max_length=2,choices=apType,default='PR')
    division = models.CharField(max_length=2,choices=divisionType,default='DI')
    subdivision = models.CharField(max_length=5,choices=subType,default='TELEM')
    usuario_final = models.CharField(max_length=256,blank=False,null=False)
    contacto_tecnico = models.ForeignKey(User,on_delete=models.CASCADE,related_name="contacto_tecnico")
    orden_de_compra = models.CharField(max_length=64,blank=False,null=False)
    sales_order = models.CharField(max_length=64,blank=False,null=False)
    fecha_pedido = models.DateField(blank=False,null=False)
    fecha_entrega_solicitada = models.DateField(blank=False,null=False)
    fecha_entrega_confirmada = models.DateField(blank=True,null=True)
    fecha_entrega_real = models.DateField(blank=True,null=True)
    descripcion = models.CharField(max_length=400,blank=True,null=True)
    monto = models.FloatField(default=0.0,null=False,blank=False)
    moneda = models.CharField(max_length=3,choices=monedaChoices,default='MXN')
    facturas = models.ManyToManyField(Factura,blank=True)
    utrs = models.ManyToManyField(Utr,blank=True)
    notas = models.ManyToManyField(Post, blank=True)
    status_construccion = models.ManyToManyField(StatusConstruccion)
    facturado = models.BooleanField(default=False)
    fecha_facturado = models.DateTimeField(blank=True,null=True)
    pagado = models.BooleanField(default=False)
    fecha_pagado = models.DateTimeField(blank=True,null=True)
    pausado = models.BooleanField(default=False)
    fecha_pausado = models.DateTimeField(blank=True,null=True)
    activo = models.BooleanField(default=True)
    
    def __str__(self):
        return str(self.id)
    
    class Meta:
        ordering = ['id']
        verbose_name_plural = "Proyectos"