from __future__ import annotations

import asyncio
import logging
from os import getenv

from litegram import Bot, Dispatcher, F, Router
from litegram.filters import Command
from litegram.types import LabeledPrice, Message, PreCheckoutQuery

TOKEN = getenv("BOT_TOKEN")

GOODS = {  # Fake storage for goods, in real life it should be a database
    "demo": 1,
    "another": 0,
}

logger = logging.getLogger(__name__)
invoices_router = Router(name=__name__)


@invoices_router.message(Command("start"))
async def command_start(message: Message) -> None:
    # Send demo invoice to user, the payment will be refunded after successful payment
    await message.answer_invoice(
        title="Demo invoice",
        description="Demo invoice description",
        prices=[
            LabeledPrice(label="Demo", amount=42),
        ],
        payload="demo",
        currency="XTR",
    )


@invoices_router.pre_checkout_query(F.invoice_payload == "demo")
async def pre_checkout_query(query: PreCheckoutQuery) -> None:
    # if your product is available for sale,
    # confirm that you are ready to accept payment
    if query.invoice_payload and GOODS.get(query.invoice_payload, 0) > 0:
        await query.answer(ok=True)
    else:
        await query.answer(ok=False, error_message="The product is out of stock")


@invoices_router.message(F.successful_payment)
async def successful_payment(message: Message, bot: Bot) -> None:
    await bot.refund_star_payment(
        user_id=message.from_user.id,
        telegram_payment_charge_id=message.successful_payment.telegram_payment_charge_id,
    )
    await message.answer("Thanks. Your payment has been refunded.")


async def main() -> None:
    bot = Bot(token=TOKEN)

    dispatcher = Dispatcher()
    dispatcher.include_router(invoices_router)

    await dispatcher.start_polling(bot)


if __name__ == "__main__":
    logging.basicConfig(level=logging.INFO)
    asyncio.run(main())
