"""Browser proctoring / anti-cheat analysis."""

from app.schemas.common import JobStatus
from app.schemas.proctoring import (
    ProctoringAnalyzeRequest,
    ProctoringAnalyzeResponse,
    ProctoringFlag,
)
from app.services.ai_generate import generate_json


class ProctoringService:
    async def analyze(self, payload: ProctoringAnalyzeRequest) -> ProctoringAnalyzeResponse:
        system = (
            "Analyze proctoring events for integrity risk. Return JSON: "
            "{\"risk_score\":0-1,\"integrity_passed\":bool,\"flags\":"
            "[{\"event_type\",\"severity\",\"count\",\"notes\"}],\"recommendation\"}"
        )
        user = (
            f"Interview: {payload.interview_id}\nDuration: {payload.duration_seconds}\n"
            f"Events: {payload.events}"
        )

        def local() -> dict:
            counts: dict[str, int] = {}
            for e in payload.events:
                if isinstance(e, dict):
                    et = str(e.get("event_type") or e.get("type") or "unknown")
                    counts[et] = counts.get(et, 0) + int(e.get("count") or 1)
            flags = []
            risk = 0.1
            for et, count in counts.items():
                severity = "high" if et in {"multi_face", "copy_paste"} and count >= 1 else (
                    "medium" if et == "tab_switch" and count >= 3 else "low"
                )
                if severity == "high":
                    risk += 0.35
                elif severity == "medium":
                    risk += 0.15
                else:
                    risk += 0.05 * min(count, 3)
                flags.append(
                    {
                        "event_type": et,
                        "severity": severity,
                        "count": count,
                        "notes": f"Detected {count}x {et}",
                    }
                )
            risk = min(0.99, risk)
            passed = risk < 0.55
            return {
                "risk_score": round(risk, 2),
                "integrity_passed": passed,
                "flags": flags,
                "recommendation": "accept" if passed else "manual_review",
            }

        data, stub, provider = await generate_json(
            system=system, user=user, local_factory=local
        )
        flags = [
            ProctoringFlag(
                event_type=str(f.get("event_type", "unknown")),
                severity=str(f.get("severity", "low")),
                count=int(f.get("count") or 1),
                notes=f.get("notes"),
            )
            for f in (data.get("flags") or [])
            if isinstance(f, dict)
        ]
        return ProctoringAnalyzeResponse(
            correlation_id=payload.correlation_id,
            interview_id=payload.interview_id,
            status=JobStatus.SUCCEEDED,
            stub=stub,
            message=f"Proctoring analysis via {provider}",
            risk_score=data.get("risk_score"),
            integrity_passed=data.get("integrity_passed"),
            flags=flags,
            recommendation=data.get("recommendation"),
        )
