from django.contrib import messages
from django.core.exceptions import ValidationError
from django.shortcuts import get_object_or_404, redirect, render

from apps.accounts.permissions import ROLE_HR_ADMIN, ROLE_SUPER_ADMIN, accessible_company_ids, require_roles, scope_queryset_by_company
from .forms import ImportUploadForm
from .models import ImportJob
from .services import confirm_import_job, validate_import_job


@require_roles(ROLE_SUPER_ADMIN, ROLE_HR_ADMIN)
def job_list(request):
    jobs = scope_queryset_by_company(request.user, ImportJob.objects.select_related("company", "created_by"), "company").order_by("-created_at")[:200]
    form = ImportUploadForm(company_ids=accessible_company_ids(request.user))
    return render(request, "imports/job_list.html", {"jobs": jobs, "form": form})


@require_roles(ROLE_SUPER_ADMIN, ROLE_HR_ADMIN)
def job_upload(request):
    if request.method != "POST":
        return redirect("imports:list")
    form = ImportUploadForm(request.POST, request.FILES, company_ids=accessible_company_ids(request.user))
    if form.is_valid():
        job = form.save(commit=False)
        job.created_by = request.user
        job.status = "UPLOADED"
        job.save()
        messages.success(request, "CSV uploaded. Validate it before importing.")
        return redirect("imports:detail", pk=job.pk)
    messages.error(request, "Import upload failed: " + "; ".join([str(e) for errors in form.errors.values() for e in errors]))
    return redirect("imports:list")


@require_roles(ROLE_SUPER_ADMIN, ROLE_HR_ADMIN)
def job_detail(request, pk):
    job = get_object_or_404(scope_queryset_by_company(request.user, ImportJob.objects.select_related("company", "created_by"), "company"), pk=pk)
    return render(request, "imports/job_detail.html", {"job": job, "errors": job.row_errors.order_by("row_number")[:500]})


@require_roles(ROLE_SUPER_ADMIN, ROLE_HR_ADMIN)
def job_validate(request, pk):
    job = get_object_or_404(scope_queryset_by_company(request.user, ImportJob.objects.all(), "company"), pk=pk)
    if request.method == "POST":
        try:
            validate_import_job(job, user=request.user)
            messages.success(request, "Validation completed. Review errors/preview before confirmation.")
        except ValidationError as exc:
            messages.error(request, str(exc))
    return redirect("imports:detail", pk=pk)


@require_roles(ROLE_SUPER_ADMIN, ROLE_HR_ADMIN)
def job_confirm(request, pk):
    job = get_object_or_404(scope_queryset_by_company(request.user, ImportJob.objects.all(), "company"), pk=pk)
    if request.method == "POST":
        try:
            confirm_import_job(job, user=request.user)
            messages.success(request, "Validated data imported successfully with audit trail.")
        except ValidationError as exc:
            messages.error(request, str(exc))
    return redirect("imports:detail", pk=pk)
