import argparse
from pathlib import Path

from faster_whisper import WhisperModel


def timestamp(seconds):
    minutes, seconds = divmod(int(seconds), 60)
    hours, minutes = divmod(minutes, 60)
    return f"{hours:02d}:{minutes:02d}:{seconds:02d}"


def transcribe(model, audio, language="en", vad_filter=False):
    segments, info = model.transcribe(str(audio), language=language, beam_size=3, vad_filter=vad_filter)
    lines = [(segment.start, segment.text.strip()) for segment in segments if segment.text.strip()]
    return lines, info.language


def main():
    parser = argparse.ArgumentParser(description="Transcribe an English recording locally.")
    parser.add_argument("audio", type=Path)
    parser.add_argument("--output", type=Path)
    args = parser.parse_args()

    if not args.audio.is_file():
        parser.error(f"Audio file not found: {args.audio}")
    output = args.output or args.audio.with_name(args.audio.stem + ".transcript.md")
    if output.exists():
        parser.error(f"{output} already exists. Choose a new path with --output.")

    model = WhisperModel("tiny.en", device="cpu", compute_type="int8")
    lines, _ = transcribe(model, args.audio)
    if not lines:
        raise SystemExit("No speech was transcribed. Try a clear recording with one speaker.")
    paragraphs = [f"[{timestamp(start)}] {text}" for start, text in lines]
    try:
        with output.open("x", encoding="utf-8") as transcript:
            transcript.write("\n\n".join(paragraphs) + "\n")
    except OSError as error:
        raise SystemExit(f"Could not save {output}: {error}") from None
    print(f"Wrote {output}")


if __name__ == "__main__":
    main()
