# Create your views here.
from django.shortcuts import render
from django.contrib import messages
from .forms import ValidatePDFForm, DemoRequestForm
from .services import validate_pdf_with_api, ValidatorAPIError
from django.contrib.auth.decorators import login_required, user_passes_test
from django.shortcuts import render, redirect, get_object_or_404
from django.contrib.auth.models import User
from .forms_admin import AdminUserCreateForm, AdminUserEditForm
from .forms import RegisterUserForm

def admin_required(view_func):
    decorated_view_func = login_required(
        user_passes_test(lambda u: u.is_staff, login_url="login")(view_func)
    )
    return decorated_view_func

@admin_required
def admin_users_list(request):
    q = request.GET.get("q", "").strip()

    users = User.objects.all().order_by("-date_joined")

    if q:
        users = users.filter(
            username__icontains=q
        ) | User.objects.filter(
            first_name__icontains=q
        ) | User.objects.filter(
            last_name__icontains=q
        ) | User.objects.filter(
            email__icontains=q
        )

    return render(request, "web/backoffice/users_list.html", {
        "users": users,
        "q": q,
    })


@admin_required
def admin_user_create(request):
    form = AdminUserCreateForm(request.POST or None)

    if request.method == "POST" and form.is_valid():
        form.save()
        messages.success(request, "Usuario creado correctamente.")
        return redirect("web:admin_users_list")

    return render(request, "web/backoffice/user_form.html", {
        "form": form,
        "title": "Nuevo usuario",
        "submit_label": "Crear usuario",
    })


@admin_required
def admin_user_edit(request, user_id):
    user_obj = get_object_or_404(User, id=user_id)
    form = AdminUserEditForm(request.POST or None, instance=user_obj)

    if request.method == "POST" and form.is_valid():
        form.save()
        messages.success(request, "Usuario actualizado correctamente.")
        return redirect("web:admin_users_list")

    return render(request, "web/backoffice/user_form.html", {
        "form": form,
        "title": f"Editar usuario: {user_obj.username}",
        "submit_label": "Guardar cambios",
        "user_obj": user_obj,
    })


@admin_required
def admin_user_toggle_active(request, user_id):
    user_obj = get_object_or_404(User, id=user_id)

    if request.method == "POST":
        if request.user.id == user_obj.id:
            messages.error(request, "No puedes desactivar tu propio usuario desde aquí.")
        else:
            user_obj.is_active = not user_obj.is_active
            user_obj.save()
            estado = "activado" if user_obj.is_active else "desactivado"
            messages.success(request, f"Usuario {estado} correctamente.")

    return redirect("web:admin_users_list")

@login_required
def private_dashboard(request):
    context = {
        "stats": {
            "validated_today": 128,
            "alerts": 7,
            "errors": 3,
            "api_calls": 2450,
        }
    }
    return render(request, "web/private/dashboard.html", context)

@login_required
def private_validate(request):
    return render(request, "web/private/validate.html")

@login_required
def private_history(request):
    history = [
        {"file": "contrato_001.pdf", "status": "OK", "date": "2026-02-25 14:32"},
        {"file": "factura_882.pdf", "status": "WARNING", "date": "2026-02-25 13:18"},
        {"file": "certificado_a.pdf", "status": "ERROR", "date": "2026-02-25 12:05"},
    ]
    return render(request, "web/private/history.html", {"history": history})

@login_required
def private_api(request):
    return render(request, "web/private/api.html")

def home(request):
    return render(request, "web/home.html")

def validate_document(request):
    form = ValidatePDFForm(request.POST or None, request.FILES or None)
    api_response = None

    if request.method == "POST" and form.is_valid():
        pdf_file = form.cleaned_data["pdf"]

        try:
            api_response = validate_pdf_with_api(pdf_file)
            messages.success(request, "Documento validado correctamente.")
        except ValidatorAPIError as e:
            messages.error(request, str(e))
        except Exception:
            messages.error(request, "Ocurrió un error inesperado al validar el documento.")

    return render(
        request,
        "web/validate.html",
        {
            "form": form,
            "api_response": api_response,
        },
    )

def request_demo(request):
    form = DemoRequestForm(request.POST or None)
    if request.method == "POST" and form.is_valid():
        # TODO: guardar en BD / enviar email / CRM
        messages.success(request, "Solicitud enviada. Te contactaremos pronto.")
        form = DemoRequestForm()  # limpia
    return render(request, "web/demo.html", {"form": form})

def security(request):
    return render(request, "web/security.html")

def solutions(request):
    return render(request, "web/solutions.html")

def sectors(request):
    return render(request, "web/sectors.html")

def signer(request):
    return render(request, "web/signer.html")

@login_required
def private_profile(request):
    return render(request, "web/private/profile.html")

def register_user(request):
    form = RegisterUserForm(request.POST or None)

    if request.method == "POST" and form.is_valid():
        form.save()
        messages.success(request, "Usuario creado correctamente. Ahora puedes iniciar sesión.")
        return redirect("login")

    return render(request, "registration/register.html", {"form": form})