"""
MT5 からヒストリカル足を取得し、pandas DataFrame にして CSV と終値チャートを保存する（#2 用）。

ダウンロード単体で使う場合: 既定の出力先はカレントディレクトリの mt5_out です。

  python mt5_rates_to_dataframe.py
  python mt5_rates_to_dataframe.py --symbol EURUSD --bars 300
"""
from __future__ import annotations

import argparse
from pathlib import Path

import MetaTrader5 as mt5
import matplotlib.dates as mdates
import matplotlib.pyplot as plt
import pandas as pd

_DEFAULT_OUT = Path.cwd() / "mt5_out"


def main() -> int:
    p = argparse.ArgumentParser(description="MT5 rates -> DataFrame -> CSV + PNG")
    p.add_argument("--symbol", default="USDJPY", help="銘柄名（ブローカー表記に合わせる）")
    p.add_argument("--bars", type=int, default=200, help="取得バー数")
    p.add_argument(
        "--out",
        type=Path,
        default=_DEFAULT_OUT,
        help="出力ディレクトリ",
    )
    args = p.parse_args()

    if not mt5.initialize():
        print("initialize() failed", mt5.last_error())
        return 1

    rates = mt5.copy_rates_from_pos(args.symbol, mt5.TIMEFRAME_H1, 0, args.bars)
    mt5.shutdown()

    if rates is None or len(rates) == 0:
        print("No rates (check symbol / Market Watch)")
        return 1

    df = pd.DataFrame(rates)
    df["time"] = pd.to_datetime(df["time"], unit="s", utc=True)

    args.out.mkdir(parents=True, exist_ok=True)
    stem = f"{args.symbol}_H1_{len(df)}"
    csv_path = args.out / f"{stem}.csv"
    png_path = args.out / f"{stem}_close.png"

    df.to_csv(csv_path, index=False)
    print(f"CSV: {csv_path}")

    fig, ax = plt.subplots(figsize=(10, 4), dpi=120)
    ax.plot(df["time"], df["close"], color="#2196F3", linewidth=0.8)
    ax.set_title(f"{args.symbol} H1 close ({len(df)} bars)")
    ax.set_xlabel("time (UTC)")
    ax.grid(True, alpha=0.3)
    ax.xaxis.set_major_formatter(mdates.DateFormatter("%m-%d %H:%M"))
    fig.autofmt_xdate()
    fig.tight_layout()
    fig.savefig(png_path)
    plt.close(fig)
    print(f"PNG: {png_path}")
    print("\nhead:")
    print(df.head(3).to_string())
    return 0


if __name__ == "__main__":
    raise SystemExit(main())
