#!/usr/bin/env python3.12
"""
Check that site directories (and optional DESIGN.md) exist for a batch without creating anything.
Exit codes: 0=all present, 1=missing dirs/files, 2=input error
"""
from __future__ import annotations

import argparse
import pathlib
import re
from typing import List, Tuple


def parse_batch(batch_path: pathlib.Path) -> Tuple[str, List[str]]:
    version = "v1"
    domains: List[str] = []
    text = batch_path.read_text(encoding="utf-8")
    for line in text.splitlines():
        line_stripped = line.strip()
        m = re.match(r"\*\*Target Version\*\*:\s*(v?[0-9]+)", line_stripped, re.IGNORECASE)
        if m:
            version = m.group(1)
        if line_stripped.startswith("|") and "Domain" not in line_stripped and "----" not in line_stripped:
            parts = [c.strip() for c in line_stripped.strip("|").split("|")]
            if parts and parts[0]:
                domains.append(parts[0])
    if not version.lower().startswith("v"):
        version = f"v{version}"
    return version, domains


def main() -> int:
    parser = argparse.ArgumentParser(description="Check site directories for a batch")
    parser.add_argument("--root", default=".", help="Repo root (default: .)")
    parser.add_argument("--batch-id", required=True, help="Batch ID, e.g., 001")
    parser.add_argument(
        "--require-design",
        action="store_true",
        help="Also require DESIGN.md inside each site directory",
    )
    args = parser.parse_args()

    root = pathlib.Path(args.root).resolve()
    batch_path = root / ".smbatcher" / "batches" / f"Batch_{args.batch_id}.md"
    if not batch_path.exists():
        print(f"ERROR:batch_not_found:{batch_path}")
        return 2

    version, domains = parse_batch(batch_path)
    if not domains:
        print(f"ERROR:no_domains_in_batch:{batch_path}")
        return 2

    missing_dirs: List[str] = []
    missing_designs: List[str] = []
    for domain in domains:
        site_dir = root / "sites" / f"{domain}-{version}"
        if not site_dir.exists():
            missing_dirs.append(str(site_dir))
            continue
        if args.require_design:
            design_path = site_dir / "DESIGN.md"
            if not design_path.exists():
                missing_designs.append(str(design_path))

    if missing_dirs:
        print(f"WARN:missing_dirs:{len(missing_dirs)}")
        for path in missing_dirs:
            print(f"  - {path}")
    if args.require_design and missing_designs:
        print(f"WARN:missing_designs:{len(missing_designs)}")
        for path in missing_designs:
            print(f"  - {path}")

    if missing_dirs or missing_designs:
        print(f"FAIL:incomplete:{len(missing_dirs)} dirs, {len(missing_designs)} designs missing")
        return 1

    print(f"OK:all_present:{len(domains)} sites (version {version})"
          + (" with DESIGN.md" if args.require_design else ""))
    return 0


if __name__ == "__main__":
    raise SystemExit(main())
