import json
import os
from typing import Optional

from db.database import conn, cursor

_PATH = "data/payment_info.json"
_MIGRATION_KEY = "payment_info_json_migrated"
_KEYS = {
    "qris_file_id",
    "dana_number",
    "banner_file_id",
    "main_caption",
}


def _get_setting(key):
    cursor.execute("SELECT value FROM settings WHERE key = ?", (key,))
    row = cursor.fetchone()
    return row[0] if row else None


def _set_setting(key, value):
    cursor.execute("""
        INSERT INTO settings (key, value) VALUES (?, ?)
        ON CONFLICT(key) DO UPDATE SET value = excluded.value
    """, (key, value))
    conn.commit()


def _delete_setting(key):
    cursor.execute("DELETE FROM settings WHERE key = ?", (key,))
    conn.commit()


def _migrate_json_if_needed():
    if _get_setting(_MIGRATION_KEY) == "1":
        return

    if os.path.exists(_PATH):
        try:
            with open(_PATH, "r", encoding="utf-8") as f:
                data = json.load(f)
        except Exception:
            data = {}

        if isinstance(data, dict):
            for key in _KEYS:
                value = data.get(key)
                if value:
                    _set_setting(key, str(value))

    _set_setting(_MIGRATION_KEY, "1")


def _load() -> dict:
    _migrate_json_if_needed()
    data = {}
    for key in _KEYS:
        value = _get_setting(key)
        if value:
            data[key] = value
    return data


def _save(data: dict):
    _migrate_json_if_needed()
    for key in _KEYS:
        value = data.get(key)
        if value:
            _set_setting(key, str(value))
        else:
            _delete_setting(key)


def get_payment_info() -> dict:
    return _load()


def set_qris(file_id: str):
    data = _load()
    data["qris_file_id"] = file_id
    _save(data)


def set_dana(number: str):
    data = _load()
    data["dana_number"] = number
    _save(data)


def build_payment_suffix() -> str:
    """Kembalikan teks nomor Dana untuk ditambahkan ke caption, kosong jika tidak ada."""
    info = _load()
    dana = info.get("dana_number", "").strip()
    return f"\n\n💳 Dana: <code>{dana}</code>" if dana else ""


def get_qris_file_id() -> Optional[str]:
    return _load().get("qris_file_id")


def set_banner(file_id: str):
    data = _load()
    data["banner_file_id"] = file_id
    _save(data)


def get_banner_file_id() -> Optional[str]:
    return _load().get("banner_file_id")


def set_main_caption(caption: str):
    data = _load()
    data["main_caption"] = caption
    _save(data)


def get_main_caption() -> Optional[str]:
    caption = _load().get("main_caption")
    return caption if caption else None


def reset_main_caption():
    data = _load()
    data.pop("main_caption", None)
    _save(data)
