# -*- coding: utf-8 -*-
"""
miniapp_api.py — پل ارتباطی مینی‌اپ و ربات کلینیک کنکور
========================================================
این فایل روی هاست (cPanel > Setup Python App) اجرا می‌شود و داده‌ها را
به‌صورت زنده از همان bot.db ربات می‌خواند تا مینی‌اپ همیشه با ربات سینک باشد.

نصب پکیج‌ها (در محیط Python App هاست):
    pip install flask flask-cors

نکته‌ی مهم: این فایل باید به bot.db دسترسی خواندن داشته باشد؛
یعنی bot.db را کنار همین فایل (یا با مسیر کامل در DB_PATH) بگذار.
"""
import os
import sqlite3
from flask import Flask, jsonify, request
from flask_cors import CORS

# ── مسیر دیتابیس ربات ──────────────────────────────
DB_PATH = os.environ.get("BOT_DB_PATH") or os.path.join(os.path.dirname(__file__), "bot.db")

# ── طرح‌های مشاوره (قیمت‌ها را اینجا ویرایش کن) ──────
PLANS = [
    {"id": 1, "name": "تک‌جلسه‌ای", "full": "مشاوره تک‌جلسه‌ای",
     "desc": "تحلیل وضعیت + برنامه‌ی ۲ هفته‌ای",
     "cash": 290000, "old": 390000, "inst": None, "vip": False,
     "feats": ["تحلیل کارنامه و نقاط ضعف", "برنامه‌ی ۲ هفته‌ای شخصی",
               "فایل PDF برنامه", "پشتیبانی ۳ روزه"]},
    {"id": 2, "name": "۳ ماهه خصوصی", "full": "طرح ۳ ماهه خصوصی",
     "desc": "پشتیبانی کامل تا جمع‌بندی نیمسال",
     "cash": 2900000, "old": 3600000,
     "inst": {"count": 3, "per": 1050000}, "vip": True,
     "feats": ["برنامه‌ی هفتگی شخصی‌سازی‌شده", "آزمون اختصاصی ماهانه",
               "پشتیبانی روزانه در تلگرام", "جلسه‌ی ماهانه با مشاور ارشد"]},
    {"id": 3, "name": "سالانه VIP", "full": "طرح سالانه VIP",
     "desc": "همراهی کامل تا روز کنکور",
     "cash": 8900000, "old": 12000000,
     "inst": {"count": 10, "per": 990000}, "vip": True,
     "feats": ["همه‌ی امکانات طرح ۳ ماهه", "کارگاه‌های خصوصی رایگان",
               "تحلیل پیشرفته‌ی آزمون‌ها", "اولویت پشتیبانی تلفنی"]},
]

app = Flask(__name__)
CORS(app)  # اجازه‌ی دسترسی از دامنه‌ی مینی‌اپ


def db():
    con = sqlite3.connect(DB_PATH)
    con.row_factory = sqlite3.Row
    return con


@app.get("/api/health")
def health():
    ok = os.path.exists(DB_PATH)
    return jsonify({"ok": ok, "db": DB_PATH if ok else "not found"})


@app.get("/api/workshops")
def workshops():
    """کارگاه‌ها = دوره‌های بخش فیلم/نهایی به‌همراه استاد و درس"""
    try:
        con = db()
        rows = con.execute("""
            SELECT c.id, c.name AS title, t.name AS teacher,
                   t.subject_slug AS subject, t.group_key AS grp
            FROM courses c JOIN teachers t ON t.id = c.teacher_id
            WHERE t.group_key IN ('film','final')
            ORDER BY c.id DESC LIMIT 60
        """).fetchall()
        con.close()
        return jsonify([dict(r) | {"emoji": "🎬", "dur": "", "level": ""}
                        for r in rows])
    except Exception as e:
        return jsonify({"error": str(e)}), 500


@app.get("/api/exams")
def exams():
    """
    آزمون‌ها — از جدول‌های ماژول exam_builder خوانده می‌شود.
    چون ساختار دقیق جدول‌های exam_builder ممکن است فرق کند،
    این تابع چند نام رایج جدول را امتحان می‌کند.
    اگر جدول دیگری داری، نامش را به CANDIDATES اضافه کن.
    """
    CANDIDATES = ["exams", "online_exams", "exam_list"]
    con = db()
    tables = {r[0] for r in con.execute(
        "SELECT name FROM sqlite_master WHERE type='table'")}
    for tbl in CANDIDATES:
        if tbl in tables:
            cols = {r[1] for r in con.execute(f"PRAGMA table_info({tbl})")}
            # ستون‌های احتمالی عنوان/پایه/زمان
            tcol = next((c for c in ("title", "name", "label") if c in cols), None)
            if not tcol:
                continue
            rows = con.execute(f"SELECT * FROM {tbl} ORDER BY rowid DESC LIMIT 40").fetchall()
            out = []
            for r in rows:
                d = dict(r)
                out.append({
                    "id": d.get("id") or d.get("rowid"),
                    "title": d.get(tcol),
                    "org": "کلینیک کنکور",
                    "grade": d.get("grade", ""),
                    "date": d.get("date", "") or d.get("created_at", ""),
                    "mins": d.get("duration_min", 20) or 20,
                    "joined": d.get("participants", 0) or 0,
                    # سؤال‌ها: اگر جدول جدا دارد، در قدم بعد اضافه می‌کنیم
                    "questions": [],
                })
            con.close()
            return jsonify(out)
    con.close()
    # اگر جدول آزمون پیدا نشد، لیست تاریخ‌های آزمون ربات را بده
    return jsonify([])


@app.get("/api/exam_questions")
def exam_questions():
    """سؤال‌های یک آزمون: /api/exam_questions?exam_id=..."""
    exam_id = request.args.get("exam_id")
    con = db()
    tables = {r[0] for r in con.execute(
        "SELECT name FROM sqlite_master WHERE type='table'")}
    for tbl in ("exam_questions", "questions", "online_exam_questions"):
        if tbl in tables:
            cols = {r[1] for r in con.execute(f"PRAGMA table_info({tbl})")}
            ecol = next((c for c in ("exam_id", "exam", "parent_id") if c in cols), None)
            qcol = next((c for c in ("question", "text", "title") if c in cols), None)
            if ecol and qcol and exam_id:
                rows = con.execute(
                    f"SELECT * FROM {tbl} WHERE {ecol}=? ORDER BY rowid",
                    (exam_id,)).fetchall()
                con.close()
                return jsonify([dict(r) for r in rows])
    con.close()
    return jsonify([])


@app.get("/api/plans")
def plans():
    return jsonify(PLANS)


@app.get("/api/leaderboard")
def leaderboard():
    """رتبه‌بندی بر اساس امتیاز کاربران (ستون points جدول users)"""
    try:
        con = db()
        rows = con.execute("""
            SELECT user_id, full_name, username, points
            FROM users ORDER BY points DESC LIMIT 20
        """).fetchall()
        con.close()
        me = request.args.get("user_id", type=int)
        out = []
        for r in rows:
            name = r["full_name"] or (("@" + r["username"]) if r["username"] else f"کاربر {r['user_id']}")
            out.append({"name": name, "pts": r["points"] or 0,
                        "me": (me is not None and r["user_id"] == me)})
        return jsonify(out)
    except Exception as e:
        return jsonify({"error": str(e)}), 500


@app.get("/api/me")
def me():
    """اطلاعات کاربر: /api/me?user_id=..."""
    uid = request.args.get("user_id", type=int)
    if not uid:
        return jsonify({"error": "user_id required"}), 400
    con = db()
    r = con.execute("SELECT user_id, full_name, username, points FROM users WHERE user_id=?",
                    (uid,)).fetchone()
    pur = con.execute("""SELECT plan_id, pay_type, created_at FROM purchases
                         WHERE user_id=? ORDER BY id DESC LIMIT 1""",
                      (uid,)).fetchone() if _has_table(con, "purchases") else None
    con.close()
    if not r:
        return jsonify({"error": "not found"}), 404
    return jsonify({
        "user_id": r["user_id"],
        "name": r["full_name"] or r["username"] or "",
        "points": r["points"] or 0,
        "plan": dict(pur) if pur else None,
    })


@app.post("/api/purchase")
def purchase():
    """ثبت خرید طرح مشاوره (بعد از پرداخت موفق درگاه)"""
    data = request.get_json(force=True) or {}
    uid, plan_id = data.get("user_id"), data.get("plan_id")
    if not uid or not plan_id:
        return jsonify({"error": "user_id and plan_id required"}), 400
    con = db()
    con.execute("""CREATE TABLE IF NOT EXISTS purchases(
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        user_id INTEGER, plan_id INTEGER, pay_type TEXT,
        phone TEXT, created_at TEXT DEFAULT CURRENT_TIMESTAMP)""")
    con.execute("INSERT INTO purchases(user_id, plan_id, pay_type, phone) VALUES(?,?,?,?)",
                (uid, plan_id, data.get("pay_type", "cash"), data.get("phone", "")))
    # اگر خصوصی شد، می‌توانی اینجا کاربر را در ربات هم علامت بزنی
    con.commit()
    con.close()
    return jsonify({"ok": True})


def _has_table(con, name):
    return con.execute("SELECT 1 FROM sqlite_master WHERE type='table' AND name=?",
                       (name,)).fetchone() is not None


# برای cPanel (Passenger) این آبجکت لازم است
application = app

if __name__ == "__main__":
    app.run(host="127.0.0.1", port=5000)
