from rest_framework import serializers
from rest_framework.validators import UniqueValidator
#from rest_framework.validators import UniqueTogetherValidator
from .models import Assinantes, Assinaturas, Acessos, Pagamentos, EstadosCivis, FormasdePagamento,  Planos, Regioes, StatusPagamento, Oportunidades
from decimal import Decimal
import bleach


class EstadoCivilSerializer(serializers.ModelSerializer):
    estado_civil_id = serializers.IntegerField(read_only = True, min_value=1, validators=[UniqueValidator(queryset=EstadosCivis.objects.all())])
    estado_civil = serializers.CharField(read_only = True, max_length=100)

    
    def validate(self, attrs):
        attrs['estado_civil'] = bleach.clean(attrs['estado_civil'])
        return super().validate(attrs)    
      
    class Meta:
        model = EstadosCivis
        fields = ['estado_civil_id', 'estado_civil']



class FormadePagamentoSerializer(serializers.ModelSerializer):
    forma_pagamento_id = serializers.IntegerField(read_only = True, min_value=1, validators=[UniqueValidator(queryset=FormasdePagamento.objects.all())])
    forma_pagamento = serializers.CharField(read_only = True, max_length=100)

    
    def validate(self, attrs):
        attrs['forma_pagamento'] = bleach.clean(attrs['forma_pagamento'])
        return super().validate(attrs)    
      
    class Meta:
        model = FormasdePagamento
        fields = ['forma_pagamento_id', 'forma_pagamento']
        

class StatusPagamentoSerializer(serializers.ModelSerializer):
    status_pagamento_id = serializers.IntegerField(read_only = True, min_value=1, validators=[UniqueValidator(queryset=FormasdePagamento.objects.all())])
    status_pagamento = serializers.CharField(read_only = True, max_length=100)

    
    def validate(self, attrs):
        attrs['status_pagamento'] = bleach.clean(attrs['status_pagamento'])
        return super().validate(attrs)    
      
    class Meta:
        model = StatusPagamento
        fields = ['status_pagamento_id', 'status_pagamento']



class PlanoSerializer(serializers.ModelSerializer):
    plano_id = serializers.IntegerField(read_only = True, min_value=1, validators=[UniqueValidator(queryset=Planos.objects.all())])
    plano = serializers.CharField(read_only = True, max_length=100)

    
    def validate(self, attrs):
        attrs['plano'] = bleach.clean(attrs['plano'])
        return super().validate(attrs)    
      
    class Meta:
        model = Planos
        fields = ['plano_id', 'plano']



class RegiaoSerializer(serializers.ModelSerializer):
    regiao_id = serializers.IntegerField(read_only = True, min_value=1, validators=[UniqueValidator(queryset=Regioes.objects.all())])
    bairro = serializers.CharField(read_only = True, max_length=100)
    cidade = serializers.CharField(read_only = True, max_length=100)
    estado = serializers.CharField(read_only = True, max_length=100)

    
    def validate(self, attrs):
        attrs['bairro'] = bleach.clean(attrs['bairro'])
        attrs['cidade'] = bleach.clean(attrs['cidade'])
        attrs['estado'] = bleach.clean(attrs['estado'])
        return super().validate(attrs)    
      
    class Meta:
        model = Planos
        fields = ['regiao_id', 'bairro', 'cidade', 'estado']
        
        

class AssinanteSerializer(serializers.ModelSerializer):
    assinante_id = serializers.IntegerField(read_only = True, min_value=1, validators=[UniqueValidator(queryset=Assinantes.objects.all())])
    nome = serializers.CharField(read_only = True, max_length=100)
    sobrenome = serializers.CharField(read_only=True, max_length=100)
    email = serializers.EmailField(read_only=True)
    data_nascimento = serializers.DateField(read_only=True)
    razao_social = serializers.CharField(read_only=True, max_length=100)
    nome_fantasia = serializers.CharField(read_only=True, max_length=100)
    regiao = RegiaoSerializer(read_only=True)
    estado_civil = EstadoCivilSerializer(read_only=True)
    
    
    def validate(self, attrs):
        attrs['nome'] = bleach.clean(attrs['nome'])
        attrs['sobrenome'] = bleach.clean(attrs['sobrenome'])
        attrs['razao_social'] = bleach.clean(attrs['razao_social'])
        attrs['nome_fantasia'] = bleach.clean(attrs['nome_fantasia'])
        return super().validate(attrs)
    
    def validate_assinante_id(self, value):
        if (value < 1):
            raise serializers.ValidationError('Assinante ID deve ser igual ou maior a 1!')
        return value
    

            
    class Meta:
        model = Assinantes
        fields = ['assinante_id', 'nome', 'sobrenome', 'email', 'data_nascimento', 'razao_social', 
                  'nome_fantasia', 'regiao', 'estado_civil']
        extra_kwargs = {
            'email': {'error_messages': {'blank': "Informe o e-mail do assinante"}, 'validators': [UniqueValidator(queryset=Assinantes.objects.all())]},
        }


class AssinaturaSerializer(serializers.ModelSerializer):
    assinatura_id = serializers.IntegerField(read_only = True, min_value=1, validators=[UniqueValidator(queryset=Assinantes.objects.all())])
    assinatura_data = serializers.DateTimeField(read_only = True)
    status = serializers.CharField(read_only=True, max_length=50)
    early_adopter = serializers.IntegerField(read_only=True, min_value=0, max_value=1)
    cancelamento = serializers.IntegerField(read_only=True, min_value=0, max_value=1)
    contrato = serializers.IntegerField(read_only=True, min_value=0, max_value=1)
    plano= PlanoSerializer(read_only=True)
    assinante = AssinanteSerializer(read_only=True)
    
    
    def validate(self, attrs):
        attrs['status'] = bleach.clean(attrs['status'])

        return super().validate(attrs)
    
    def validate_assinante_id(self, value):
        if (value < 1):
            raise serializers.ValidationError('Assinante ID deve ser igual ou maior a 1!')
        return value
    

            
    class Meta:
        model = Assinaturas
        fields = ['assinatura_id', 'assinatura_data', 'status', 'early_adopter', 'cancelamento', 'contrato', 
                  'plano', 'assinante',]



class AcessoSerializer(serializers.ModelSerializer):
    acesso_id = serializers.IntegerField(read_only = True, min_value=1, validators=[UniqueValidator(queryset=Acessos.objects.all())])
    acesso_data = serializers.DateTimeField(read_only = True)
    assinante = AssinanteSerializer(read_only=True)

    
    def validate_assinante_id(self, value):
        if (value < 1):
            raise serializers.ValidationError('Assinante ID deve ser igual ou maior a 1!')
        return value
    

            
    class Meta:
        model = Acessos
        fields = ['acesso_id', 'acesso_data', 'assinante',]


class PagamentoSerializer(serializers.ModelSerializer):
    pagamento_id = serializers.IntegerField(read_only = True, min_value=1, validators=[UniqueValidator(queryset=Assinantes.objects.all())])
    pagamento_data = serializers.DateTimeField(read_only = True)
    valor = serializers.DecimalField(read_only=True, max_digits=6, decimal_places=2)
    forma_pagamento = FormadePagamentoSerializer(read_only=True)
    status_pagamento = StatusPagamentoSerializer(read_only=True)
    assinante = AssinanteSerializer(read_only=True)
    assinatura = AssinaturaSerializer(read_only=True)
    
    
    
    def validate_valor(self, value):
        if (value < 0):
            raise serializers.ValidationError('Valor precisa ser acima de 0.00!')
        return value
    

            
    class Meta:
        model = Pagamentos
        fields = ['pagamento_id', 'pagamento_data', 'valor', 'forma_pagamento', 'status_pagamento', 'assinante', 'assinatura',]


#MaxHunter Oportunidades do CRM
class OportunidadeSerializer(serializers.ModelSerializer):
    id = serializers.IntegerField(read_only = True, min_value=1, validators=[UniqueValidator(queryset=Oportunidades.objects.all())])
    data = serializers.DateTimeField(read_only = True)
    data_finalizacao = serializers.DateTimeField(read_only = True)
    titulo = serializers.CharField(read_only=True)
    nome = serializers.CharField(read_only=True)
    consultor = serializers.CharField(read_only=True)
    bairro = serializers.CharField(read_only=True)
    cidade = serializers.CharField(read_only=True)
    estado = serializers.CharField(read_only=True)
    estado_civil = serializers.CharField(read_only=True)
    profissao = serializers.CharField(read_only=True)
    sexo = serializers.CharField(read_only=True)
    renda = serializers.CharField(read_only=True)
    idade = serializers.IntegerField(read_only=True)
    idade_range = serializers.CharField(read_only=True)
    midia = serializers.CharField(read_only=True)
    canal = serializers.CharField(read_only=True)
    temperatura = serializers.CharField(read_only=True)
    unidade = serializers.CharField(read_only=True)
    unidade_email = serializers.CharField(read_only=True)
    interesse = serializers.CharField(read_only=True)
    categoria = serializers.CharField(read_only=True)
    tipo = serializers.CharField(read_only=True)
    status = serializers.CharField(read_only=True)
    funil = serializers.CharField(read_only=True)
    etapa_funil = serializers.CharField(read_only=True)
    ordem_funil = serializers.IntegerField(read_only=True)
    empreendimento = serializers.CharField(read_only=True)
    motivo_perda_pausa = serializers.CharField(read_only=True)
    dias_finalizacao = serializers.CharField(read_only=True)
    finalizacao_range = serializers.CharField(read_only=True)
    utm_source = serializers.CharField(read_only=True)
    utm_medium = serializers.CharField(read_only=True)
    utm_campaign = serializers.CharField(read_only=True)
    utm_content = serializers.CharField(read_only=True)
    utm_term = serializers.CharField(read_only=True)
    unidade_id = serializers.IntegerField(read_only=True)
    prediction = serializers.DecimalField(read_only=True, max_digits=6, decimal_places=2)
    most_likely_outcome = serializers.IntegerField(read_only=True)
    

            
    class Meta:
        model = Oportunidades
        fields = ['id', 'data', 'data_finalizacao', 'titulo', 'nome', 'consultor', 'bairro', 'cidade', 'estado', 'estado_civil',
         'profissao', 'sexo', 'renda', 'idade', 'idade_range', 'midia', 'canal', 'temperatura', 'unidade', 'unidade_email',
          'interesse', 'categoria', 'tipo', 'status', 'funil', 'etapa_funil', 'ordem_funil', 'empreendimento', 'motivo_perda_pausa',
           'dias_finalizacao', 'finalizacao_range', 'utm_source', 'utm_medium', 'utm_campaign', 'utm_content', 'utm_term', 'unidade_id',
            'prediction','most_likely_outcome']