"""LeadPilot API.

A local, rule-based LinkedIn lead qualification and outreach-assistance service.

Explicitly NOT part of this application:
  * any LLM or AI API (messages come from templates and deterministic rules)
  * any LinkedIn automation, cookie access or security-evasion technique

The user performs every LinkedIn action themselves; LeadPilot only researches,
scores, drafts and tracks.
"""

from __future__ import annotations

import logging
from contextlib import asynccontextmanager

from fastapi import FastAPI, Request
from fastapi.middleware.cors import CORSMiddleware
from fastapi.responses import JSONResponse

from app import __version__
from app.config import settings
from app.database import init_db
from app.routers import analytics, campaigns, leads, outreach, rules, system, templates

logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)s %(name)s: %(message)s")
logger = logging.getLogger("leadpilot")


@asynccontextmanager
async def lifespan(_: FastAPI):
    init_db()
    logger.info("%s API ready (no AI services in use)", settings.app_name)
    yield


app = FastAPI(
    title=f"{settings.app_name} API",
    description=(
        "Rule-based LinkedIn lead qualification, message drafting and outreach task "
        "management. Contains no AI/LLM integration of any kind."
    ),
    version=__version__,
    lifespan=lifespan,
)

app.add_middleware(
    CORSMiddleware,
    allow_origins=settings.cors_origins,
    allow_origin_regex=settings.cors_origin_regex,
    allow_credentials=False,
    allow_methods=["*"],
    allow_headers=["*"],
)


@app.exception_handler(ValueError)
async def value_error_handler(_: Request, exc: ValueError) -> JSONResponse:
    """Surface service-layer validation errors as 422 instead of a 500."""
    return JSONResponse(status_code=422, content={"detail": str(exc)})


api_prefix = "/api"
app.include_router(system.router, prefix=api_prefix)
app.include_router(campaigns.router, prefix=api_prefix)
app.include_router(leads.router, prefix=api_prefix)
app.include_router(rules.router, prefix=api_prefix)
app.include_router(templates.router, prefix=api_prefix)
app.include_router(outreach.router, prefix=api_prefix)
app.include_router(outreach.replies_router, prefix=api_prefix)
app.include_router(analytics.router, prefix=api_prefix)


@app.get("/")
def root() -> dict[str, str]:
    return {
        "name": settings.app_name,
        "version": __version__,
        "docs": "/docs",
        "api": api_prefix,
        "aiUsage": "none",
    }


def run() -> None:  # pragma: no cover - convenience entry point
    import uvicorn

    uvicorn.run("app.main:app", host=settings.host, port=settings.port, reload=True)


if __name__ == "__main__":  # pragma: no cover
    run()
