#!/usr/bin/env python3
"""
Этап 5: мерж валидированного анализа главы (2b) и валидированных тегов (4).

Вход:
  - merge.json (2b): framework, insights, application, limitations
  - выход_valid_tag.json (4): tags по категориям, removed

Выход: один JSON с анализом и тегами для передачи в шаг 6 (генерация эмбеддингов).
"""

import argparse
import json
import sys
from pathlib import Path
from typing import Any


def load_json(path: Path) -> Any:
    """Загружает JSON из файла."""
    with open(path, encoding="utf-8") as f:
        return json.load(f)


CHAPTER_META_KEYS = ("book_id", "chapter_id", "chapter_number", "chapter_title", "book_title", "author", "chapter_text")


def merge_analysis_and_tags(
    analysis: dict[str, Any],
    tags_doc: dict[str, Any],
    input_chapter: dict[str, Any] | None = None,
) -> dict[str, Any]:
    """
    Объединяет анализ главы и валидированные теги в один документ.

    Args:
        analysis: Результат 2b (framework, insights, application, limitations).
        tags_doc: Результат 4 (tags по категориям, removed).
        input_chapter: Опционально — вход этапа 1 (book_id, chapter_id, chapter_number, chapter_title, book_title, author).

    Returns:
        Документ с полями анализа, tags, removed и при наличии — метаданными главы/книги.
    """
    result = dict(analysis)
    result["tags"] = tags_doc.get("tags", {})
    result["removed"] = tags_doc.get("removed", [])
    if input_chapter:
        for key in CHAPTER_META_KEYS:
            if key in input_chapter and input_chapter[key] is not None:
                result[key] = input_chapter[key]
    return result


def main() -> int:
    """Точка входа CLI."""
    parser = argparse.ArgumentParser(
        description="Мерж валидированного анализа (2b) и валидированных тегов (4) в один JSON (этап 5).",
    )
    parser.add_argument(
        "analysis",
        type=Path,
        help="Путь к merge.json (выход 2b).",
    )
    parser.add_argument(
        "tags",
        type=Path,
        help="Путь к выход_valid_tag.json (выход 4).",
    )
    parser.add_argument(
        "--input-chapter",
        type=Path,
        default=None,
        help="Путь к входному JSON этапа 1 (вход_главы) — book_id, chapter_id, chapter_number, chapter_title, book_title, author, chapter_text. Если задан, эти поля попадают в выход для шагов 7 и 8.",
    )
    parser.add_argument(
        "-o",
        "--output",
        type=Path,
        default=None,
        help="Путь к выходному JSON. По умолчанию — stdout.",
    )
    parser.add_argument(
        "--indent",
        type=int,
        default=2,
        help="Отступ для форматирования JSON (по умолчанию 2).",
    )
    args = parser.parse_args()

    if not args.analysis.exists():
        print(f"Ошибка: файл не найден: {args.analysis}", file=sys.stderr)
        return 1
    if not args.tags.exists():
        print(f"Ошибка: файл не найден: {args.tags}", file=sys.stderr)
        return 1

    try:
        analysis = load_json(args.analysis)
        tags_doc = load_json(args.tags)
    except json.JSONDecodeError as e:
        print(f"Ошибка разбора JSON: {e}", file=sys.stderr)
        return 1

    input_chapter = None
    if args.input_chapter is not None:
        if not args.input_chapter.exists():
            print(f"Ошибка: файл не найден: {args.input_chapter}", file=sys.stderr)
            return 1
        try:
            input_chapter = load_json(args.input_chapter)
        except json.JSONDecodeError as e:
            print(f"Ошибка разбора input-chapter JSON: {e}", file=sys.stderr)
            return 1

    merged = merge_analysis_and_tags(analysis, tags_doc, input_chapter)
    payload = json.dumps(merged, ensure_ascii=False, indent=args.indent)

    if args.output is None:
        print(payload)
    else:
        args.output.parent.mkdir(parents=True, exist_ok=True)
        args.output.write_text(payload, encoding="utf-8")
    return 0


if __name__ == "__main__":
    sys.exit(main())
