from django.db import models
from django.urls import reverse
from django.contrib.auth.models import User
from django.utils import timezone
from datetime import date
from django.utils.translation import gettext_lazy as _

# Create your models here.

class EstadoBrasil(models.TextChoices):
    AC = 'AC', _('Acre')
    AL = 'AL', _('Alagoas')
    AP = 'AP', _('Amapá')
    AM = 'AM', _('Amazonas')
    BA = 'BA', _('Bahia')
    CE = 'CE', _('Ceará')
    DF = 'DF', _('Distrito Federal')
    ES = 'ES', _('Espírito Santo')
    GO = 'GO', _('Goiás')
    MA = 'MA', _('Maranhão')
    MT = 'MT', _('Mato Grosso')
    MS = 'MS', _('Mato Grosso do Sul')
    MG = 'MG', _('Minas Gerais')
    PA = 'PA', _('Pará')
    PB = 'PB', _('Paraíba')
    PR = 'PR', _('Paraná')
    PE = 'PE', _('Pernambuco')
    PI = 'PI', _('Piauí')
    RJ = 'RJ', _('Rio de Janeiro')
    RN = 'RN', _('Rio Grande do Norte')
    RS = 'RS', _('Rio Grande do Sul')
    RO = 'RO', _('Rondônia')
    RR = 'RR', _('Roraima')
    SC = 'SC', _('Santa Catarina')
    SP = 'SP', _('São Paulo')
    SE = 'SE', _('Sergipe')
    TO = 'TO', _('Tocantins')

class Estado(models.Model):
    nome = models.CharField(max_length=30, verbose_name="Nome do Estado")

    def __str__(self):
        return "{}".format(self.nome)

    def get_absolute_url(self):
        return reverse('ListarEstado')

class Cidade(models.Model):
    nome = models.CharField(max_length=50, verbose_name="Nome da Cidade")
    estado = models.CharField(max_length=2, choices=EstadoBrasil.choices)

    def __str__(self):
        return "{}".format(self.nome)
    
    def get_absolute_url(self):
        return reverse('ListarCidade')
    

class TipoCliente(models.Model):
    tipo = models.CharField(max_length=20, verbose_name="Tipo do Cliente")

    def __str__(self):
        return "{}".format(self.tipo)

    def get_absolute_url(self):
        return reverse('ListarTipoCliente')

class Cliente(models.Model):
    #Campos Choices
    situacao_choices= (
        ('Ativo', 'Ativo'),
        ('Inativo', 'Inativa'),
    )

    pessoa_choices = (
        ('Fisica', 'Fisica'),
        ('Juridica', 'Juridica'),
    )

    #Dados Básicos do Cliente 
    codigo = models.CharField(max_length=10, verbose_name="Código Interno", blank=True, null=True)    
    datacadastro = models.DateField(default=timezone.now, verbose_name="Data Cadastro") 
    situacao = models.CharField(max_length=10, verbose_name="Situação", choices=situacao_choices)
    tipopessoa = models.CharField(max_length=10, verbose_name="Tipo Pessoa", choices=pessoa_choices)
    nome = models.CharField(max_length=50, verbose_name="Nome do Cliente")
    datanascimento = models.DateField(verbose_name="Data Nacimento", blank=True, null=True)

    #Dados Contatos do Cliente
    cnpj = models.CharField(max_length=18, verbose_name="CNPJ", blank=True, null=True)
    cpf = models.CharField(max_length=15, verbose_name="CPF", blank=True, null=True)
    rg = models.CharField(max_length=10, verbose_name="RG", blank=True, null=True)
    rgemissor = models.CharField(max_length=25, verbose_name="Emissor", blank=True, null=True)
    endereco = models.CharField(max_length=35, verbose_name="Endereço")
    cep = models.CharField(max_length=15, verbose_name="CEP", blank=True, null=True)
    bairro = models.CharField(max_length=25, verbose_name="Bairro")
    telefone01 = models.CharField(max_length=15, verbose_name="Telefone01")
    telefone02 = models.CharField(max_length=15, verbose_name="Telefone02", blank=True, null=True)
    email = models.EmailField(max_length=50, verbose_name="E-Mail", blank=True, null=True)
    website = models.URLField(max_length=50, verbose_name="WebSite", blank=True, null=True)
    observacao = models.TextField(max_length=150, verbose_name="Observação", blank=True, null=True)
        
    #Chaves Estrangeras
    tipocliente = models.ForeignKey(TipoCliente, on_delete=models.PROTECT)
    estado = models.CharField(max_length=2, choices=EstadoBrasil.choices)
    cidade = models.ForeignKey(Cidade, on_delete=models.PROTECT)

    def __str__(self):
        return "{}".format(self.nome, self.cpf, self.cnpj)

    def get_absolute_url(self):
        return reverse('ListarCliente')
    
    

   
class Visita(models.Model):
    protocolo = models.CharField(max_length=25, unique=True, verbose_name="Protocolo de Visita")
    datavisita = models.DateField(default=date.today, verbose_name="Data Visita")    
    cnpj = models.CharField(max_length=18, verbose_name="CNPJ", blank=True, null=True)
    cpf = models.CharField(max_length=15, verbose_name="CPF", blank=True, null=True)
    telefone = models.CharField(max_length=15, verbose_name="Telefone", null=True)
    historico = models.TextField(max_length=1024, verbose_name="Histórico da Visita")
    email = models.EmailField(max_length=50, verbose_name="E-Mail", blank=True, null=True)
    arquivo = models.FileField(upload_to='enviados/', blank=True, null=True)
    responsavel = models.CharField(max_length=50, verbose_name="Responsável Técnico")
    
    usuario = models.ForeignKey(User, related_name='nome', on_delete=models.PROTECT)
    cliente = models.ForeignKey(Cliente, on_delete=models.PROTECT, related_name='visitas', verbose_name="Nome do Cliente")

    def __str__(self):
        return f"{self.protocolo} - {self.cliente.nome}"

    def get_absolute_url(self):
        return reverse('ListarVisita')


class Servico(models.Model):
    status_choices = (
        ('Analise', 'Analise'),
        ('Cancelado', 'Cancelado'),
        ('Concluido', 'Concluido'),
    )


    #Dados do Cliente
    protocolo = models.CharField(max_length=15, unique=True, verbose_name="Protocolo de Serviço")
    status = models.CharField(max_length=15, choices=status_choices, default='Analise')
    cnpj = models.CharField(max_length=18, verbose_name="CNPJ", blank=True, null=True)
    cpf = models.CharField(max_length=15, verbose_name="CPF", blank=True, null=True)
    telefone = models.CharField(max_length=15, verbose_name="Telefone")  
    email = models.EmailField(max_length=50, verbose_name="E-Mail", blank=True, null=True)  
    
    #Dados do Servico    
    dataentrada = models.DateField(default=date.today, verbose_name="Data Entrada")  
    datasaida = models.DateField(verbose_name="Data Saída", blank=True, null=True)
    equipamento = models.TextField(max_length=255, verbose_name="Descrição do Equipamento") 
    estatus = models.TextField(max_length=100, verbose_name="Estado Aparente") 
    problema = models.TextField(max_length=255, verbose_name="Descrição do Problema") 
    analise = models.TextField(max_length=1024, verbose_name="Analise do Técnica", blank=True, null=True) 
    metodo = models.TextField(max_length=255, verbose_name="Metodo de Analise", blank=True, null=True) 
    procedimento = models.TextField(max_length=1024, verbose_name="Procedimento Realizado", blank=True, null=True) 
    responsavel = models.CharField(max_length=50, verbose_name="Responsável Técnico") 
    observacao = models.TextField(max_length=255, verbose_name="Observação", blank=True, null=True) 

    #Valores do Servico
    pecas = models.DecimalField(max_digits=16, decimal_places=2,  verbose_name="Valor Peças", blank=True, null=True)
    transporte = models.DecimalField(max_digits=16, decimal_places=2,  verbose_name="Valor Transporte", blank=True, null=True)
    manufatura = models.DecimalField(max_digits=16, decimal_places=2,  verbose_name="Valor Mão de Obra", blank=True, null=True)
    desconto = models.DecimalField(max_digits=16, decimal_places=2,  verbose_name="Valor Desconto", blank=True, null=True)
    total = models.DecimalField(max_digits=16, decimal_places=2,  verbose_name="Valor Total", blank=True, null=True)
    
    usuario = models.ForeignKey(User, on_delete=models.PROTECT, related_name='servicos')
    cliente = models.ForeignKey(Cliente, on_delete=models.PROTECT, related_name='servicos')
      
    def __str__(self):
         return f"{self.protocolo} - {self.cliente.nome}- {self.usuario.first_name}"  
    
    def get_absolute_url(self):
        return reverse('ListarServico')


class Recibo(models.Model):
    protocolo = models.CharField(max_length=25, unique=True, verbose_name="Protocolo de Serviço")
    dataservico = models.DateField(verbose_name="Data Serviço") 
    datarecebimento = models.DateField( verbose_name="Data de Recebimento")   
    
    #Dados do Serviço
    cliente = models.CharField(max_length=50, verbose_name="Nome do Cliente")
    cnpj = models.CharField(max_length=18, verbose_name="CNPJ", blank=True, null=True)
    cpf = models.CharField(max_length=15, verbose_name="CPF", blank=True, null=True)
    telefone = models.CharField(max_length=15, verbose_name="Telefone", null=True)
    historico = models.TextField(max_length=1024, verbose_name="Histórico do Serviço")
    email = models.EmailField(max_length=50, verbose_name="E-Mail", blank=True, null=True)    
    responsavel = models.CharField(max_length=50, verbose_name="Responsável Técnico")  

    #Valores do Servico
    valorrecibo = models.DecimalField(max_digits=16, decimal_places=2,  verbose_name="Valor Total", blank=True, null=True)
    
    def __str__(self):
        return f"Recibo: {self.protocolo} - {self.cliente}"

    def get_absolute_url(self):
        return reverse('ListarRecibo')
    

class Funcionario(models.Model):
    #Campos Choices
    situacao_choices= (
        ('Ativo', 'Ativo'),
        ('Inativo', 'Inativa') )   

    #Dados Básicos do Funcionário
    codigo = models.CharField(max_length=10, verbose_name="Código Interno", blank=True, null=True)    
    datacadastro = models.DateField(default=timezone.now, verbose_name="Data Cadastro") 
    situacao = models.CharField(max_length=10, verbose_name="Situação", choices=situacao_choices)    
    nome = models.CharField(max_length=50, verbose_name="Nome do Funcionário")
    usuario = models.ForeignKey(User, on_delete=models.PROTECT, verbose_name="Usuário de Login", null=True, blank=True)
    datanascimento = models.DateField(verbose_name="Data Nacimento", blank=True, null=True)

    #Dados Contatos do Funcionário    
    cpf = models.CharField(max_length=15, verbose_name="CPF", blank=True, null=True)
    rg = models.CharField(max_length=10, verbose_name="RG", blank=True, null=True)
    rgemissor = models.CharField(max_length=25, verbose_name="Emissor", blank=True, null=True)
    endereco = models.CharField(max_length=35, verbose_name="Endereço")
    cep = models.CharField(max_length=15, verbose_name="CEP", blank=True, null=True)
    bairro = models.CharField(max_length=25, verbose_name="Bairro", null=True)
    telefone01 = models.CharField(max_length=15, verbose_name="Telefone01", null=True)
    telefone02 = models.CharField(max_length=15, verbose_name="Telefone02", blank=True, null=True)
    email = models.EmailField(max_length=50, verbose_name="E-Mail", blank=True, null=True)    
    observacao = models.TextField(max_length=150, verbose_name="Observação", blank=True, null=True)
        
    #Chaves Estrangeras
    estado = models.CharField(max_length=2, choices=EstadoBrasil.choices)
    cidade = models.ForeignKey(Cidade, on_delete=models.PROTECT, null=True)

    def __str__(self):
        return "{}".format(self.nome, self.cpf)

    def get_absolute_url(self):
        return reverse('ListarFuncionario')
    
class Agendamento(models.Model):
    status_choices = (
        ('Agendado', 'Agendado'),
        ('Cancelado', 'Cancelado'),
        ('Concluido', 'Concluído'),
    )

    titulo = models.CharField(max_length=200, verbose_name="Título/Assunto")
    descricao = models.TextField(verbose_name="Descrição do Agendamento", blank=True, null=True)
    data = models.DateField(verbose_name="Data do Agendamento")
    hora = models.TimeField(verbose_name="Hora")
    
    status = models.CharField(max_length=15, choices=status_choices, default='Agendado')
    criado_em = models.DateTimeField(auto_now_add=True)
    usuario = models.ForeignKey(User, on_delete=models.PROTECT, verbose_name="Usuário")

    def __str__(self):
        return f"{self.data} - {self.titulo}"
    
    class Meta:
        ordering = ['data', 'hora']