import re
import sys
from pathlib import Path
import pandas as pd

# ------------------------------------------------------------
# Market_Wave 用：ツリー移転対応版
# この .py を C:\Users\machi\Market_Wave\05_ツール に置けば、
# 自動で C:\Users\machi\Market_Wave を基準にします。
# ------------------------------------------------------------
SCRIPT_DIR = Path(__file__).resolve().parent
BASE = SCRIPT_DIR.parent

TEXT_DIR = BASE / "00_波テキスト"
OUT_DIR = BASE / "01_波Excel"
OUT_DIR.mkdir(parents=True, exist_ok=True)

ZEN2HAN = str.maketrans("０１２３４５６７８９", "0123456789")

def normalize_text(s: str) -> str:
    return s.translate(ZEN2HAN)


def extract_date(text: str):
    text = normalize_text(text)
    m = re.search(r"\d{4}-\d{2}-\d{2}", text)
    return m.group(0) if m else None


def pick_txt_files(arg):
    """
    1) 引数なし -> inside_log_*.txt 全部
    2) 日付指定 -> inside_log_日付.txt だけ
    3) フルパス指定 -> その1ファイルだけ
    """
    if not arg:
        return None, sorted(TEXT_DIR.glob("inside_log_*.txt"))

    arg_norm = normalize_text(arg)
    p = Path(arg)

    if p.exists() and p.is_file() and p.suffix.lower() == ".txt":
        target_date = extract_date(p.name) or p.stem
        return target_date, [p]

    target_date = extract_date(arg_norm) or arg_norm
    txt_files = sorted(TEXT_DIR.glob(f"inside_log_{target_date}.txt"))
    return target_date, txt_files


def parse_30min_inside(txt_file: Path, text: str):
    rows = []
    blocks = re.split(r"\n(?=\d{4}_.+?30分足の中身透視レーダー 開始)", text)

    for block in blocks:
        m = re.search(r"(\d{4}_.+?)\s*30分足の中身透視レーダー 開始", block)
        if not m:
            continue

        name = m.group(1).strip()

        for line in block.splitlines():
            # 例: 1 09:00-09:30 2835.5 2855 ...
            if re.match(r"\s*\d+\s+\d{2}:\d{2}-\d{2}:\d{2}", line):
                parts = line.split()
                try:
                    rows.append({
                        "元ファイル": txt_file.name,
                        "銘柄": name,
                        "区間": parts[1],
                        "始値": float(parts[2]),
                        "高値": float(parts[3]),
                        "安値": float(parts[4]),
                        "終値": float(parts[5]),
                        "出来高": int(float(parts[6])),
                        "30分方向": parts[7],
                        "波の数": int(parts[8]),
                        "中身判定": " ".join(parts[9:]),
                    })
                except Exception as e:
                    print("30分読み取り失敗:", name, line, e)
    return rows


def parse_1min_wave(txt_file: Path, text: str):
    rows = []
    lines = text.splitlines()
    current_name = None
    current_date = None
    in_table = False

    for line in lines:
        raw = normalize_text(line).strip()
        if not raw:
            continue

        # 例: 464A_QPS　2026-06-29　1分波観測一覧
        m = re.search(r"(\d{3,4}[A-Z]?_.+?)\s+(\d{4}-\d{2}-\d{2})\s+1分波観測一覧", raw.replace("　", " "))
        if m:
            current_name = m.group(1).strip()
            current_date = m.group(2)
            in_table = True
            continue

        if "日別まとめ" in raw:
            in_table = False
            continue

        # 例: 09:00-09:01 1906.0 1883.0 92400 1.03 強い下落 第1波_下げ波 戻り売り確認
        if in_table and current_name and re.match(r"^\d{2}:\d{2}-\d{2}:\d{2}\s+", raw):
            parts = raw.split()
            try:
                rows.append({
                    "元ファイル": txt_file.name,
                    "日付": current_date,
                    "銘柄": current_name,
                    "区間": parts[0],
                    "始値": float(parts[1]),
                    "終値": float(parts[2]),
                    "出来高": int(float(parts[3])),
                    "出来高倍率": float(parts[4]),
                    "方向": parts[5],
                    "波判定": parts[6] if len(parts) >= 7 else "",
                    "罠判定": " ".join(parts[7:]) if len(parts) >= 8 else "",
                })
            except Exception as e:
                print("1分波読み取り失敗:", current_name, raw, e)

    return rows


def autosize_excel(path: Path):
    try:
        from openpyxl import load_workbook
        from openpyxl.styles import Font, PatternFill, Alignment, Border, Side
        from openpyxl.utils import get_column_letter
        wb = load_workbook(path)
        header_fill = PatternFill("solid", fgColor="1F4E78")
        header_font = Font(color="FFFFFF", bold=True)
        thin = Side(style="thin", color="D9E2F3")
        border = Border(left=thin, right=thin, top=thin, bottom=thin)

        for ws in wb.worksheets:
            ws.freeze_panes = "A2"
            ws.auto_filter.ref = ws.dimensions
            for cell in ws[1]:
                cell.fill = header_fill
                cell.font = header_font
                cell.alignment = Alignment(horizontal="center", vertical="center")
                cell.border = border
            for row in ws.iter_rows(min_row=2):
                for cell in row:
                    cell.border = border
                    cell.alignment = Alignment(vertical="center")
            for col in ws.columns:
                col_letter = get_column_letter(col[0].column)
                max_len = max(len(str(c.value)) if c.value is not None else 0 for c in col)
                ws.column_dimensions[col_letter].width = min(max(max_len + 2, 10), 28)
        wb.save(path)
    except Exception as e:
        print("Excel整形はスキップしました:", e)


def main():
    arg = sys.argv[1] if len(sys.argv) >= 2 else None
    target_date, txt_files = pick_txt_files(arg)

    if not txt_files:
        print("対象ファイルが見つかりません")
        print(f"指定: {arg}")
        print(f"検索場所: {TEXT_DIR}")
        sys.exit(1)

    rows_30 = []
    rows_wave = []

    for txt_file in txt_files:
        text = txt_file.read_text(encoding="utf-8", errors="ignore")
        text = normalize_text(text)
        rows_30.extend(parse_30min_inside(txt_file, text))
        rows_wave.extend(parse_1min_wave(txt_file, text))

    df30 = pd.DataFrame(rows_30)
    dfwave = pd.DataFrame(rows_wave)

    if target_date:
        out_file = OUT_DIR / f"all_inside_radar_summary_{target_date}.xlsx"
    else:
        out_file = OUT_DIR / "all_inside_radar_summary.xlsx"

    with pd.ExcelWriter(out_file, engine="openpyxl") as writer:
        if not df30.empty:
            df30.to_excel(writer, index=False, sheet_name="全銘柄_30分中身")
            summary30 = (
                df30.groupby("銘柄")
                .agg(総出来高=("出来高", "sum"), 総波数=("波の数", "sum"), 平均波数=("波の数", "mean"), 区間数=("区間", "count"))
                .reset_index()
            )
            summary30.to_excel(writer, index=False, sheet_name="30分_銘柄別summary")

        if not dfwave.empty:
            dfwave.to_excel(writer, index=False, sheet_name="全銘柄_1分波")
            summary_wave = (
                dfwave.groupby("銘柄")
                .agg(
                    日付=("日付", "first"),
                    総出来高=("出来高", "sum"),
                    最大出来高=("出来高", "max"),
                    最大出来高倍率=("出来高倍率", "max"),
                    記録行数=("区間", "count"),
                    上げ波回数=("波判定", lambda s: s.astype(str).str.contains("上げ波").sum()),
                    下げ波回数=("波判定", lambda s: s.astype(str).str.contains("下げ波").sum()),
                )
                .reset_index()
            )
            summary_wave.to_excel(writer, index=False, sheet_name="1分波_銘柄別summary")

        if df30.empty and dfwave.empty:
            pd.DataFrame([{
                "メッセージ": "読み取れる行がありませんでした",
                "確認": "入力ログの形式が想定外か、表部分が貼り付けられていない可能性があります。",
            }]).to_excel(writer, index=False, sheet_name="読み取り結果")

    autosize_excel(out_file)

    print("保存完了")
    print(out_file)
    print(f"処理ファイル数: {len(txt_files)}")
    print(f"30分中身 行数: {len(df30)}")
    print(f"1分波 行数: {len(dfwave)}")
    for f in txt_files:
        print(f"処理: {f.name}")


if __name__ == "__main__":
    main()
