"""
app.py — ห้องเฝ้าหุ้น (Watchline) backend
--------------------------------------------
รัน Flask server ที่ serve หน้าเว็บแอป (static/index.html)
และเปิด endpoint /api/history ให้หน้าเว็บเรียกดึงราคาหุ้นย้อนหลัง
จาก Yahoo Finance ผ่าน yfinance โดยตรง (ไม่ต้อง copy-paste CSV เองแล้ว)

วิธีติดตั้ง (ทำครั้งเดียว):
    pip install flask yfinance

วิธีรัน:
    python app.py

แล้วเปิดเบราว์เซอร์ไปที่:
    http://127.0.0.1:5000
"""

from flask import Flask, jsonify, request, send_from_directory

try:
    import yfinance as yf
except ImportError:
    raise SystemExit(
        "ยังไม่ได้ติดตั้ง yfinance กรุณารันคำสั่งนี้ก่อน:\n"
        "    pip install flask yfinance"
    )

app = Flask(__name__, static_folder="static", static_url_path="")

VALID_PERIODS = {"1mo", "2mo", "3mo", "4mo", "5mo", "6mo", "1y", "2y", "5y", "max"}


def normalize_period(period: str) -> str:
    """yfinance ไม่รองรับ 4mo/5mo ตรงๆ เลยขอ 6mo มาแล้วค่อยตัดทีหลัง"""
    return "6mo" if period in {"4mo", "5mo"} else period


@app.route("/")
def index():
    return send_from_directory(app.static_folder, "index.html")


@app.route("/api/history")
def api_history():
    symbol = (request.args.get("symbol") or "").strip().upper()
    period = (request.args.get("period") or "6mo").strip()

    if not symbol:
        return jsonify({"error": "กรุณาระบุสัญลักษณ์หุ้น (symbol)"}), 400
    if period not in VALID_PERIODS:
        return jsonify({"error": f"ช่วงเวลาไม่ถูกต้อง: {period}"}), 400

    ticker_symbol = symbol if symbol.endswith(".BK") else f"{symbol}.BK"

    try:
        hist = yf.Ticker(ticker_symbol).history(
            period=normalize_period(period), interval="1d"
        )
    except Exception as exc:  # noqa: BLE001 - surface any yfinance/network error to the UI
        return jsonify({"error": f"เชื่อมต่อ Yahoo Finance ไม่สำเร็จ: {exc}"}), 502

    if hist.empty:
        return jsonify({
            "error": f"ไม่พบข้อมูลของ {ticker_symbol} กรุณาตรวจสอบชื่อหุ้นอีกครั้ง "
                     f"(ตัวอย่าง: PTT, AOT, DELTA, KBANK, CPALL, ADVANC)"
        }), 404

    # ถ้าขอ 4-5 เดือน (yfinance ไม่มีตรงๆ) ตัดข้อมูลจากชุด 6 เดือนให้เหลือตามที่ขอ
    if period in {"4mo", "5mo"}:
        import pandas as pd
        months = int(period.replace("mo", ""))
        cutoff = hist.index[-1] - pd.DateOffset(months=months)
        hist = hist[hist.index >= cutoff]

    data = [
        {
            "date": idx.strftime("%Y-%m-%d"),
            "o": round(float(row["Open"]), 2),
            "h": round(float(row["High"]), 2),
            "l": round(float(row["Low"]), 2),
            "c": round(float(row["Close"]), 2),
        }
        for idx, row in hist.iterrows()
    ]

    return jsonify({"symbol": symbol, "ticker": ticker_symbol, "period": period, "data": data})


if __name__ == "__main__":
    import os
    import threading
    import webbrowser

    def open_browser():
        webbrowser.open("http://127.0.0.1:5000")

    # ป้องกันไม่ให้เบราว์เซอร์เปิดซ้ำสองครั้ง (Flask debug mode รันตัวเองซ้ำในโปรเซสลูก)
    if not os.environ.get("WERKZEUG_RUN_MAIN"):
        threading.Timer(1.25, open_browser).start()

    print("\n  ห้องเฝ้าหุ้น (Watchline) กำลังรันอยู่ที่ -> http://127.0.0.1:5000\n")
    app.run(debug=True, port=5000)
