#!/usr/bin/env python3
from __future__ import annotations

import argparse
import csv
import hashlib
import json
import sys
from dataclasses import asdict
from pathlib import Path

ROOT = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(ROOT))

from assignment_tool.engine import generate_assignments, input_checksum, load_players, load_profile
from assignment_tool.pdf_generator import generate_print_pdf


def main() -> int:
    parser = argparse.ArgumentParser(description="Calculate and prefill Mah Jongg assignments")
    parser.add_argument("roster", type=Path)
    parser.add_argument(
        "--tables",
        type=int,
        help="Number of tables; defaults to the highest start_table in the roster",
    )
    parser.add_argument("--rounds", type=int, default=12)
    parser.add_argument("--output", required=True, type=Path)
    parser.add_argument("--profile", type=Path, default=ROOT / "movement_profiles" / "mj-default-v1.json")
    args = parser.parse_args()
    if args.output.exists():
        raise FileExistsError(f"Refusing to replace existing output: {args.output}")
    args.output.mkdir(parents=True)

    players = load_players(args.roster)
    table_count = args.tables if args.tables is not None else max(player.start_table for player in players)
    profile = load_profile(args.profile)
    assignments = generate_assignments(players, table_count, args.rounds, profile)
    fieldnames = ["player_id", "player_name", "round", "table", "seat"]
    for filename, rows in (
        ("assignments_by_player.csv", sorted(assignments, key=lambda a: (int(a.player_id), a.round))),
        ("assignments_by_round.csv", sorted(assignments, key=lambda a: (a.round, a.table, a.seat))),
    ):
        with (args.output / filename).open("w", newline="") as handle:
            writer = csv.DictWriter(handle, fieldnames=fieldnames)
            writer.writeheader()
            writer.writerows(asdict(row) for row in rows)
    template = json.loads((ROOT / "profiles" / "mj-rc5" / "template.json").read_text())
    generate_print_pdf(
        ROOT / "profiles" / "mj-rc5" / "MJ_RC5_2up.pdf",
        template,
        assignments,
        args.rounds,
        args.output / "MJ_RC5_prefilled_print_sequence.pdf",
    )
    manifest = {
        "profile_key": profile["profile_key"],
        "profile_version": profile["version"],
        "table_count": table_count,
        "round_count": args.rounds,
        "player_count": len(players),
        "assignment_count": len(assignments),
        "input_checksum": input_checksum(players, table_count, args.rounds, profile),
        "two_up_template_sha256": hashlib.sha256(
            (ROOT / "profiles" / "mj-rc5" / "MJ_RC5_2up.pdf").read_bytes()
        ).hexdigest(),
        "print_order": "player-major; first-half rounds paired with second-half rounds",
    }
    (args.output / "generation_manifest.json").write_text(json.dumps(manifest, indent=2) + "\n")
    print(f"PASS: {len(assignments)} assignments validated; {len(players)} players; {args.rounds} rounds")
    print(f"Output: {args.output}")
    return 0


if __name__ == "__main__":
    raise SystemExit(main())
