from django.shortcuts import render, redirect, get_object_or_404
from django.contrib import messages
from django.utils import timezone
from django.db import connection
from django.contrib.auth.decorators import login_required, user_passes_test

from .forms import ClientForm
from .models import Client, TenantDeleteRequest
from login.views import group_required

# Cadastro de Tenant
@login_required
@group_required('Desenvolvedores')
def register_tenant(request):
    if request.method == 'POST':
        form = ClientForm(request.POST)
        if form.is_valid():
            form.save()
            messages.success(request, 'Tenant registrado com sucesso!')
            return redirect('tenant_management:tenant_list')
        else:
            messages.error(request, 'Erro ao registrar o tenant.')
    else:
        form = ClientForm()

    return render(request, 'tenant_management/register_tenant.html', {'form': form})

# Lista de Tenants
@login_required
@group_required('Desenvolvedores')
def tenant_list(request):
    tenants = Client.objects.all()
    return render(request, 'tenant_management/tenant_list.html', {'tenants': tenants})

# Editar Tenant
@login_required
@group_required('Desenvolvedores')
def edit_tenant(request, tenant_id):
    tenant = get_object_or_404(Client, id=tenant_id)
    tenants = Client.objects.all()

    if request.method == 'POST':
        form = ClientForm(request.POST, instance=tenant)
        if form.is_valid():
            form.save()
            messages.success(request, 'Tenant atualizado com sucesso!')
            return redirect('tenant_management:tenant_list')
        else:
            messages.error(request, 'Erro ao atualizar o tenant.')
    else:
        form = ClientForm(instance=tenant)

    return render(request, 'tenant_management/tenant_list.html', {
        'form': form,
        'tenant': tenant,
        'tenants': tenants,
        'editing': True
    })

# Solicitação de exclusão de tenant
@login_required
@group_required('Desenvolvedores')
def solicitar_exclusao_tenant(request, tenant_id):
    tenant = get_object_or_404(Client, id=tenant_id)

    if request.method == "POST":
        if TenantDeleteRequest.objects.filter(tenant=tenant, approved=False).exists():
            messages.warning(request, "Já existe uma solicitação pendente para este tenant.")
            return redirect('tenant_management:tenant_list')

        TenantDeleteRequest.objects.create(
            tenant=tenant,
            requested_by=request.user
        )
        messages.success(request, "Solicitação enviada para aprovação do administrador.")
        return redirect('tenant_management:tenant_list')

    return render(request, 'tenant_management/confirm_delete_tenant.html', {'tenant': tenant})

# Painel de administração CAG
@login_required
@group_required('Desenvolvedores')
def painel_cag_adm(request):
    tenants = Client.objects.all()
    delete_requests = TenantDeleteRequest.objects.filter(approved=False)
    return render(request, 'tenant_management/painel_cag_adm.html', {
        'tenants': tenants,
        'delete_requests': delete_requests
    })

# Painel de aprovações para administrador
@login_required
@user_passes_test(lambda u: u.groups.filter(name='Administrador').exists())
def painel_aprovacoes(request):
    pendentes = TenantDeleteRequest.objects.filter(approved=False)
    return render(request, 'tenant_management/lista_aprovacoes.html', {'pendentes': pendentes})

# Aprovar exclusão
@login_required
@user_passes_test(lambda u: u.groups.filter(name='Administrador').exists())
def aprovar_exclusao(request, req_id):
    req = get_object_or_404(TenantDeleteRequest, id=req_id, status='pendente')

    if request.method == "POST":
        schema_name = req.tenant.schema_name

        # Primeiro, atualiza os dados da solicitação
        req.status = 'aprovado'
        req.approved = True
        req.approved_by = request.user
        req.approved_at = timezone.now()
        req.save()  # <--- Salva ANTES de deletar

        # Depois, exclui o tenant
        with connection.cursor() as cursor:
            cursor.execute(f'DROP SCHEMA IF EXISTS "{schema_name}" CASCADE')

        req.tenant.delete()

        messages.success(request, "Tenant excluído com sucesso.")
        return redirect('tenant_management:painel_aprovacoes')

    return render(request, 'tenant_management/confirm_approve.html', {'req': req})


# Rejeitar solicitação de exclusão
@login_required
@user_passes_test(lambda u: u.groups.filter(name='Administrador').exists())
def rejeitar_exclusao_tenant(request, solicitacao_id):
    solicitacao = get_object_or_404(TenantDeleteRequest, id=solicitacao_id)
    solicitacao.delete()
    messages.info(request, "Solicitação de exclusão rejeitada e removida.")
    return redirect('tenant_management:painel_aprovacoes')


from django.db import connection
from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required, user_passes_test
from django.contrib import messages

from .models import Informativo  # importa do app projeto

from django_tenants.utils import schema_context


@login_required
@user_passes_test(lambda u: u.groups.filter(name='Desenvolvedores').exists())
def gerenciar_informativos(request):
    with schema_context('public'):
        if request.method == 'POST':
            Informativo.objects.create(
                titulo=request.POST.get('titulo'),
                mensagem=request.POST.get('mensagem'),
                data_programada=request.POST.get('data_programada')
            )
            messages.success(request, "Informativo salvo para todos os tenants.")
            return redirect('tenant_management:gerenciar_informativos')

        informativos = Informativo.objects.order_by('-data_programada')

    return render(request, 'tenant_management/gerenciar_informativos.html', {
        'informativos': informativos
    })




