#!/usr/bin/env python3
"""
Run two agent files against each other locally.

Usage:
    python scripts/play_vs_agent.py path/to/agent_a.py path/to/agent_b.py [--games 20] [--verbose]

Both agents must define play_turn(board, piece_to_place, pieces_left).
"""

import argparse
import importlib.util
import sys
from pathlib import Path

ROOT = Path(__file__).parent.parent
sys.path.insert(0, str(ROOT))

from engine.runner import run_match


def load_module(path: str, label: str):
    p = Path(path).resolve()
    if not p.exists():
        print(f"Error: {label} file not found: {p}", file=sys.stderr)
        sys.exit(1)
    spec = importlib.util.spec_from_file_location(label, p)
    module = importlib.util.module_from_spec(spec)
    spec.loader.exec_module(module)
    return module


def main():
    parser = argparse.ArgumentParser(description="Play two agents against each other.")
    parser.add_argument("agent_a", help="Path to agent A .py file")
    parser.add_argument("agent_b", help="Path to agent B .py file")
    parser.add_argument("--games", type=int, default=20)
    parser.add_argument("--seed", type=int, default=None)
    parser.add_argument("--verbose", "-v", action="store_true")
    args = parser.parse_args()

    mod_a = load_module(args.agent_a, "agent_a")
    mod_b = load_module(args.agent_b, "agent_b")

    name_a = Path(args.agent_a).stem
    name_b = Path(args.agent_b).stem

    print(f"\n{'─'*54}")
    print(f"  {name_a}  vs  {name_b}")
    print(f"  {args.games} games")
    print(f"{'─'*54}\n")

    import random as _random
    rng = _random.Random(args.seed)
    wins_a = wins_b = draws = forfeits = 0

    for i in range(args.games):
        seed = rng.randint(0, 2**31)
        # Alternate sides for fairness
        if i % 2 == 0:
            result = run_match(mod_a, mod_b, seed=seed)
            a_is_a = True
        else:
            result = run_match(mod_b, mod_a, seed=seed)
            a_is_a = False

        if 'forfeit' in result.winner:
            forfeits += 1
            label = f"FORFEIT ({'A' if 'a' in result.winner else 'B'})"
        elif result.winner == 'draw':
            draws += 1
            label = "Draw"
        elif (result.winner == 'a') == a_is_a:
            wins_a += 1
            label = f"WIN {name_a}"
        else:
            wins_b += 1
            label = f"WIN {name_b}"

        if args.verbose:
            print(f"  Game {i+1:2d}/{args.games}: {label:25s}  ({result.turns} turns)")

    total = wins_a + wins_b + draws
    print(f"\n{'─'*54}")
    print(f"  {name_a:20s}: {wins_a:3d}W  ({wins_a/max(total,1)*100:.1f}%)")
    print(f"  {name_b:20s}: {wins_b:3d}W  ({wins_b/max(total,1)*100:.1f}%)")
    print(f"  Draws:               {draws:3d}    Forfeits: {forfeits}")
    print(f"{'─'*54}\n")


if __name__ == "__main__":
    main()
