import logging
from telegram import BotCommand, BotCommandScopeAllGroupChats, BotCommandScopeAllPrivateChats
from telegram.ext import Application, CommandHandler, MessageHandler, filters

from config.settings import BOT_TOKEN, BOT_TYPE
from services.database import db
from handlers import commands as cmd
from services.logger import setup_logging

logger = setup_logging()

MENU_COMMANDS = [
    BotCommand("balance", "💰 ব্যালেন্স দেখুন"),
    BotCommand("payin", "📥 Payin অর্ডার চেক"),
    BotCommand("payout", "📤 Payout অর্ডার চেক"),
    BotCommand("recent", "📋 সাম্প্রতিক অর্ডার"),
    BotCommand("status", "🔗 লিংক স্ট্যাটাস"),
    BotCommand("link", "🔗 অ্যাকাউন্ট লিংক"),
    BotCommand("unlink", "❌ আনলিংক"),
    BotCommand("apidoc", "📖 API ডকুমেন্টেশন"),
    BotCommand("help", "❓ সাহায্য"),
]


async def post_init(app: Application):
    try:
        await db.connect()
        logger.info("Database connected (%s bot)", BOT_TYPE)
    except Exception as e:
        logger.error("Database connect failed: %s", e)
        raise

    try:
        await app.bot.set_my_commands(MENU_COMMANDS)
        await app.bot.set_my_commands(MENU_COMMANDS, scope=BotCommandScopeAllPrivateChats())
        await app.bot.set_my_commands(MENU_COMMANDS, scope=BotCommandScopeAllGroupChats())
        logger.info("Bot command menu set")
    except Exception as e:
        logger.warning("Could not set commands menu: %s", e)


async def post_shutdown(app: Application):
    try:
        await db.close()
        logger.info("Database closed")
    except Exception as e:
        logger.warning("Database close error: %s", e)


def build_application() -> Application:
    if not BOT_TOKEN:
        raise SystemExit("BOT_TOKEN not set in .env")

    app = (
        Application.builder()
        .token(BOT_TOKEN)
        .post_init(post_init)
        .post_shutdown(post_shutdown)
        .build()
    )

    app.add_handler(CommandHandler("start", cmd.start))
    app.add_handler(CommandHandler("help", cmd.help_cmd))
    app.add_handler(CommandHandler("link", cmd.link))
    app.add_handler(CommandHandler("unlink", cmd.unlink))
    app.add_handler(CommandHandler("status", cmd.status))
    app.add_handler(CommandHandler("balance", cmd.balance))
    app.add_handler(CommandHandler("payin", cmd.payin))
    app.add_handler(CommandHandler("payout", cmd.payout))
    app.add_handler(CommandHandler("recent", cmd.recent))
    app.add_handler(CommandHandler("apidoc", cmd.apidoc))
    app.add_handler(MessageHandler(filters.COMMAND, cmd.unknown))

    return app
