from __future__ import annotations

from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware

from app.config import settings

from .middleware import RequestLoggingMiddleware
from .routes import (
    broadcasts,
    backups,
    campaigns,
    config,
    health,
    main_menu_buttons,
    promocodes,
    miniapp,
    promo_groups,
    promo_offers,
    pages,
    remnawave,
    stats,
    subscriptions,
    tickets,
    tokens,
    transactions,
    users,
)


OPENAPI_TAGS = [
    {
        "name": "health",
        "description": "Мониторинг состояния административного API и связанных сервисов.",
    },
    {
        "name": "stats",
        "description": "Сводные показатели по пользователям, подпискам и платежам.",
    },
    {
        "name": "settings",
        "description": "Получение и изменение конфигурации бота из административной панели.",
    },
    {
        "name": "main-menu",
        "description": "Управление кнопками главного меню Telegram-бота.",
    },
    {
        "name": "users",
        "description": "Управление пользователями, балансом и статусами подписок.",
    },
    {
        "name": "subscriptions",
        "description": "Создание, продление и настройка подписок бота.",
    },
    {
        "name": "support",
        "description": "Работа с тикетами поддержки, приоритетами и ограничениями на ответы.",
    },
    {
        "name": "transactions",
        "description": "История финансовых операций и пополнений баланса.",
    },
    {
        "name": "promo-groups",
        "description": "Создание и управление промо-группами и их участниками.",
    },
    {
        "name": "promo-offers",
        "description": "Управление промо-предложениями, шаблонами и журналом событий.",
    },
    {
        "name": "auth",
        "description": "Управление токенами доступа к административному API.",
    },
    {
        "name": "remnawave",
        "description": (
            "Интеграция с RemnaWave: статус панели, управление нодами, сквадами и синхронизацией "
            "данных между ботом и панелью."
        ),
    },
    {
        "name": "miniapp",
        "description": "Endpoint для Telegram Mini App с информацией о подписке пользователя.",
    },
    {
        "name": "pages",
        "description": "Управление контентом публичных страниц: оферта, политика, FAQ и правила.",
    },
]


def create_web_api_app() -> FastAPI:
    docs_config = settings.get_web_api_docs_config()

    app = FastAPI(
        title=settings.WEB_API_TITLE,
        version=settings.WEB_API_VERSION,
        docs_url=docs_config.get("docs_url"),
        redoc_url=docs_config.get("redoc_url"),
        openapi_url=docs_config.get("openapi_url"),
        openapi_tags=OPENAPI_TAGS,
        swagger_ui_parameters={"persistAuthorization": True},
    )

    allowed_origins = settings.get_web_api_allowed_origins()
    app.add_middleware(
        CORSMiddleware,
        allow_origins=["*"] if allowed_origins == ["*"] else allowed_origins,
        allow_credentials=True,
        allow_methods=["*"],
        allow_headers=["*"],
    )

    if settings.WEB_API_REQUEST_LOGGING:
        app.add_middleware(RequestLoggingMiddleware)

    app.include_router(health.router)
    app.include_router(stats.router, prefix="/stats", tags=["stats"])
    app.include_router(config.router, prefix="/settings", tags=["settings"])
    app.include_router(users.router, prefix="/users", tags=["users"])
    app.include_router(subscriptions.router, prefix="/subscriptions", tags=["subscriptions"])
    app.include_router(tickets.router, prefix="/tickets", tags=["support"])
    app.include_router(transactions.router, prefix="/transactions", tags=["transactions"])
    app.include_router(promo_groups.router, prefix="/promo-groups", tags=["promo-groups"])
    app.include_router(promo_offers.router, prefix="/promo-offers", tags=["promo-offers"])
    app.include_router(
        main_menu_buttons.router,
        prefix="/main-menu/buttons",
        tags=["main-menu"],
    )
    app.include_router(pages.router, prefix="/pages", tags=["pages"])
    app.include_router(promocodes.router, prefix="/promo-codes", tags=["promo-codes"])
    app.include_router(broadcasts.router, prefix="/broadcasts", tags=["broadcasts"])
    app.include_router(backups.router, prefix="/backups", tags=["backups"])
    app.include_router(campaigns.router, prefix="/campaigns", tags=["campaigns"])
    app.include_router(tokens.router, prefix="/tokens", tags=["auth"])
    app.include_router(remnawave.router, prefix="/remnawave", tags=["remnawave"])
    app.include_router(miniapp.router, prefix="/miniapp", tags=["miniapp"])

    return app
