# app_home/views.py (CÓDIGO COMPLETO E CORRIGIDO)
import datetime
import locale
from django.contrib.auth.models import User # Importe o User
from django.db.models import Q # Importe o Q para buscas complexas
from django.shortcuts import get_object_or_404 # Para buscar o usuário com segurança
from django.shortcuts import render, redirect
from django.contrib import messages
from django.contrib.auth.decorators import login_required, permission_required
from django.db import transaction
from django.views.decorators.cache import never_cache
from .forms import UserRegistrationForm, FuncionarioProfileForm, UserEditForm



@never_cache
@login_required
def home(request):
    # --- LÓGICA ATUALIZADA PARA DATA E HORA ---
    try:
        locale.setlocale(locale.LC_TIME, 'pt_BR.UTF-8')
    except locale.Error:
        try:
            locale.setlocale(locale.LC_TIME, 'Portuguese_Brazil.1252')
        except locale.Error:
            print("Aviso: Locale 'pt_BR' não encontrado. O mês pode aparecer em inglês.")

    agora = datetime.datetime.now()
    
    # Formata APENAS a data
    data_formatada = agora.strftime("%d de %B de %Y")
    # Formata APENAS a hora inicial (HH:MM:SS)
    hora_inicial_formatada = agora.strftime("%H:%M:%S")

    context = {
        'data_atual': data_formatada,
        'hora_inicial': hora_inicial_formatada # Nova variável para a hora
    }
    # --- FIM da lógica de data e hora ---
    
    return render(request, 'home/home.html', context)


# --- View cadastrar_funcionario (sem alterações) ---
@never_cache
@login_required
@permission_required('app_home.add_funcionario', raise_exception=True)
@transaction.atomic
def cadastrar_funcionario(request):
    """
    View para cadastrar um novo funcionário (User + Funcionario).
    """
    if request.method == 'POST':
        user_form = UserRegistrationForm(request.POST)
        profile_form = FuncionarioProfileForm(request.POST, request.FILES)

        if user_form.is_valid() and profile_form.is_valid():
            user = user_form.save()
            profile = profile_form.save(commit=False)
            profile.user = user
            profile.save()
            messages.success(request, f'Funcionário "{user.username}" cadastrado com sucesso!')
            return redirect('home')
        else:
            messages.error(request, 'Por favor, corrija os erros abaixo.')
    else:
        user_form = UserRegistrationForm()
        profile_form = FuncionarioProfileForm()

    context = {
        'user_form': user_form,
        'profile_form': profile_form
    }
    # A view cadastrar_funcionario renderiza o seu próprio template
    return render(request, 'home/cadastrar_funcionario.html', context)

# --------- View lista_usuarios | gerenciador de usuarios ---------#
@never_cache
@login_required
def lista_usuarios(request):
    """
    Lista todos os usuários com opção de filtro e paginação simples.
    """
    # Verifica se é admin/staff para segurança
    if not request.user.is_staff:
        messages.error(request, "Você não tem permissão para acessar esta página.")
        return redirect('home')

    termo_busca = request.GET.get('q', '')
    filtro_status = request.GET.get('status', '')

    # Busca todos os usuários ordenados pelo nome
    usuarios = User.objects.all().order_by('first_name')

    # Aplica filtro de busca (Nome, Sobrenome ou Username)
    if termo_busca:
        usuarios = usuarios.filter(
            Q(first_name__icontains=termo_busca) | 
            Q(last_name__icontains=termo_busca) | 
            Q(username__icontains=termo_busca) |
            Q(email__icontains=termo_busca)
        )

    # Aplica filtro de status (Ativo/Inativo)
    if filtro_status == 'ativos':
        usuarios = usuarios.filter(is_active=True)
    elif filtro_status == 'inativos':
        usuarios = usuarios.filter(is_active=False)

    context = {
        'usuarios': usuarios,
        'termo_busca': termo_busca,
        'filtro_status': filtro_status
    }
    
    return render(request, 'home/lista_usuarios.html', context)


# --------- View toggle_status_usuario | gerenciador de usuarios ---------#
@login_required
@transaction.atomic
def toggle_status_usuario(request, user_id):
    """
    Alterna o status de um usuário (Ativar/Desativar).
    """
    if not request.user.is_staff:
        return redirect('home')

    usuario_alvo = get_object_or_404(User, pk=user_id)

    # Impede que o admin desative a si mesmo para não se trancar fora do sistema
    if usuario_alvo == request.user:
        messages.error(request, "Você não pode desativar o seu próprio usuário!")
    else:
        # Inverte o status
        usuario_alvo.is_active = not usuario_alvo.is_active
        usuario_alvo.save()
        
        status_msg = "ativado" if usuario_alvo.is_active else "desativado"
        messages.success(request, f"Usuário {usuario_alvo.username} foi {status_msg} com sucesso.")

    return redirect('lista_usuarios')


# --------- View editar_usuario ---------#
@never_cache
@login_required
@transaction.atomic
def editar_usuario(request, user_id):
    # Apenas Staff pode editar
    if not request.user.is_staff:
        messages.error(request, "Permissão negada.")
        return redirect('home')

    # Busca o usuário ou retorna erro 404
    usuario_alvo = get_object_or_404(User, pk=user_id)
    
    # Garante que o usuário tem um perfil de funcionário (caso tenha sido criado via admin puro)
    if not hasattr(usuario_alvo, 'funcionario'):
        from .models import Funcionario
        Funcionario.objects.create(user=usuario_alvo)

    if request.method == 'POST':
        # Carrega os formulários com os dados POST e as instâncias atuais
        user_form = UserEditForm(request.POST, instance=usuario_alvo)
        profile_form = FuncionarioProfileForm(request.POST, request.FILES, instance=usuario_alvo.funcionario)

        if user_form.is_valid() and profile_form.is_valid():
            user_form.save()
            profile_form.save()
            messages.success(request, f"Dados de {usuario_alvo.username} atualizados com sucesso!")
            return redirect('lista_usuarios')
        else:
            messages.error(request, "Corrija os erros abaixo.")
    else:
        # GET: Carrega os formulários com os dados do banco
        user_form = UserEditForm(instance=usuario_alvo)
        profile_form = FuncionarioProfileForm(instance=usuario_alvo.funcionario)

    context = {
        'user_form': user_form,
        'profile_form': profile_form,
        'usuario_alvo': usuario_alvo # Para mostrar o nome no título
    }
    return render(request, 'home/editar_usuario.html', context)