#!/usr/bin/env python3
import subprocess
import json
import os
import sys
from pathlib import Path


def transcribe_file(
    file_path: Path, script_path: Path, timeout_seconds: int = 60
) -> str:
    """
    Вызывает recognition.py для одного файла, возвращает транскрипцию.
    """
    cmd = ["python3", str(script_path), "--output", "transcript", str(file_path)]

    try:
        result = subprocess.run(
            cmd,
            capture_output=True,
            text=True,
            check=True,
            encoding="utf-8",
            timeout=timeout_seconds,
        )
        # Предполагаем, что скрипт выводит транскрипцию в stdout
        transcript = result.stdout.strip()
        if not transcript:
            print(f"Предупреждение: пустая транскрипция для {file_path}")
        return transcript
    except subprocess.TimeoutExpired:
        error_msg = f"TIMEOUT: превышен лимит в {timeout_seconds} секунд"
        print(f"Ошибка: {error_msg} для {file_path}")
        return f"ERROR: {error_msg}"
    except subprocess.CalledProcessError as e:
        print(f"Ошибка при обработке {file_path}: {e}")
        print(f"stderr: {e.stderr}")
        return f"ERROR: {e.stderr}"


def main():
    # Пути
    base_dir = Path(
        r"/mnt/c/proga/projects/ege-skill-dev/.scans/Сложные работы_Английский язык УЧ часть 1/"
    )
    regions = ["1-Республика Адыгея"]
    recognizer_script = Path.home() / ".zeroclaw" / "workspace" / "skills" / "ege-checker" / "recognition.py"

    # Таймаут на транскрипцию одного файла (в секундах)
    TIMEOUT_PER_FILE = 120

    # Проверки
    if not base_dir.exists():
        print(f"Ошибка: директория {base_dir} не найдена")
        sys.exit(1)

    if not recognizer_script.exists():
        print(f"Ошибка: скрипт {recognizer_script} не найден")
        sys.exit(1)

    # Собираем все .ogg файлы, кроме тех, где озвузичвается код участника
    ogg_files = []
    for region in regions:
        ogg_files.extend(
            [
                file
                for i, file in enumerate(list(Path(f"{base_dir}/{region}/").rglob("*.ogg")))
                if i % 5 != 0
            ]
        )

    print(f"Найдено {len(ogg_files)} .ogg файлов")

    results = []

    for idx, ogg_path in enumerate(ogg_files, 1):
        print(f"\n[{idx}/{len(ogg_files)}] Обработка: {ogg_path}")

        # Структура: .../{region}/{fio}/{file}
        region = ogg_path.parent.parent.name
        fio = ogg_path.parent.name

        print(f"  Регион: {region}")
        print(f"  ФИО: {fio}")
        print(
            f"  Транскрибирование (таймаут: {TIMEOUT_PER_FILE} сек)...",
            end=" ",
            flush=True,
        )

        transcript = transcribe_file(ogg_path, recognizer_script, TIMEOUT_PER_FILE)

        print("готово")
        # Показываем первые 100 символов транскрипции, если она есть
        preview = transcript[:100].replace("\n", " ")
        if preview and not transcript.startswith("ERROR:"):
            print(f"  Транскрипция (начало): {preview}...")
        elif transcript.startswith("ERROR:"):
            print(f"  {transcript}")

        results.append(
            {
                "region": region,
                "fio": fio,
                "transcript": transcript,
                "file_path": str(ogg_path),
            }
        )

    # Сохраняем JSON
    output_file = Path.cwd() / "transcriptions.json"
    if Path.exists(output_file):
        with open(output_file, "r", encoding="utf-8") as f:
            results_to_file: list = json.load(f)
        results_to_file.extend(results)
    else:
        results_to_file = results

    with open(output_file, "w", encoding="utf-8") as f:
        json.dump(results_to_file, f, ensure_ascii=False, indent=2)

    # Статистика
    total_files = len(results)
    error_files = sum(1 for r in results if r["transcript"].startswith("ERROR:"))
    timeout_files = sum(1 for r in results if "TIMEOUT" in r["transcript"])
    success_files = total_files - error_files

    print(f"\n✅ Готово! Результаты сохранены в {output_file}")
    print(f"Всего обработано файлов: {total_files}")
    print(f"  - Успешно: {success_files}")
    print(f"  - Ошибок: {error_files} (из них timeout: {timeout_files})")


if __name__ == "__main__":
    main()
