#!/usr/bin/env python3
"""Build 1991-2025 A-share year-end trading dates from Shanghai Composite bars."""

from __future__ import annotations

import json
import urllib.parse
import urllib.request
from pathlib import Path

import pandas as pd


ROOT = Path(__file__).resolve().parents[1]
RAW = ROOT / "data" / "research" / "raw" / "market_calendar"
OUT = ROOT / "data" / "research" / "derived"
ENDPOINT = "https://push2his.eastmoney.com/api/qt/stock/kline/get"


def main() -> None:
    params = {
        "secid": "1.000001",
        "klt": "101",
        "fqt": "0",
        "beg": "19900101",
        "end": "20251231",
        "lmt": "10000",
        "fields1": "f1,f2,f3,f4,f5,f6",
        "fields2": "f51,f52,f53,f54,f55,f56,f57,f58,f59,f60,f61",
    }
    url = ENDPOINT + "?" + urllib.parse.urlencode(params)
    request = urllib.request.Request(url, headers={"User-Agent": "Mozilla/5.0"})
    with urllib.request.urlopen(request, timeout=60) as response:
        payload = json.loads(response.read().decode("utf-8"))
    RAW.mkdir(parents=True, exist_ok=True)
    OUT.mkdir(parents=True, exist_ok=True)
    raw_path = RAW / "eastmoney_shanghai_composite_daily_1990_2025.json"
    raw_path.write_text(json.dumps(payload, ensure_ascii=False), encoding="utf-8")

    klines = (payload.get("data") or {}).get("klines") or []
    dates = pd.to_datetime([str(row).split(",", 1)[0] for row in klines], errors="coerce")
    frame = pd.DataFrame({"交易日期": dates}).dropna()
    frame["年份"] = frame["交易日期"].dt.year
    annual = (
        frame[frame["年份"].between(1991, 2025)]
        .groupby("年份", as_index=False)
        .agg(年末最后交易日=("交易日期", "max"))
    )
    annual["财务报告期末"] = pd.to_datetime(annual["年份"].astype(str) + "-12-31")
    annual["交易日来源"] = "东方财富上海证券交易所综合指数日线"
    annual["用途"] = "确定iFinD历史全A年末快照日期；不用于收益计算"
    annual["是否计算"] = "是"
    annual.to_csv(
        OUT / "a_share_year_end_trading_dates_1991_2025.csv",
        index=False,
        encoding="utf-8-sig",
    )
    assert len(annual) == 35
    assert annual["年份"].tolist() == list(range(1991, 2026))
    print("year-end-trading-date assertions: OK")


if __name__ == "__main__":
    main()
