#!/usr/bin/env python3
"""
Day10 hands-on: human handoff + guardrail mini project
- Modes: selfcheck, single, eval
- Deterministic rules for reproducibility (no model key required)
"""

import argparse
import json
from pathlib import Path

ALLOWED_PRIORITIES = {"low", "medium", "high", "critical"}


def classify(request: dict) -> dict:
    text = request.get("text", "")
    priority = str(request.get("priority", "medium")).lower()
    pii = bool(request.get("pii", False))
    amount = int(request.get("amount", 0))

    if priority not in ALLOWED_PRIORITIES:
        raise ValueError(f"invalid priority: {priority}")

    action = "AUTO_REPLY"
    reasons = []

    if pii:
        reasons.append("PII_DETECTED")
    if amount >= 1000000:
        reasons.append("HIGH_AMOUNT")
    if priority in {"high", "critical"}:
        reasons.append("HIGH_PRIORITY")
    if any(k in text.lower() for k in ["legal", "환불", "분쟁", "complaint", "chargeback"]):
        reasons.append("LEGAL_OR_DISPUTE")

    if reasons:
        action = "HUMAN_HANDOFF"

    response = {
        "action": action,
        "queue": "ops-review" if action == "HUMAN_HANDOFF" else "auto-response",
        "masking": "REQUIRED" if pii else "OPTIONAL",
        "reasons": reasons,
        "final": f"FINAL: action={action}; queue={'ops-review' if action == 'HUMAN_HANDOFF' else 'auto-response'}; masking={'REQUIRED' if pii else 'OPTIONAL'}"
    }
    return response


def run_selfcheck() -> dict:
    cases = [
        {"text": "배송 문의", "priority": "low", "pii": False, "amount": 0, "expect": "AUTO_REPLY"},
        {"text": "결제 분쟁 환불 요청", "priority": "high", "pii": True, "amount": 1200000, "expect": "HUMAN_HANDOFF"},
    ]
    ok = True
    logs = []
    for i, c in enumerate(cases, start=1):
        out = classify(c)
        passed = out["action"] == c["expect"]
        ok = ok and passed
        logs.append({"case": i, "passed": passed, "out": out})
    return {"selfcheck_ok": ok, "logs": logs}


def run_eval(input_path: Path) -> dict:
    tasks = json.loads(input_path.read_text(encoding="utf-8"))
    if not isinstance(tasks, list):
        raise ValueError("input JSON root must be list")

    correct = 0
    details = []
    for i, t in enumerate(tasks, start=1):
        out = classify(t)
        expected = t.get("expected", {})
        pass_action = out["action"] == expected.get("action")
        pass_mask = out["masking"] == expected.get("masking")
        passed = pass_action and pass_mask
        correct += 1 if passed else 0
        details.append({
            "id": i,
            "passed": passed,
            "expected": expected,
            "actual": {"action": out["action"], "masking": out["masking"]},
        })

    score = correct / len(tasks) if tasks else 0.0
    return {"count": len(tasks), "correct": correct, "score": round(score, 2), "pass": score >= 0.66, "details": details}


def main():
    p = argparse.ArgumentParser()
    p.add_argument("--mode", choices=["selfcheck", "single", "eval"], required=True)
    p.add_argument("--text", default="")
    p.add_argument("--priority", default="medium")
    p.add_argument("--pii", type=int, default=0)
    p.add_argument("--amount", type=int, default=0)
    p.add_argument("--input", default="")
    args = p.parse_args()

    if args.mode == "selfcheck":
        print(json.dumps(run_selfcheck(), ensure_ascii=False, indent=2))
        return

    if args.mode == "single":
        request = {
            "text": args.text,
            "priority": args.priority,
            "pii": bool(args.pii),
            "amount": args.amount,
        }
        out = classify(request)
        print(json.dumps({"request": request, "result": out}, ensure_ascii=False, indent=2))
        return

    if args.mode == "eval":
        if not args.input:
            raise ValueError("--input is required in eval mode")
        out = run_eval(Path(args.input))
        print(json.dumps(out, ensure_ascii=False, indent=2))
        return


if __name__ == "__main__":
    main()
