"""Read-only queue filters and bounded SQL context; no action authorization."""
from django.db.models import OuterRef, Subquery, Case, When, Value, CharField
from django.http import Http404
from apps.service.models import ServiceCaseComplaint, ServiceEngineerAssignment, ServiceDiagnosticAssessment, ServiceRepairExecution, ServiceQualityControl
from apps.service.quality_control_queries import quality_control_visible_cases
from apps.sla.queries import records


def filtered(rows, actor, bucket, phase):
    filters = {
        "mine": {"assigned": ("ASSIGNED",), "diagnosis": ("DIAGNOSING",), "repair": ("DIAGNOSED", "REPAIRING", "REPAIRED")},
        "qc": {"pending": ("REPAIRED", "QC_PENDING"), "in-progress": ("QC_IN_PROGRESS",), "passed": ("QC_PASSED",)},
    }
    if phase == "rework":
        latest = ServiceQualityControl.objects.filter(service_case_id=OuterRef("pk")).order_by("-started_at", "-pk")
        rows = rows.filter(pk__in=quality_control_visible_cases(actor)).annotate(
            workspace_qc_outcome=Subquery(latest.values("outcome")[:1]),
            workspace_qc_inspector=Subquery(latest.values("inspector_id")[:1]),
        ).filter(workspace_qc_outcome="FAILED")
        return rows.filter(workspace_qc_inspector=actor.pk) if bucket == "qc" else rows
    if phase:
        if phase not in filters[bucket]:
            raise Http404
        return rows.filter(status__in=filters[bucket][phase])
    return rows


def enriched(rows, actor):
    diagnosis = ServiceDiagnosticAssessment.objects.filter(service_case_id=OuterRef("pk")).order_by("-started_at", "-pk").annotate(
        evidence_state=Case(When(completed_at__isnull=False, then=Value("Completed")),
            When(abandoned_at__isnull=False, then=Value("Abandoned")), default=Value("In progress"), output_field=CharField()))
    repair = ServiceRepairExecution.objects.filter(service_case_id=OuterRef("pk")).order_by("-started_at", "-pk")
    return rows.annotate(
        workspace_complaint=Subquery(ServiceCaseComplaint.objects.filter(service_case_id=OuterRef("pk"), removed_at=None).order_by("pk").values("complaint_symptom__name")[:1]),
        workspace_assigned=Subquery(ServiceEngineerAssignment.objects.filter(service_case_id=OuterRef("pk"), ended_at=None).values("assigned_at")[:1]),
        workspace_diagnosis=Subquery(diagnosis.values("evidence_state")[:1]),
        workspace_repair=Subquery(repair.values("status")[:1]),
        workspace_outcome=Subquery(repair.values("outcome")[:1]),
        workspace_sla=Subquery(records(actor).filter(service_case_id=OuterRef("pk")).values("sla_state")[:1]),
    )


def facts(row):
    return [("Recorded complaint", row.workspace_complaint or "Not recorded"),
            ("Assigned", row.workspace_assigned), ("Latest diagnosis", row.workspace_diagnosis or "Not started"),
            ("Latest repair", row.workspace_repair or "Not started"), ("Repair outcome", row.workspace_outcome),
            ("SLA", row.workspace_sla or "No evidence in your authorized SLA scope")]
