# views.py
from django.shortcuts import render, redirect, get_object_or_404
from django.contrib import messages
from django.contrib.auth.models import User
from django.contrib.auth.decorators import login_required
from django.contrib.auth import update_session_auth_hash
from django.views.decorators.http import require_POST
from django.http import JsonResponse
from django.core.files.storage import default_storage
from django.db import IntegrityError
from django.contrib.sessions.models import Session
from django.utils import timezone

from apps.funcionario.models import Funcionario, UsuarioFuncionario, Cargo
from apps.funcionario.forms import FuncionarioForm
from apps.dashboard.utils import get_user_info


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

    user_info = get_user_info(request.user.id)

    if request.method == 'POST':
        form = FuncionarioForm(request.POST, request.FILES)
        if form.is_valid():
            funcionario = form.save(commit=False)
            funcionario.save()

            cargo_ids = request.POST.getlist('cargo')  # <-- Mesmo nome usado no HTML
            print("Cargos enviados:", cargo_ids)
            if cargo_ids:
                funcionario.cargo.set(cargo_ids)

            messages.success(request, 'Funcionário cadastrado com sucesso!')
            return redirect('funcionario_list')
    else:
        form = FuncionarioForm()

    cargos_disponiveis = Cargo.objects.all()
    return render(request, 'funcionarios/create_funcionario.html', {
        'form': form,
        'user_info': user_info,
        'cargos_disponiveis': cargos_disponiveis
    })



def edit_funcionario(request, id):
    if not request.user.is_authenticated:
        return redirect('index')

    user_info = get_user_info(request.user.id)
    funcionario = get_object_or_404(Funcionario, id=id)

    if request.method == 'POST':
        form = FuncionarioForm(request.POST, request.FILES, instance=funcionario)
        if form.is_valid():
            funcionario = form.save(commit=False)
            funcionario.save()

            # Atualiza os cargos (vários cargos com o mesmo nome "cargo" no select)
            cargos_ids = request.POST.getlist('cargo')
            funcionario.cargo.set(cargos_ids)

            messages.success(request, 'Funcionário atualizado com sucesso!')
            return redirect('funcionario_list')
        else:
            messages.error(request, 'Corrija os erros abaixo.')
            print("Erros no formulário:", form.errors)
    else:
        form = FuncionarioForm(instance=funcionario)

    cargos_disponiveis = Cargo.objects.all()

    return render(request, 'funcionarios/edit_funcionario.html', {
        'form': form,
        'funcionario': funcionario,
        'user_info': user_info,
        'cargos_disponiveis': cargos_disponiveis,
    })


@require_POST
def delete_funcionario(request, id):
    funcionario = get_object_or_404(Funcionario, id=id)
    funcionario.delete()
    messages.success(request, 'Funcionário deletado com sucesso!')
    return redirect('funcionario_list')


@login_required
def funcionario_list(request):
    user_info = get_user_info(request.user.id)
    funcionarios = Funcionario.objects.all()
    funcionarios_status = []

    for funcionario in funcionarios:
        if hasattr(funcionario, 'usuariofuncionario'):
            usuario = funcionario.usuariofuncionario.usuario
            online_status = is_user_logged_in(usuario)
        else:
            online_status = False

        funcionarios_status.append({
            'funcionario': funcionario,
            'online_status': online_status,
        })

    return render(request, 'funcionarios/funcionario_list.html', {
        'funcionarios_status': funcionarios_status,
        "user_info": user_info
    })


def create_user_for_funcionario(request, funcionario_id):
    funcionario = get_object_or_404(Funcionario, id=funcionario_id)
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        password_confirm = request.POST.get('password_confirm')
        is_admin = request.POST.get('is_admin') == 'on'
        menu_permissions = request.POST.getlist('menu_permissions')

        if not username:
            return JsonResponse({'success': False, 'error': 'Nome de usuário é obrigatório.'})
        if password != password_confirm:
            return JsonResponse({'success': False, 'error': 'As senhas não correspondem.'})
        if User.objects.filter(username=username).exists():
            return JsonResponse({'success': False, 'error': 'Nome de usuário já existe.'})

        try:
            user = User.objects.create_user(
                username=username,
                password=password,
                email=funcionario.email,
                first_name=funcionario.nome_completo.split()[0],
                last_name=' '.join(funcionario.nome_completo.split()[1:])
            )

            if is_admin:
                menu_permissions = [
                    'dashboard', 'calendario', 'especies', 'sementes', 'repique', 'estufa', 'aclimatacao',
                    'protocolos', 'clientes', 'fornecedores', 'estoque', 'relatorios', 'funcionarios'
                ]

            UsuarioFuncionario.objects.create(
                funcionario=funcionario,
                usuario=user,
                menu_permissions=menu_permissions,
                is_admin=is_admin
            )

            return JsonResponse({'success': True, 'message': 'Usuário criado com sucesso.'})
        except IntegrityError:
            return JsonResponse({'success': False, 'error': 'Nome de usuário já existe.'})
        except Exception as e:
            return JsonResponse({'success': False, 'error': f'Erro ao criar usuário: {str(e)}'})
    else:
        return JsonResponse({'success': False, 'error': 'Método inválido.'})


@require_POST
def delete_user_for_funcionario(request):
    user_id = request.POST.get('user_id')
    if user_id:
        usuario_funcionario = get_object_or_404(UsuarioFuncionario, usuario_id=user_id)
        user = usuario_funcionario.usuario
        usuario_funcionario.delete()
        user.delete()
        return JsonResponse({'success': True, 'message': 'Usuário deletado com sucesso.'})
    return JsonResponse({'success': False, 'error': 'Erro: ID do usuário não fornecido.'})


def update_username(request):
    if request.method == 'POST':
        user_id = request.POST.get('user_id')
        new_username = request.POST.get('username')
        current_password = request.POST.get('current_password')
        user = get_object_or_404(User, id=user_id)

        if not user.check_password(current_password):
            return JsonResponse({'success': False, 'error': 'Senha atual incorreta.'})

        if User.objects.filter(username=new_username).exists():
            return JsonResponse({'success': False, 'error': 'Nome de usuário já existe.'})

        user.username = new_username
        user.save()
        return JsonResponse({'success': True, 'message': 'Nome de usuário atualizado com sucesso.'})


def update_password(request):
    if request.method == 'POST':
        user_id = request.POST.get('user_id')
        new_password = request.POST.get('new_password')
        confirm_password = request.POST.get('confirm_password')
        user = get_object_or_404(User, id=user_id)

        if new_password != confirm_password:
            return JsonResponse({'success': False, 'error': 'As senhas não correspondem.'})

        user.set_password(new_password)
        user.save()
        update_session_auth_hash(request, user)
        return JsonResponse({'success': True, 'message': 'Senha alterada com sucesso.'})


def is_user_logged_in(user):
    sessions = Session.objects.filter(expire_date__gte=timezone.now())
    for session in sessions:
        data = session.get_decoded()
        if data.get('_auth_user_id') == str(user.id):
            return True
    return False


@require_POST
def update_permissions(request):
    user_id = request.POST.get('user_id')
    is_admin = request.POST.get('is_admin') == 'true'
    menu_permissions = request.POST.getlist('menu_permissions')

    if not user_id:
        return JsonResponse({'success': False, 'error': 'ID do usuário não fornecido.'})

    usuario_funcionario = get_object_or_404(UsuarioFuncionario, usuario_id=user_id)

    if is_admin:
        menu_permissions = [
            'dashboard', 'calendario', 'especies', 'sementes', 'repique', 'estufa', 'aclimatacao',
            'protocolos', 'clientes', 'fornecedores', 'estoque', 'relatorios', 'funcionarios', 'paperpot'
        ]

    usuario_funcionario.menu_permissions = menu_permissions
    usuario_funcionario.is_admin = is_admin
    usuario_funcionario.save()

    return JsonResponse({'success': True, 'message': 'Permissões atualizadas com sucesso.'})


def no_permission(request):
    return render(request, 'funcionarios/partials/no_permission.html')
