from django.db import models
from django_mysql.models.fields import SizedTextField

# Create your models here.

class EstadosCivis(models.Model):
    estado_civil_id = models.IntegerField(null=False, primary_key=True, default=None, unique=True)
    estado_civil = models.CharField(max_length=100, null=True, default=None)

    def __str__(self) -> str:
        return f"{self.estado_civil} "
    
    def __repr__(self):
        return self.__str__()
    
    class Meta:
        db_table = 'dimEstadosCivis'   


class FormasdePagamento(models.Model):
    forma_pagamento_id = models.IntegerField(null=False, primary_key=True, default=None, unique=True)
    forma_pagamento = models.CharField(max_length=100, null=True, default=None)

    def __str__(self) -> str:
        return f"{self.forma_pagamento} "
    
    def __repr__(self):
        return self.__str__()
    
    class Meta:
        db_table = 'dimFormasdePagamento'  
        
class StatusPagamento(models.Model):
    status_pagamento_id = models.IntegerField(null=False, primary_key=True, default=None, unique=True)
    status_pagamento = models.CharField(max_length=100, null=True, default=None)

    def __str__(self) -> str:
        return f"{self.status_pagamento} "
    
    def __repr__(self):
        return self.__str__()
    
    class Meta:
        db_table = 'dimStatusPagamento'  



class Planos(models.Model):
    plano_id = models.IntegerField(null=False, primary_key=True, default=None, unique=True)
    plano = models.CharField(max_length=100, null=True, default=None)

    def __str__(self) -> str:
        return f"{self.plano} "
    
    def __repr__(self):
        return self.__str__()
    
    class Meta:
        db_table = 'dimPlanos'   


class Regioes(models.Model):
    regiao_id = models.IntegerField(null=False, primary_key=True, default=None, unique=True)
    bairro = models.CharField(max_length=100, null=True, default=None)
    cidade = models.CharField(max_length=100, null=True, default=None)
    estado = models.CharField(max_length=100, null=True, default=None)

    def __str__(self) -> str:
        return f"Região do bairro {self.bairro}, cidade {self.cidade} e do estado {self.estado} "
    
    def __repr__(self):
        return self.__str__()
    
    class Meta:
        db_table = 'dimRegioes'   
        
        


class Assinantes(models.Model):
    assinante_id = models.IntegerField(null=False, primary_key=True, default=None, unique=True)
    nome = models.CharField(max_length=100, null=True, default=None)
    sobrenome = models.CharField(max_length=100, null=True, default=None)
    email = models.EmailField(null=True, default=None)
    data_nascimento = models.DateField(null=True, default=None)
    razao_social = models.CharField(max_length=100, null=True, default=None)
    nome_fantasia = models.CharField(max_length=100, null=True, default=None)
    regiao = models.ForeignKey(Regioes, on_delete=models.DO_NOTHING, default=None)
    estado_civil = models.ForeignKey(EstadosCivis, on_delete=models.DO_NOTHING, default=None)

    def __str__(self) -> str:
        return f"{self.nome} {self.sobrenome}"
    
    def __repr__(self):
        return self.__str__()
    
    class Meta:
        db_table = 'fatoAssinantes'   

class Acessos(models.Model):
    acesso_id = models.IntegerField(null=False, primary_key=True, default=None, unique=True)
    acesso_data = models.DateTimeField(null=True, default=None)
    assinante = models.ForeignKey(Assinantes, on_delete=models.DO_NOTHING, default=None)

    def __str__(self) -> str:
        return f"Acessado em {self.acesso_data} por {self.assinante_id}"
    
    def __repr__(self):
        return self.__str__()
    
    class Meta:
        db_table = 'fatoAcessos'


class Assinaturas(models.Model):
    assinatura_id = models.IntegerField(null=False, primary_key=True, default=None, unique=True)
    assinatura_data = models.DateTimeField(null=True, default=None)
    status = models.CharField(max_length=50, null=True, default=None)
    early_adopter = models.IntegerField(null=True, default=None)
    cancelamento = models.IntegerField(null=True, default=None)
    contrato = models.IntegerField(null=True, default=None)
    plano = models.ForeignKey(Planos, on_delete=models.DO_NOTHING, default=None)
    assinante = models.ForeignKey(Assinantes, on_delete=models.DO_NOTHING, default=None)
    
    def __str__(self) -> str:
        return f"Assinatura feita em {self.assinatura_data} por {self.assinante_id}"
    
    def __repr__(self):
        return self.__str__()
    
    class Meta:
        db_table = 'fatoAssinaturas'    


class Pagamentos(models.Model):
    pagamento_id = models.IntegerField(null=False, primary_key=True, default=None, unique=True)
    pagamento_data = models.DateTimeField(null=True, default=None)
    valor = models.DecimalField(null=True, max_digits=6, decimal_places=2)
    forma_pagamento = models.ForeignKey(FormasdePagamento, on_delete=models.DO_NOTHING, default=None)
    status_pagamento = models.ForeignKey(StatusPagamento, on_delete=models.DO_NOTHING, default=141)
    assinante = models.ForeignKey(Assinantes, on_delete=models.DO_NOTHING, default=None)
    assinatura = models.ForeignKey(Assinaturas, on_delete=models.DO_NOTHING, default=None)
    
    def __str__(self) -> str:
        return f"Pago {self.valor} em {self.pagamento_data}"
    
    def __repr__(self):
        return self.__str__()
    
    class Meta:
        db_table = 'fatoPagamentos'


#Tabela para rodar o modelo estatístico em ML
class Oportunidades(models.Model):

    #AdditionalReqFields = SizedTextField(size_class=3, null=True, blank=True, default=None)

    id = models.IntegerField(null=False, primary_key=True, default=None, unique=True)
    data = models.DateTimeField(null=True, default=None)
    data_finalizacao = models.DateTimeField(null=True, default=None)
    titulo = models.CharField(max_length=100, null=True, default=None)
    nome = models.CharField(max_length=100, null=True, default=None)
    consultor = models.CharField(max_length=100, null=True, default=None)
    bairro = models.CharField(max_length=100, null=True, default=None)
    cidade = models.CharField(max_length=100, null=True, default=None)
    estado = models.CharField(max_length=100, null=True, default=None)
    estado_civil = models.CharField(max_length=100, null=True, default=None)
    profissao = models.CharField(max_length=100, null=True, default=None)
    sexo = models.CharField(max_length=50, null=True, default=None)
    renda = models.CharField(max_length=50, null=True, default=None)
    idade = models.IntegerField(null=True, default=None)
    idade_range = models.CharField(max_length=50, null=True, default=None)
    midia = models.CharField(max_length=50, null=True, default=None)
    canal = models.CharField(max_length=50, null=True, default=None)
    temperatura = models.CharField(max_length=50, null=True, default=None)
    unidade = models.CharField(max_length=50, null=True, default=None)
    unidade_email = models.CharField(max_length=100, null=True, default=None)
    interesse = models.CharField(max_length=50, null=True, default=None)
    categoria = models.CharField(max_length=50, null=True, default=None)
    tipo = models.CharField(max_length=50, null=True, default=None)
    status = models.CharField(max_length=50, null=True, default=None)
    funil = models.CharField(max_length=50, null=True, default=None)
    etapa_funil = models.CharField(max_length=50, null=True, default=None)
    ordem_funil = models.IntegerField(null=True, default=None)
    empreendimento = models.CharField(max_length=100, null=True, default=None)
    motivo_perda_pausa = models.CharField(max_length=100, null=True, default=None)
    dias_finalizacao = models.IntegerField(null=True, default=None)
    finalizacao_range = models.CharField(max_length=50, null=True, default=None)
    utm_source = models.CharField(max_length=100, null=True, default=None)
    utm_medium = models.CharField(max_length=255, null=True, default=None)
    utm_campaign = SizedTextField(size_class=3, null=True, blank=True, default=None)
    utm_content = SizedTextField(size_class=3, null=True, blank=True, default=None)
    utm_term = SizedTextField(size_class=3, null=True, blank=True, default=None)
    #utm_campaign = models.SizedTextField()
    #utm_content = models.SizedTextField()
    #utm_term = SizedTextField()
    unidade_id = models.IntegerField(null=True, default=None)
    prediction = models.DecimalField(null=True, max_digits=6, decimal_places=2)
    most_likely_outcome = models.IntegerField(null=True, default=None)


    
    def __str__(self) -> str:
        return f"oportunidade_id:{self.id}, etapa_funil:{self.etapa_funil}"
    
    def __repr__(self):
        return self.__str__()
    
    class Meta:
        db_table = 'crmOportunidades'