from django.shortcuts import render, redirect
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.db import connection
from django.contrib.auth.models import Group
from .models import CustomUser, Client
from .forms import CustomUserForm
from login.views import group_required
from django.shortcuts import render, get_object_or_404, redirect
from django.contrib.auth import get_user_model
from django.utils.timezone import now, timedelta

@login_required
@group_required('Desenvolvedores')  # Garantindo que apenas Desenvolvedores possam acessar
def register_user(request):
    if request.method == "POST":
        form = CustomUserForm(request.POST)
        if form.is_valid():
            user = form.save(commit=False)
            username_novo = form.cleaned_data['username']
            email_novo = form.cleaned_data['email']

            # 🔍 Verifica se username OU email já existem em qualquer tenant
            from django.db import connections
            schema_atual = connection.schema_name
            conflito = None

            for tenant in Client.objects.all():
                connection.set_schema(tenant.schema_name)
                if CustomUser.objects.filter(username=username_novo).exists():
                    conflito = f"Já existe um usuário com o nome '{username_novo}' em outro tenant."
                    break
                if CustomUser.objects.filter(email=email_novo).exists():
                    conflito = f"Já existe um usuário com o e-mail '{email_novo}' em outro tenant."
                    break

            connection.set_schema(schema_atual)

            if conflito:
                messages.error(request, conflito)
                return render(request, "users/register_user.html", {"form": form})

            # Define a senha usando a função `set_password`
            user.set_password(form.cleaned_data['password'])

            # Obtém o tenant (schema) do formulário e associa ao usuário
            try:
                tenant = Client.objects.get(schema_name=form.cleaned_data['schema_name'])
                user.tenant = tenant
            except Client.DoesNotExist:
                messages.error(request, "Tenant (schema) especificado não encontrado.")
                return render(request, "users/register_user.html", {"form": form})

            # Define o usuário como trial automaticamente
            user.on_trial = True
            user.trial_expiration = form.cleaned_data['trial_expiration']

            user.save()

            # Associar o usuário ao grupo especificado
            group = Group.objects.get(name='Comum')  # Ajuste se o grupo for diferente
            user.groups.add(group)

            # Define o schema no contexto do banco para o tenant correto
            connection.set_schema(tenant.schema_name)

            messages.success(request, f"Usuário cadastrado com sucesso! Acesso de teste válido até {user.trial_expiration}.")
            return redirect("/users/home/")
        else:
            messages.error(request, "Erro ao cadastrar o usuário. Verifique os dados.")
    else:
        form = CustomUserForm()

    return render(request, "users/register_user.html", {"form": form})




@login_required
@group_required('Desenvolvedores')
def edit_user(request, user_id):
    CustomUser = get_user_model()
    user = get_object_or_404(CustomUser, id=user_id)

    if request.method == 'POST':
        form = CustomUserForm(request.POST, instance=user)
        if form.is_valid():
            updated_user = form.save(commit=False)

            # Atualiza a senha somente se for fornecida
            password = form.cleaned_data.get('password')
            if password:
                updated_user.set_password(password)
            updated_user.save()

            messages.success(request, f'Usuário {updated_user.username} atualizado com sucesso!')
            return redirect('usuarios_tenants_schema')
        else:
            messages.error(request, "Erro ao atualizar usuário. Verifique os dados.")
    else:
        form = CustomUserForm(instance=user)

    return render(request, 'users/edit_user.html', {'form': form, 'user': user})
