"""Measure Hindi character error rate on a folder of recordings you may use.

Each sample is a pair:

    sample.wav
    sample.txt

The text file is the reference transcript in Devanagari. From the project folder:

    .\\.venv\\Scripts\\python.exe -m app.eval_hindi data\\hindi-test
"""

from __future__ import annotations

import argparse
import sys
from pathlib import Path

from app.config import get_settings
from app.text import cer


def main(argv: list[str] | None = None) -> int:
    parser = argparse.ArgumentParser(description="Measure Hindi transcript accuracy.")
    parser.add_argument("dataset", help="Folder of wav/txt pairs")
    parser.add_argument("--model", default=None, help="Speech model, such as medium or large-v3")
    args = parser.parse_args(argv)
    folder = Path(args.dataset)
    if not folder.is_dir():
        print(f"No folder at {folder}. Put wav and matching txt files there.", file=sys.stderr)
        return 2
    pairs = []
    for audio in sorted(folder.glob("*.wav")):
        reference = audio.with_suffix(".txt")
        if reference.is_file():
            pairs.append((audio, reference))
    if not pairs:
        print("No wav/txt pairs were found.", file=sys.stderr)
        return 2

    settings = get_settings()
    model_name = args.model or settings.whisper_model
    try:
        from faster_whisper import WhisperModel
    except ImportError:
        print("The speech engine is not installed.", file=sys.stderr)
        return 2
    settings.model_dir.mkdir(parents=True, exist_ok=True)
    model = WhisperModel(
        model_name,
        device="cpu",
        compute_type="int8",
        download_root=str(settings.model_dir),
    )
    scores = []
    for audio, reference in pairs:
        expected = reference.read_text(encoding="utf-8-sig")
        segments, _info = model.transcribe(str(audio), language="hi", vad_filter=True, beam_size=5)
        heard = " ".join(segment.text.strip() for segment in segments)
        score = cer(expected, heard)
        scores.append(score)
        print(f"{audio.name}\t{score:.3f}")
    mean = sum(scores) / len(scores)
    print(f"mean\t{mean:.3f}")
    print(f"limit\t{settings.hindi_cer_max:.3f}")
    print(f"model\t{model_name}")
    if mean <= settings.hindi_cer_max and model_name in {"medium", "large", "large-v2", "large-v3"}:
        print("This measurement can be written into config/launch-gates.json notes.hindi_cer.")
        return 0
    if model_name not in {"medium", "large", "large-v2", "large-v3"}:
        print("A launch measurement has to use medium or large-v3.", file=sys.stderr)
    else:
        print("The mean is above the launch limit.", file=sys.stderr)
    return 1


if __name__ == "__main__":
    raise SystemExit(main())
