import asyncio
import os

from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from dotenv import load_dotenv

import state
from api import router as api
from parser import parser_loop
from proxy_manager import ProxyManager
import aiomysql

load_dotenv()

app = FastAPI(
    title="Hotline Parser API",
    description="API для парсингу сайту Hotline.ua",
    version="1.0.0",
    docs_url="/docs",
    openapi_url="/openapi.json"
)

app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

app.include_router(api, prefix="/api")


# Для збереження задач, щоб їх можна було коректно завершити
background_tasks = []

@app.on_event("startup")
async def startup():
    # Ініціалізуємо пул з'єднань
    state.db_pool = await aiomysql.create_pool(
        host=os.getenv("DB_HOST"),
        user=os.getenv("DB_USER"),
        password=os.getenv("DB_PASSWORD"),
        db=os.getenv("DB_NAME"),
        port=int(os.getenv("DB_PORT")),
        autocommit=True,
        minsize=1,
        maxsize=5,
    )

    proxy_manager = ProxyManager(state.db_pool)

    # Запускаємо таски в бекграунді
    loop = asyncio.get_event_loop()
    task1 = loop.create_task(proxy_manager.run_periodic_unban())
    task2 = loop.create_task(parser_loop(proxy_manager))
    background_tasks.extend([task1, task2])

@app.on_event("shutdown")
async def shutdown():
    # Відміняємо бекграунд таски
    for task in background_tasks:
        task.cancel()
        try:
            await task
        except asyncio.CancelledError:
            pass

    # Закриваємо пул
    if state.db_pool:
        state.db_pool.close()
        await state.db_pool.wait_closed()
