"""Kokoro-82M TTS starter — lokální, offline, CPU feasible (~312 MB váhy)."""

from __future__ import annotations

import hashlib
import os
import sys
from pathlib import Path

import torch

HF_TOKEN = os.environ.get("HF_TOKEN")  # výhradně z env
MODEL_ID = "hexgrad/Kokoro-82M"  # Apache 2.0
REVISION = "<revision_sha>"  # pinovat na konkrétní commit SHA
MODEL_FILE = "kokoro-v0_19.pth"
EXPECTED_SHA256 = "<sha256_digest>"
MODELS_DIR = Path(os.environ.get("DEV_ENV_MODELS_DIR", "models"))


def _verify_sha256(filepath: Path, expected: str) -> str:
    sha = hashlib.sha256()
    with open(filepath, "rb") as f:
        for chunk in iter(lambda: f.read(1024 * 1024), b""):
            sha.update(chunk)
    digest = sha.hexdigest()
    if digest != expected:
        print(f"CHYBA: SHA256 neshoda pro {filepath.name}", file=sys.stderr)
        sys.exit(1)
    return digest


def _download_weight(repo_id: str, filename: str, revision: str, expected_hash: str) -> Path:
    from huggingface_hub import hf_hub_download

    MODELS_DIR.mkdir(parents=True, exist_ok=True)
    downloaded = hf_hub_download(
        repo_id=repo_id,
        filename=filename,
        revision=revision,
        token=HF_TOKEN,
        local_dir=str(MODELS_DIR),
        local_dir_use_symlinks=False,
        trust_remote_code=False,
    )
    _verify_sha256(Path(downloaded), expected_hash)
    return Path(downloaded)


def synthesize(text: str, output_path: str = "output.wav") -> None:
    import soundfile as sf

    weight_path = _download_weight(MODEL_ID, MODEL_FILE, REVISION, EXPECTED_SHA256)
    state_dict = torch.load(weight_path, map_location="cpu", weights_only=True)

    # Placeholder pro inicializaci Kokoro modelu — konkrétní API závisí na balíčku
    print(f"Model načten s weights_only=True, váhy: {weight_path}")
    print(f"Syntéza textu: {text[:50]}...")
    # sf.write(output_path, audio, samplerate=24000)  # doplnit podle skutečného API


if __name__ == "__main__":
    synthesize("Ahoj, toto je testovací ukázka Kokoro TTS.")
