from aiogram import Bot, Dispatcher
from aiogram.client.default import DefaultBotProperties
from aiogram.enums import ParseMode
from aiogram.fsm.storage.memory import MemoryStorage

import config
import database as db
from middlewares import MaintenanceMiddleware

import handlers_admin
import handlers_payments
import handlers_user


def create_bot_and_dispatcher() -> tuple[Bot, Dispatcher]:
    """
    Bot va Dispatcher obyektlarini yaratadi va barcha routerlarni ulaydi.
    Bu funksiya ham polling (main.py), ham webhook (webhook_app.py) rejimida
    ishlatiladi — handlerlar bir marta shu yerda yoziladi.
    """
    db.init_db()

    bot = Bot(token=config.BOT_TOKEN, default=DefaultBotProperties(parse_mode=ParseMode.MARKDOWN))
    dp = Dispatcher(storage=MemoryStorage())

    # Ta'mirlash rejimi faqat oddiy foydalanuvchilar uchun (admin router'ga tegmaydi)
    handlers_user.router.message.middleware(MaintenanceMiddleware())
    handlers_user.router.callback_query.middleware(MaintenanceMiddleware())
    handlers_payments.router.message.middleware(MaintenanceMiddleware())

    # Tartib muhim: admin va to'lov handlerlari birinchi tekshiriladi
    dp.include_router(handlers_admin.router)
    dp.include_router(handlers_payments.router)
    dp.include_router(handlers_user.router)

    return bot, dp
