"""
FreeExile Design Pipeline CLI.
Provides command-line interface for scanning, dispatching, auditing, and reporting design requests.
"""

from __future__ import annotations

import argparse
from tools.asset_pipeline.design_pipeline_types import ApprovalVerdict


def main() -> None:
    from tools.asset_pipeline.design_pipeline_manager import DesignPipelineManager

    parser = argparse.ArgumentParser(description="FreeExile Autonomous Design Pipeline Manager")
    subparsers = parser.add_subparsers(dest="command", help="Available commands")

    subparsers.add_parser("scan", help="Scan inbox for pending design requests")
    subparsers.add_parser("report", help="Generate full pipeline status report")

    p_dispatch = subparsers.add_parser("dispatch", help="Dispatch request from inbox to in_progress")
    p_dispatch.add_argument("--id", required=True, help="Request ID")
    p_dispatch.add_argument("--agent", help="Assigned Subagent name")

    p_submit = subparsers.add_parser("submit", help="Submit deliverables for review")
    p_submit.add_argument("--id", required=True, help="Request ID")
    p_submit.add_argument("--files", nargs="*", default=[], help="Delivered asset filenames")

    p_qa = subparsers.add_parser("qa-audit", help="Stage 1: QA technical verification")
    p_qa.add_argument("--id", required=True, help="Request ID")
    p_qa.add_argument("--auditor", default="qa_stress_tester", help="Auditor agent name")
    p_qa.add_argument("--verdict", choices=["pass", "fail"], default=None, help="Explicit verdict override")
    p_qa.add_argument("--notes", default="", help="Audit notes")

    p_ceo = subparsers.add_parser("ceo-audit", help="Stage 2: CEO aesthetic & lore approval")
    p_ceo.add_argument("--id", required=True, help="Request ID")
    p_ceo.add_argument("--approver", default="studio_producer", help="Approver name")
    p_ceo.add_argument("--verdict", choices=["approve", "reject"], default="approve", help="Approval verdict")
    p_ceo.add_argument("--notes", default="Approved", help="Approval or rejection notes")
    p_ceo.add_argument("--sync-client", help="Client assets subfolder to sync approved files into")

    args = parser.parse_args()
    mgr = DesignPipelineManager()

    if args.command == "scan":
        inbox_reqs = mgr.scan_inbox()
        print(f"[SCAN] Found {len(inbox_reqs)} request(s) in inbox:")
        for r in inbox_reqs:
            print(f"  - [{r.priority.value.upper()}] {r.request_id}: {r.title} (Agent: {r.assigned_agent})")

    elif args.command == "report":
        print(mgr.generate_status_report())

    elif args.command == "dispatch":
        req = mgr.dispatch_request(args.id, args.agent)
        print(f"[DISPATCH] Request {req.request_id} moved to in_progress. Assigned to {req.assigned_agent}.")

    elif args.command == "submit":
        req = mgr.submit_for_review(args.id, args.files)
        print(f"[SUBMIT] Request {req.request_id} moved to pending_review with {len(args.files)} deliverables.")

    elif args.command == "qa-audit":
        override = ApprovalVerdict(args.verdict) if args.verdict else None
        passed, notes, deliverables = mgr.qa_technical_audit(
            args.id, auditor=args.auditor, override_verdict=override, notes=args.notes
        )
        print(f"[QA AUDIT] Result: {'PASS' if passed else 'FAIL'}")
        print(f"Notes: {notes}")
        for d in deliverables:
            print(f"  - {d.relative_path}: {d.width}x{d.height} | {d.file_size_bytes}B | POT={d.is_power_of_two}")

    elif args.command == "ceo-audit":
        verdict = ApprovalVerdict.APPROVE if args.verdict == "approve" else ApprovalVerdict.REJECT
        req = mgr.ceo_aesthetic_audit(
            args.id,
            approver=args.approver,
            verdict=verdict,
            notes=args.notes,
            sync_to_client_subfolder=args.sync_client,
        )
        print(f"[CEO AUDIT] Request {req.request_id} -> {req.status.value.upper()}.")

    else:
        parser.print_help()


if __name__ == "__main__":
    main()
