"""
最適化結果 XML のサンプル（例: mt5_optimize_result_sample.xml）を読み、属性を DataFrame にする例。
実機の MT5 が出す XML はビルドで差があるため、タグ名・属性に合わせてパスを修正してください。

コラム MT5×Python #7 用。
"""
from __future__ import annotations

import argparse
import sys
import xml.etree.ElementTree as ET

import pandas as pd


def rows_from_xml(path: str) -> pd.DataFrame:
    tree = ET.parse(path)
    root = tree.getroot()
    rows = []
    for el in root.iter("Result"):
        if el.attrib:
            rows.append(dict(el.attrib))
    if not rows:
        for el in root.iter("Result"):
            row = {c.tag: (c.text or "").strip() for c in el}
            if row:
                rows.append(row)
    if not rows:
        raise ValueError(
            "No <Result> rows found. Open your XML in an editor and adjust "
            "the element name in this script (e.g. Row, OptimizationResult)."
        )
    return pd.DataFrame(rows)


def main() -> int:
    p = argparse.ArgumentParser(description="MT5 optimization XML -> CSV (sample parser)")
    p.add_argument("xml", help="Path to optimization result XML")
    p.add_argument("-o", "--out", default="optimization_results.csv", help="Output CSV")
    p.add_argument("--sort-by", default="Profit", help="Column name to sort descending (if present)")
    args = p.parse_args()
    try:
        df = rows_from_xml(args.xml)
    except (ET.ParseError, ValueError) as e:
        print(e, file=sys.stderr)
        return 1
    if args.sort_by in df.columns:
        df[args.sort_by] = pd.to_numeric(df[args.sort_by], errors="coerce")
        df = df.sort_values(args.sort_by, ascending=False)
    else:
        print(f"Note: column {args.sort_by!r} not found; columns are {list(df.columns)}", file=sys.stderr)
    df.to_csv(args.out, index=False, encoding="utf-8-sig")
    print(df.head(20).to_string())
    print(f"Saved: {args.out}")
    return 0


if __name__ == "__main__":
    raise SystemExit(main())
