"""
Merge Macro Data

Merges local M2 and M3 Money Supply CSVs into the BTC price CSV.

Usage:
    python tools/fetch_macro_data.py --data data/COINBASE_BTCUSD-1D.csv --m2_data data/FRED_WM2NS-1W.csv --m3_data data/FRED_MABMM301USA657S-1W.csv
"""
import pandas as pd
import argparse
import os
from datetime import datetime, timedelta

def main():
    parser = argparse.ArgumentParser(description="Merge Local Macro Data into BTC CSV")
    parser.add_argument("--data", type=str, default="data/mlp/COINBASE_BTCUSD, 1D.csv", help="Path to input BTC CSV")
    parser.add_argument("--m2_data", type=str, default="data/FRED_WM2NS-1W.csv", help="Path to M2 data CSV")
    parser.add_argument("--m3_data", type=str, default="data/FRED_MABMM301USA657S-1W.csv", help="Path to M3 data CSV")
    parser.add_argument("--output", type=str, default="data/mlp/COINBASE_BTCUSD, 1D_macro.csv", help="Path to output CSV")
    args = parser.parse_args()

    if not os.path.exists(args.data):
        print(f"Error: Input file not found at {args.data}")
        return

    print(f"Loading BTC data from {args.data}...")
    df_btc = pd.read_csv(args.data)
    
    # Standardize column names
    df_btc.columns = df_btc.columns.str.lower().str.strip()
    
    # Ensure time is datetime and set as index
    df_btc['time'] = pd.to_datetime(df_btc['time'])
    df_btc.set_index('time', inplace=True)
    df_btc.sort_index(inplace=True)

    # Load M2
    if os.path.exists(args.m2_data):
        print(f"Loading M2 data from {args.m2_data}...")
        df_m2 = pd.read_csv(args.m2_data)
        df_m2.columns = df_m2.columns.str.lower().str.strip()
        df_m2['time'] = pd.to_datetime(df_m2['time'])
        df_m2.set_index('time', inplace=True)
        # Rename 'close' to 'm2'
        df_m2 = df_m2[['close']].rename(columns={'close': 'm2'})
        # Resample to Daily and Forward Fill (Macro data is slow)
        df_m2_daily = df_m2.resample('D').ffill()
    else:
        print(f"Warning: M2 file not found at {args.m2_data}. Filling with 0.")
        df_m2_daily = pd.DataFrame(columns=['m2'])

    # Load M3
    if os.path.exists(args.m3_data):
        print(f"Loading M3 data from {args.m3_data}...")
        df_m3 = pd.read_csv(args.m3_data)
        df_m3.columns = df_m3.columns.str.lower().str.strip()
        df_m3['time'] = pd.to_datetime(df_m3['time'])
        df_m3.set_index('time', inplace=True)
        # Rename 'close' to 'm3'
        df_m3 = df_m3[['close']].rename(columns={'close': 'm3'})
        # Resample to Daily and Forward Fill
        df_m3_daily = df_m3.resample('D').ffill()
    else:
        print(f"Warning: M3 file not found at {args.m3_data}. Filling with 0.")
        df_m3_daily = pd.DataFrame(columns=['m3'])

    # Merge
    print("Merging data...")
    # We use 'left' join to keep only BTC rows, but we pull in macro data
    df_merged = df_btc.join(df_m2_daily, how='left')
    df_merged = df_merged.join(df_m3_daily, how='left')

    # Forward fill any remaining gaps (e.g. weekends if macro data is Friday)
    if 'm2' in df_merged.columns:
        df_merged['m2'] = df_merged['m2'].ffill()
        df_merged['m2'] = df_merged['m2'].fillna(0) # Fill start with 0 if needed
    
    if 'm3' in df_merged.columns:
        df_merged['m3'] = df_merged['m3'].ffill()
        df_merged['m3'] = df_merged['m3'].fillna(0)

    # Reset index to save 'time' as column
    df_merged.reset_index(inplace=True)
    
    print(f"Saving merged data to {args.output}...")
    df_merged.to_csv(args.output, index=False)
    print("Done.")
    
    print("\n--- Data Preview ---")
    print(df_merged[['time', 'close', 'm2', 'm3']].tail())

if __name__ == "__main__":
    main()
