from __future__ import annotations

from fastapi import FastAPI, HTTPException, Query
from fastapi.middleware.cors import CORSMiddleware
from fastapi.responses import FileResponse
from fastapi.staticfiles import StaticFiles
from pathlib import Path

from .repository import PostgresRepository
from .service import DashboardService

BASE_DIR = Path(__file__).resolve().parents[1]
STATIC_DIR = BASE_DIR / "static"


def create_app(service: DashboardService | None = None) -> FastAPI:
    svc = service or DashboardService(PostgresRepository())
    app = FastAPI(title="良渚电商数据看板 API", version="0.1.0")
    app.state.dashboard_service = svc
    app.add_middleware(
        CORSMiddleware,
        allow_origins=["*"],
        allow_methods=["GET"],
        allow_headers=["*"],
    )

    @app.get("/api/health")
    def health():
        return {"ok": True, "service": "liangzhu-dashboard"}

    @app.get("/api/meta")
    def meta():
        return app.state.dashboard_service.meta()

    @app.get("/api/dashboard")
    def dashboard(
        grain: str = Query("day", pattern="^(day|week|month)$"),
        date: str | None = Query(None, description="YYYY-MM-DD"),
    ):
        try:
            return app.state.dashboard_service.dashboard(grain, date)
        except ValueError as exc:
            raise HTTPException(status_code=400, detail=str(exc)) from exc

    if STATIC_DIR.exists():
        app.mount("/static", StaticFiles(directory=str(STATIC_DIR)), name="static")

        @app.get("/")
        def index():
            return FileResponse(STATIC_DIR / "index.html")

    return app


app = create_app()
