"""BetterBrain Google Trends fetcher — daily cron.

Backend: SerpApi Google Trends (sostituisce pytrends per affidabilità).

Per ogni keyword del config:
  - Time series last 3 months (daily resolution)
  - Time series last 5 years (weekly resolution)
  - Related queries (top + rising)
  - Geographic interest by US state

Più 1 query Compare per le 5 keyword principali (volumi relativi).

Output: JSON files in data/YYYY-MM-DD/ + ultimo snapshot in data/latest.json.

Env vars richieste: SERPAPI_KEY

Run:
    cd ~/agents && uv run python -m projects.symetrics_trends.betterbrain.fetch_trends
"""

from __future__ import annotations

import json
import time
from datetime import datetime
from pathlib import Path
from typing import Any

import yaml

from projects.symetrics_trends.lib import serpapi_trends


HERE = Path(__file__).resolve().parent
CONFIG_PATH = HERE / "config.yaml"
DATA_DIR = HERE / "data"


def load_config() -> dict[str, Any]:
    with open(CONFIG_PATH) as f:
        return yaml.safe_load(f)


def main():
    cfg = load_config()
    keywords = cfg["keywords"]
    compare_set = cfg["compare_set"]
    geo = cfg["geo"]
    timeframe_short = "today 3-m"   # daily resolution
    timeframe_long = "today 5-y"    # weekly resolution

    today = datetime.now().strftime("%Y-%m-%d")
    out_dir = DATA_DIR / today
    out_dir.mkdir(parents=True, exist_ok=True)

    print(f"[{datetime.now().isoformat()}] Starting BetterBrain Trends fetch")
    print(f"  Keywords ({len(keywords)}): {keywords}")
    print(f"  Geo: {geo}")
    print(f"  Output: {out_dir}")

    # SerpApi backend — retry built-in nel wrapper. No client da inizializzare.

    snapshot: dict[str, Any] = {
        "fetched_at": datetime.now().isoformat(),
        "client": cfg["client"],
        "geo": geo,
        "keywords": keywords,
        "compare_set": compare_set,
        "timeframes": {
            "short": timeframe_short,
            "long": timeframe_long,
        },
        "timeseries_short": {},
        "timeseries_long": {},
        "compare_short": None,
        "compare_long": None,
        "related_queries": {},
        "interest_by_region": {},
    }

    # SerpApi è ~10x più veloce di pytrends scraping, riduco sleep a 0.5s
    SLEEP = 0.5

    # --- 1. Time series individuali (short + long) ---
    for kw in keywords:
        print(f"  -> Fetching time series '{kw}' (short)...")
        try:
            snapshot["timeseries_short"][kw] = serpapi_trends.fetch_timeseries(
                kw, geo, timeframe_short
            )
        except Exception as e:
            print(f"    ! ERROR: {e}")
            snapshot["timeseries_short"][kw] = {"keyword": kw, "rows": [], "error": str(e)}
        time.sleep(SLEEP)

        print(f"  -> Fetching time series '{kw}' (long)...")
        try:
            snapshot["timeseries_long"][kw] = serpapi_trends.fetch_timeseries(
                kw, geo, timeframe_long
            )
        except Exception as e:
            print(f"    ! ERROR: {e}")
            snapshot["timeseries_long"][kw] = {"keyword": kw, "rows": [], "error": str(e)}
        time.sleep(SLEEP)

    # --- 2. Compare view (5 keyword sovrapposte, volumi relativi reali) ---
    print(f"  -> Fetching Compare ({len(compare_set)} keyword, short)...")
    try:
        snapshot["compare_short"] = serpapi_trends.fetch_compare(
            compare_set, geo, timeframe_short
        )
    except Exception as e:
        print(f"    ! ERROR: {e}")
        snapshot["compare_short"] = {"keywords": compare_set, "rows": [], "error": str(e)}
    time.sleep(SLEEP)

    print(f"  -> Fetching Compare ({len(compare_set)} keyword, long)...")
    try:
        snapshot["compare_long"] = serpapi_trends.fetch_compare(
            compare_set, geo, timeframe_long
        )
    except Exception as e:
        print(f"    ! ERROR: {e}")
        snapshot["compare_long"] = {"keywords": compare_set, "rows": [], "error": str(e)}
    time.sleep(SLEEP)

    # --- 3. Related queries per ogni keyword (top da 3m, rising da 7d) ---
    for kw in keywords:
        print(f"  -> Fetching related queries '{kw}' (top, 3m)...")
        top_part = {"top": [], "error": None}
        try:
            r = serpapi_trends.fetch_related_queries(kw, geo, "today 3-m")
            top_part["top"] = r.get("top", [])
        except Exception as e:
            print(f"    ! ERROR top: {e}")
            top_part["error"] = str(e)
        time.sleep(SLEEP)

        print(f"  -> Fetching related queries '{kw}' (rising, 7d)...")
        rising_part = {"rising": [], "error": None}
        try:
            r = serpapi_trends.fetch_related_queries(kw, geo, "now 7-d")
            rising_part["rising"] = r.get("rising", [])
        except Exception as e:
            print(f"    ! ERROR rising: {e}")
            rising_part["error"] = str(e)
        time.sleep(SLEEP)

        snapshot["related_queries"][kw] = {
            "keyword": kw,
            "top": top_part["top"],
            "rising": rising_part["rising"],
            "top_timeframe": "today 3-m",
            "rising_timeframe": "now 7-d",
            "error": top_part["error"] or rising_part["error"],
        }

    # --- 4. Interest by region (US state) ---
    for kw in keywords:
        print(f"  -> Fetching geo region '{kw}'...")
        try:
            snapshot["interest_by_region"][kw] = serpapi_trends.fetch_interest_by_region(
                kw, geo, timeframe_short
            )
        except Exception as e:
            print(f"    ! ERROR: {e}")
            snapshot["interest_by_region"][kw] = {"keyword": kw, "regions": [], "error": str(e)}
        time.sleep(SLEEP)

    # --- 5. Save ---
    daily_file = out_dir / "snapshot.json"
    latest_file = DATA_DIR / "latest.json"

    with open(daily_file, "w") as f:
        json.dump(snapshot, f, indent=2)
    with open(latest_file, "w") as f:
        json.dump(snapshot, f, indent=2)

    print(f"✓ Saved snapshot: {daily_file}")
    print(f"✓ Updated latest: {latest_file}")

    # --- 6. Retention cleanup ---
    retention = cfg.get("data_retention_days", 730)
    cutoff = datetime.now().timestamp() - retention * 86400
    pruned = 0
    for subdir in DATA_DIR.iterdir():
        if subdir.is_dir() and subdir.stat().st_mtime < cutoff:
            for f in subdir.iterdir():
                f.unlink()
            subdir.rmdir()
            pruned += 1
    if pruned:
        print(f"  Pruned {pruned} old daily folders (retention {retention} days)")


if __name__ == "__main__":
    main()
