"""
MT5 約定履歴を history_deals_get で取得し、pandas.DataFrame 経由で CSV に保存するサンプル。
読み取りのみ（注文送信なし）。コラム MT5×Python #5 用。
"""
from __future__ import annotations

import argparse
import sys
from datetime import datetime, timedelta

import MetaTrader5 as mt5
import pandas as pd


def parse_yyyymmdd(s: str) -> datetime:
    return datetime.strptime(s, "%Y%m%d")


def main() -> int:
    parser = argparse.ArgumentParser(
        description="history_deals_get -> DataFrame -> CSV（デモ口座での検証推奨）"
    )
    parser.add_argument(
        "--days",
        type=int,
        default=30,
        help="終端を「今」として、さかのぼる日数（既定: 30）",
    )
    parser.add_argument(
        "--from-date",
        metavar="YYYYMMDD",
        help="開始日（この日の 00:00 付近から。--days より優先）",
    )
    parser.add_argument(
        "--to-date",
        metavar="YYYYMMDD",
        help="終了日（この日の終わり付近まで。省略時は現在時刻）",
    )
    parser.add_argument(
        "--out",
        default="deals_export.csv",
        help="出力 CSV パス（既定: deals_export.csv）",
    )
    args = parser.parse_args()

    if not mt5.initialize():
        print("initialize() に失敗しました。MT5 を起動し、口座にログインした状態で再試行してください。")
        return 1

    try:
        if args.to_date:
            date_to = parse_yyyymmdd(args.to_date).replace(
                hour=23, minute=59, second=59, microsecond=999999
            )
        else:
            date_to = datetime.now()

        if args.from_date:
            date_from = parse_yyyymmdd(args.from_date).replace(
                hour=0, minute=0, second=0, microsecond=0
            )
        else:
            date_from = date_to - timedelta(days=args.days)

        if date_from >= date_to:
            print("開始日時が終了日時以上です。--days か --from-date / --to-date を見直してください。")
            return 1

        print(f"取得範囲: {date_from} ～ {date_to}")
        deals = mt5.history_deals_get(date_from, date_to)

        if deals is None:
            print("history_deals_get が None を返しました（ターミナルのログを確認してください）。")
            return 1

        if len(deals) == 0:
            print(
                "指定期間に約定がありません。期間を広げるか、MT5 の口座履歴に取引があるか確認してください。"
            )
            return 0

        df = pd.DataFrame(list(deals), columns=deals[0]._asdict().keys())
        print(df.head(10).to_string())
        print(f"---\n行数: {len(df)}")
        df.to_csv(args.out, index=False, encoding="utf-8-sig")
        print(f"保存しました: {args.out}")
    finally:
        mt5.shutdown()

    return 0


if __name__ == "__main__":
    sys.exit(main())
