import time
from datetime import datetime, timezone, timedelta

# 実装時に repositories を使ってDBへ書き込み
from repositories.indicators import upsert_indicator
import os
import sqlite3

DB_PATH = os.getenv("APP_DB_PATH", "data/app.db")

def _conn():
    os.makedirs(os.path.dirname(DB_PATH), exist_ok=True)
    con = sqlite3.connect(DB_PATH)
    con.row_factory = sqlite3.Row
    return con

# ---- ここはJ-Quants API呼び出しのダミー実装 ----
def fetch_codes() -> list[str]:
    # TODO: stocksテーブルから取得するのが実装形。ここでは2件ダミー
    return ["7203", "6758"]

def fetch_indicators_from_jquants(code: str) -> dict:
    # TODO: 実際はJ-Quantsで取得
    # ダミー値を返す
    return {"per": 12.3, "roe": 13.1, "pbr": 1.2, "sales_growth": 4.8}

def match_rule(ind: dict) -> bool:
    # 固定ルール（例）：ROE>=12
    return (ind.get("roe") or 0) >= 12
# ------------------------------------------------

def commit_recommendations_latest(codes: list[str]) -> None:
    """
    recommendations_latest を全入れ替えする。
    """
    now = datetime.now(timezone(timedelta(hours=9))).isoformat()
    with _conn() as con:
        con.execute("DELETE FROM recommendations_latest")
        for c in codes:
            con.execute("""
                INSERT INTO recommendations_latest(code, rule_set_id, reason, scored_at)
                VALUES(?, 'default', 'ROE>=12', ?)
            """, (c, now))
        # メタ更新（metaテーブルがあれば）
        # con.execute("INSERT INTO meta(key, value) VALUES('last_update', ?) ON CONFLICT(key) DO UPDATE SET value=excluded.value", (now,))
        con.commit()

def batch_update():
    codes = fetch_codes()
    picked = []
    today = datetime.now(timezone(timedelta(hours=9))).date().isoformat()
    now = datetime.now(timezone(timedelta(hours=9))).isoformat()

    for code in codes:
        ind = fetch_indicators_from_jquants(code)
        # DB upsert（ダミー）
        upsert_indicator(
            code=code,
            snapshot_at=today,
            per=ind.get("per"),
            roe=ind.get("roe"),
            pbr=ind.get("pbr"),
            sales_growth=ind.get("sales_growth"),
            updated_at=now
        )
        if match_rule(ind):
            picked.append(code)
        time.sleep(0.2)  # レート制限の雰囲気

    commit_recommendations_latest(picked)
    print(f"[OK] updated: {len(picked)} items")

if __name__ == "__main__":
    batch_update()
