"""
multi_rates_collector.py
=========================
Fetches UK, Japan, and Australia rate series from FRED to support
GBPUSD, USDJPY, and AUDUSD signal generation.

FRED Series
-----------
UK:
  uk2y  : IRSTCB01GBM156N  Short-term central bank rate (monthly, OECD)
  uk10y : IRLTLT01GBM156N  Long-term government bond yield (monthly, OECD)

Japan:
  jp2y  : IRSTCB01JPM156N  Short-term central bank rate (monthly, OECD)
  jp10y : IRLTLT01JPM156N  Long-term government bond yield (monthly, OECD)

Australia:
  au2y  : IRSTCB01AUM156N  Short-term central bank rate (monthly, OECD)
  au10y : IRLTLT01AUM156N  Long-term government bond yield (monthly, OECD)

Note: These are monthly OECD harmonized series. The pipeline forward-fills
them to daily frequency. Monthly data is appropriate because the rolling
beta model uses 120-day windows and the central bank rate changes that
drive these series happen at discrete meetings (6-8 per year).

Setup (run once in PowerShell before executing this script):
  $env:FRED_API_KEY = "b4e39ea4507e1ceca1a389cfacee8a00"

Place this file in:
  C:\\Users\\paul_\\OneDrive\\fx_macro_intraday\\src\\ingestion\\multi_rates_collector.py

Run from project root:
  python src/ingestion/multi_rates_collector.py
"""

import os
import sys
from pathlib import Path

BASE_PATH = Path(__file__).resolve().parents[2]
SRC_PATH  = BASE_PATH / "src"
if str(SRC_PATH) not in sys.path:
    sys.path.append(str(SRC_PATH))

from ingestion.auto_rates_loader import (
    fetch_fred_series,
    _save_series,
    RATES_PATH,
)

# ── Series definitions ────────────────────────────────────────────────────────
# Primary series + fallback in case primary is unavailable on FRED
SERIES_CONFIG = [
    # UK
    {
        "primary"    : "IRSTCB01GBM156N",
        "fallback"   : "IR3TIB01GBM156N",   # 3-month interbank rate
        "filename"   : "uk2y.csv",
        "col"        : "uk2y",
        "description": "UK short-term rate (2Y proxy)",
    },
    {
        "primary"    : "IRLTLT01GBM156N",
        "fallback"   : None,
        "filename"   : "uk10y.csv",
        "col"        : "uk10y",
        "description": "UK 10Y government bond yield",
    },
    # Japan
    {
        "primary"    : "IRSTCB01JPM156N",
        "fallback"   : "IR3TIB01JPM156N",
        "filename"   : "jp2y.csv",
        "col"        : "jp2y",
        "description": "Japan short-term rate (2Y proxy)",
    },
    {
        "primary"    : "IRLTLT01JPM156N",
        "fallback"   : None,
        "filename"   : "jp10y.csv",
        "col"        : "jp10y",
        "description": "Japan 10Y government bond yield",
    },
    # Australia
    {
        "primary"    : "IRSTCB01AUM156N",
        "fallback"   : "IR3TIB01AUM156N",
        "filename"   : "au2y.csv",
        "col"        : "au2y",
        "description": "Australia short-term rate (2Y proxy)",
    },
    {
        "primary"    : "IRLTLT01AUM156N",
        "fallback"   : None,
        "filename"   : "au10y.csv",
        "col"        : "au10y",
        "description": "Australia 10Y government bond yield",
    },
]


def fetch_with_fallback(config: dict, api_key: str) -> bool:
    """
    Tries primary FRED series, falls back to alternative if primary fails.
    Returns True if successful.
    """
    for series_id in [config["primary"], config.get("fallback")]:
        if series_id is None:
            continue
        try:
            print(f"  Trying series: {series_id} ...")
            df = fetch_fred_series(
                series_id        =series_id,
                output_name      =config["filename"],
                value_col_name   =config["col"],
                api_key          =api_key,
                observation_start="1990-01-01",
            )
            _save_series(df, config["filename"])
            print(f"  ✓ Saved {config['filename']}  "
                  f"({len(df)} rows, "
                  f"{df['date'].min()} → {df['date'].max()})")
            return True
        except Exception as e:
            print(f"  ✗ Failed ({series_id}): {e}")

    print(f"  [ERROR] All series failed for {config['filename']}")
    return False


def verify_existing_rates():
    """Checks which rate files already exist."""
    print("\nExisting rate files:")
    for f in sorted(RATES_PATH.glob("*.csv")):
        import pandas as pd
        try:
            df = pd.read_csv(f, nrows=1)
            print(f"  {f.name:<20} ✓")
        except Exception:
            print(f"  {f.name:<20} ✗ (unreadable)")


def main():
    print("=" * 60)
    print("MULTI RATES COLLECTOR")
    print(f"Output directory: {RATES_PATH}")
    print("=" * 60)

    # Get API key
    api_key = os.getenv("FRED_API_KEY")
    if not api_key:
        print("\n[ERROR] FRED_API_KEY environment variable not set.")
        print("\nRun this in PowerShell first, then re-run this script:")
        print('  $env:FRED_API_KEY = "b4e39ea4507e1ceca1a389cfacee8a00"')
        return

    print(f"\nFRED API key found. Collecting {len(SERIES_CONFIG)} series...\n")

    results = {}
    for config in SERIES_CONFIG:
        print(f"\n{config['description']} → {config['filename']}")
        success = fetch_with_fallback(config, api_key)
        results[config["filename"]] = success

    # Summary
    print(f"\n{'='*60}")
    print("COLLECTION SUMMARY")
    print(f"{'='*60}")
    passed  = sum(results.values())
    failed  = len(results) - passed
    print(f"  Successful : {passed}/{len(results)}")
    print(f"  Failed     : {failed}/{len(results)}")

    if failed > 0:
        print("\n  Failed files:")
        for filename, ok in results.items():
            if not ok:
                print(f"    {filename}")
        print("\n  For failed series, manually download from:")
        print("  https://fred.stlouisfed.org/")
        print("  Search for the country + 'short term interest rate' or '10 year'")
        print("  Save as CSV in data/raw/rates/ with columns: date, value")

    verify_existing_rates()

    if passed == len(SERIES_CONFIG):
        print(f"\n  All rate series collected successfully.")
        print(f"  Next step: run src/research/multi_pair_signals_v1.py")
    else:
        print(f"\n  Some series failed. Check manually before running pipeline.")


if __name__ == "__main__":
    main()
