"""Snapshot loaders.

CTG / FDA / EMA / PMDA / IR / AASLD JSON snapshot 파일을 일자별로 읽는다.
모든 데이터는 합성(synthetic). 외부 네트워크 호출은 절대로 발생하지 않는다.
"""

from __future__ import annotations

import json
from datetime import date, timedelta
from pathlib import Path
from typing import Any, Dict, List, Optional


DATA_DIR = Path(__file__).resolve().parent.parent / "data"


def _read_json(path: Path) -> Optional[Dict[str, Any]]:
    if not path.exists():
        return None
    with path.open("r", encoding="utf-8") as f:
        return json.load(f)


def load_ctg_snapshot(snapshot_date: str) -> Optional[Dict[str, Any]]:
    return _read_json(DATA_DIR / f"ctg_snapshot_{snapshot_date}.json")


def load_ctg_pair(today: str) -> Dict[str, Any]:
    """Return {'today': {...}, 'yesterday': {...}}.

    어제(today - 1일) snapshot이 없으면 'yesterday'는 빈 trials로 대체.
    """
    today_data = load_ctg_snapshot(today) or {"snapshot_date": today, "trials": []}
    y_str = (date.fromisoformat(today) - timedelta(days=1)).isoformat()
    yesterday_data = load_ctg_snapshot(y_str) or {"snapshot_date": y_str, "trials": []}
    return {"today": today_data, "yesterday": yesterday_data}


def load_fda(snapshot_date: str) -> Optional[Dict[str, Any]]:
    return _read_json(DATA_DIR / f"fda_news_{snapshot_date}.json")


def load_fda_pair(today: str) -> Dict[str, Any]:
    today_data = load_fda(today) or {"snapshot_date": today, "items": []}
    y_str = (date.fromisoformat(today) - timedelta(days=1)).isoformat()
    yesterday_data = load_fda(y_str) or {"snapshot_date": y_str, "items": []}
    return {"today": today_data, "yesterday": yesterday_data}


def load_ema(snapshot_date: str) -> Optional[Dict[str, Any]]:
    return _read_json(DATA_DIR / f"ema_epar_{snapshot_date}.json")


def load_pmda(snapshot_date: str) -> Optional[Dict[str, Any]]:
    return _read_json(DATA_DIR / f"pmda_news_{snapshot_date}.json")


def load_ir(snapshot_date: str) -> Optional[Dict[str, Any]]:
    return _read_json(DATA_DIR / f"ir_filings_{snapshot_date}.json")


def load_aasld() -> Optional[Dict[str, Any]]:
    return _read_json(DATA_DIR / "aasld_abstracts_2026.json")


def all_snapshots(snapshot_date: str) -> Dict[str, Any]:
    """One-shot bundle for the given date."""
    return {
        "ctg": load_ctg_pair(snapshot_date),
        "fda": load_fda_pair(snapshot_date),
        "ema": load_ema(snapshot_date),
        "pmda": load_pmda(snapshot_date),
        "ir": load_ir(snapshot_date),
        "aasld": load_aasld(),
    }


def list_loaded_files(snapshot_date: str) -> List[str]:
    files: List[str] = []
    y_str = (date.fromisoformat(snapshot_date) - timedelta(days=1)).isoformat()
    for name in (
        f"ctg_snapshot_{snapshot_date}.json",
        f"ctg_snapshot_{y_str}.json",
        f"fda_news_{snapshot_date}.json",
        f"fda_news_{y_str}.json",
        f"ema_epar_{snapshot_date}.json",
        f"pmda_news_{snapshot_date}.json",
        f"ir_filings_{snapshot_date}.json",
        "aasld_abstracts_2026.json",
    ):
        path = DATA_DIR / name
        if path.exists():
            files.append(str(path))
    return files
