import asyncio
import base64
from contextlib import asynccontextmanager, suppress
from pathlib import Path

from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from fastapi.responses import Response
from fastapi.staticfiles import StaticFiles

from app.config import settings
from app.db import init_db, reset_runtime_state
from app.routers import hihaho, join, line_webhook, polls, stream, ws
from app.services.poll_scheduler import scheduler_loop


@asynccontextmanager
async def lifespan(app: FastAPI):
    await init_db()
    if settings.reset_runtime_state_on_startup:
        await reset_runtime_state()
    stop_event = asyncio.Event()
    task = asyncio.create_task(scheduler_loop(stop_event))
    yield
    stop_event.set()
    task.cancel()
    with suppress(asyncio.CancelledError):
        await task


app = FastAPI(title="LINE hihaho Voting MVP", lifespan=lifespan)

app.add_middleware(
    CORSMiddleware,
    allow_origins=settings.cors_origins_list,
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

app.include_router(line_webhook.router)
app.include_router(polls.router)
app.include_router(stream.router)
app.include_router(ws.router)
app.include_router(hihaho.router)
app.include_router(join.router)


@app.get("/health")
def health():
    return {"status": "ok"}


_FAVICON_PNG = base64.b64decode(
    "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg=="
)


@app.get("/favicon.ico", include_in_schema=False)
def favicon():
    return Response(content=_FAVICON_PNG, media_type="image/png")


_ui = Path(__file__).resolve().parents[2] / "frontend"
if _ui.is_dir():
    app.mount("/ui", StaticFiles(directory=str(_ui), html=True), name="ui")

if settings.static_dir:
    app.mount(
        "/static",
        StaticFiles(directory=settings.static_dir),
        name="static",
    )
