from __future__ import annotations

import html
import logging
from datetime import datetime
from zoneinfo import ZoneInfo
from telebot.types import LabeledPrice
from src import keyboards
from src.repositories import repo

log = logging.getLogger(__name__)
ALLOWED_AMOUNTS = {10, 25, 50, 100, 250, 500}


def register(bot):
    @bot.callback_query_handler(func=lambda c: c.data == "donate:menu")
    def donation_menu(call):
        bot.answer_callback_query(call.id)
        text = (
            "⭐ <b>Donasi Telegram Stars</b>\n\n"
            "Dukungan Anda membantu biaya operasional dan pengembangan bot. "
            "Pilih jumlah bintang yang ingin dikirim:"
        )
        try:
            bot.edit_message_text(text, call.message.chat.id, call.message.message_id,
                                  parse_mode="HTML", reply_markup=keyboards.donation_menu())
        except Exception:
            bot.send_message(call.message.chat.id, text, parse_mode="HTML",
                             reply_markup=keyboards.donation_menu())

    @bot.callback_query_handler(func=lambda c: c.data == "donate:back")
    def donation_back(call):
        bot.answer_callback_query(call.id)
        name = html.escape(call.from_user.first_name or "User")
        username = call.from_user.username
        username_text = (
            f"@{html.escape(username)}"
            if username
            else "<i>Tidak memiliki username</i>"
        )

        start_time = datetime.now(
            ZoneInfo("Asia/Jakarta")
        ).strftime("%d-%m-%Y %H:%M:%S WIB")

        user_row = repo.user(call.from_user.id)
        joined_at = "–"
        if user_row and user_row["joined_at"]:
            try:
                joined_at = datetime.strptime(
                    user_row["joined_at"], "%Y-%m-%d %H:%M:%S"
                ).strftime("%d-%m-%Y")
            except ValueError:
                joined_at = user_row["joined_at"]
        total_users = repo.user_count()

        try:
            text = repo.setting("welcome_text").format(
                name=html.escape(name),
                username=username_text,
                user_id=call.from_user.id,
                start_time=start_time,
                joined_at=joined_at,
                total_users=total_users,
            )
        except (KeyError, ValueError):
            log.warning("Template welcome tidak valid; memakai fallback")
            text = f"Halo, <b>{html.escape(name)}</b>! 👋"
        try:
            bot.edit_message_text(text, call.message.chat.id, call.message.message_id,
                                  parse_mode="HTML", reply_markup=keyboards.welcome())
        except Exception:
            bot.send_message(call.message.chat.id, text, parse_mode="HTML",
                             reply_markup=keyboards.welcome())

    @bot.callback_query_handler(func=lambda c: c.data.startswith("donate:") and c.data.split(":",1)[1].isdigit())
    def create_invoice(call):
        amount = int(call.data.split(":", 1)[1])
        if amount not in ALLOWED_AMOUNTS:
            return bot.answer_callback_query(call.id, "Jumlah donasi tidak valid.", show_alert=True)
        bot.answer_callback_query(call.id)
        payload = f"donation:{call.from_user.id}:{amount}"
        bot.send_invoice(
            chat_id=call.message.chat.id,
            title=f"Donasi {amount} Telegram Stars",
            description="Dukungan sukarela untuk operasional dan pengembangan VIRALINMAS MEDIA.",
            invoice_payload=payload,
            provider_token="",
            currency="XTR",
            prices=[LabeledPrice(label="Donasi", amount=amount)],
        )

    @bot.pre_checkout_query_handler(func=lambda q: True)
    def pre_checkout(query):
        valid = query.invoice_payload.startswith("donation:") and query.currency == "XTR"
        bot.answer_pre_checkout_query(
            query.id, ok=valid,
            error_message=None if valid else "Invoice donasi tidak valid."
        )

    @bot.message_handler(content_types=["successful_payment"])
    def successful_payment(message):
        payment = message.successful_payment
        repo.add_star_donation(
            message.from_user.id,
            payment.total_amount,
            payment.telegram_payment_charge_id,
            payment.provider_payment_charge_id,
            payment.invoice_payload,
        )
        bot.send_message(
            message.chat.id,
            f"✅ <b>Terima kasih!</b>\n\nDonasi <b>{payment.total_amount} ⭐</b> berhasil diterima.",
            parse_mode="HTML",
            reply_markup=keyboards.welcome(),
        )
