from django.shortcuts import render, redirect, get_object_or_404
from apps.dashboard.utils import get_user_info
from apps.fornecedores.forms import FornecedoresForm, CategoriaForm
from apps.fornecedores.models import FornecedoresModels, Categoria
from django.contrib import messages
from django.core.exceptions import ObjectDoesNotExist
from django.contrib.auth.models import User
from django.utils.safestring import mark_safe
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
import requests
from django.http import JsonResponse

# Create your views here.

        

def cadastro_categoria(request):
    form = CategoriaForm()
    if request.method == 'POST':
        form = CategoriaForm(request.POST)
        if form.is_valid():
            form.save()
            messages.success(request, "Categoria criada com sucesso.")
            return redirect('cadastro_fornecedores')  # Redireciona para a página de fornecedores
    return render(request, 'fornecedores/cadastro_categoria.html', {'form': form})

@csrf_exempt
def cadastro_categoria_ajax(request):
    if request.method == 'POST':
        form = CategoriaForm(request.POST)
        if form.is_valid():
            form.save()
            return JsonResponse({"success": True, "message": "Categoria criada com sucesso!"})
        else:
            return JsonResponse({"success": False, "errors": form.errors})
    return JsonResponse({"success": False, "message": "Método inválido"})

def cadastro_fornecedores(request):
    form = FornecedoresForm()

    if not request.user.is_authenticated:
        return redirect('index')

    user_info = get_user_info(request.user.id)

    if request.method == 'POST':
        form = FornecedoresForm(request.POST)
        if form.is_valid():
            # Obtenha o nome fantasia do formulário
            nome_fantasia = form.cleaned_data['nome_fantasia']
            # Verifique se o cliente com o mesmo nome fantasia já existe
            if FornecedoresModels.objects.filter(nome_fantasia=nome_fantasia).exists():
                # Mensagem de erro
                messages.error(request, mark_safe(
                    '<i class="fa-solid fa-circle-exclamation"></i><strong class="mx-1">Erro!</strong> Cliente ja Cadastrado.'))
            else:
                # Crie uma instância do modelo com os dados do formulário
                novo_fornecedor = form.save(commit=False)
                # Adiciona a sequência ao nome_fantasia
                novo_fornecedor.nome_fantasia = f"{nome_fantasia}"
                # Salve a instância modificada no banco de dados
                novo_fornecedor.save()
                messages.success(request, mark_safe(
                    '<i class="fa-solid fa-circle-check"></i><strong class="mx-1">Sucesso!</strong> Novo Cliente cadastrado com êxito.'))
                return redirect('lista_fornecedores')

    return render(request, 'fornecedores/cadastro_fornecedores.html', {"user_info": user_info, "form": form})


def editar_fornecedores(request, fornecedor_id):
    if not request.user.is_authenticated:
        return redirect('index')

    fornecedor = get_object_or_404(FornecedoresModels, pk=fornecedor_id)
    user_info = get_user_info(request.user.id)

    if request.method == 'POST':
        form = FornecedoresForm(request.POST, request.FILES, instance=fornecedor)
        if form.is_valid():
            form.save()
            messages.success(request, mark_safe(
                '<i class="fa-solid fa-circle-check"></i><strong class="mx-1">Sucesso!</strong> Fornecedor atualizado com êxito.'))
            return redirect('lista_fornecedores')
    else:
        form = FornecedoresForm(instance=fornecedor)

    # Detecta se é CPF ou CNPJ para mostrar corretamente no front-end
    tipo_pessoa = "cpf" if len(fornecedor.documento) == 11 else "cnpj"

    return render(request, 'fornecedores/editar_fornecedor.html', {
        "form": form,
        "user_info": user_info,
        "fornecedor": fornecedor,
        "fornecedor_id": fornecedor_id,
        "tipo_pessoa": tipo_pessoa,
    })

def formatar_documento(doc):
    doc = ''.join(filter(str.isdigit, doc or ""))

    if len(doc) == 11:  # CPF
        return f'{doc[:3]}.{doc[3:6]}.{doc[6:9]}-{doc[9:]}'
    elif len(doc) == 14:  # CNPJ
        return f'{doc[:2]}.{doc[2:5]}.{doc[5:8]}/{doc[8:12]}-{doc[12:]}'
    return doc  # retorna como está se não bater

def lista_fornecedores(request):
    if not request.user.is_authenticated:
        return redirect('index')

    user_info = get_user_info(request.user.id)
    dados_fornecedores = FornecedoresModels.objects.all()

    # Adiciona campo formatado dinamicamente
    for fornecedor in dados_fornecedores:
        fornecedor.documento_formatado = formatar_documento(fornecedor.documento)

    return render(request, 'fornecedores/lista_fornecedores.html', {
        "cards_fornecedores": dados_fornecedores,
        "user_info": user_info
    })

def deletar_fornecedores(request, fornecedor_id):
    if not request.user.is_authenticated:
        return redirect('index')
    user_info = get_user_info(request.user.id)
    try:
        fornecedor = FornecedoresModels.objects.get(id=fornecedor_id)
        fornecedor.delete()
        messages.success(request, mark_safe(
                    '<i class="fa-solid fa-circle-check"></i><strong class="mx-1">Sucesso!</strong> Cliente deletado com êxito.'))
        return redirect ('lista_fornecedores')
    except ObjectDoesNotExist:
        messages.error(request, mark_safe(
                    '<i class="fa-solid fa-circle-exclamation"></i><strong class="mx-1">Erro!</strong> Cliente não encontrado.'))
        return redirect('lista_fornecedores', { "user_info": user_info })