import re
from fastapi import FastAPI
from fastapi.staticfiles import StaticFiles
from contextlib import asynccontextmanager

from app.database import engine, Base, SessionLocal
from app.models import *  # noqa: F401, F403 - import all models to register them
from app.routers import auth, publications, questions, jobs, fields, notifications, pages
from app.config import settings
from app.models.field import Field


DEFAULT_FIELDS = [
    {"name": "Computer Science", "color": "#2196F3", "icon": "💻", "description": "Algorithms, AI, software engineering, and computing systems"},
    {"name": "Engineering", "color": "#FF5722", "icon": "⚙️", "description": "Mechanical, electrical, civil, and chemical engineering"},
    {"name": "Biology", "color": "#4CAF50", "icon": "🧬", "description": "Life sciences, genetics, ecology, and biotechnology"},
    {"name": "Physics", "color": "#9C27B0", "icon": "⚛️", "description": "Quantum mechanics, astrophysics, and condensed matter"},
    {"name": "Mathematics", "color": "#607D8B", "icon": "📐", "description": "Pure and applied mathematics, statistics, and computation"},
    {"name": "Medicine", "color": "#F44336", "icon": "🏥", "description": "Clinical medicine, public health, and biomedical research"},
    {"name": "Chemistry", "color": "#FF9800", "icon": "🧪", "description": "Organic, inorganic, physical, and analytical chemistry"},
    {"name": "Social Science", "color": "#795548", "icon": "🌍", "description": "Psychology, sociology, economics, and political science"},
    {"name": "Astrophysics", "color": "#3F51B5", "icon": "🔭", "description": "Cosmology, stellar physics, and planetary science"},
    {"name": "Climate Change", "color": "#009688", "icon": "🌡️", "description": "Environmental science, sustainability, and climate modeling"},
]


def seed_fields(db):
    if db.query(Field).count() == 0:
        for f in DEFAULT_FIELDS:
            slug = re.sub(r"[^a-z0-9]+", "-", f["name"].lower()).strip("-")
            db.add(Field(name=f["name"], slug=slug, color=f["color"], icon=f["icon"], description=f["description"]))
        db.commit()


@asynccontextmanager
async def lifespan(app: FastAPI):
    Base.metadata.create_all(bind=engine)
    db = SessionLocal()
    try:
        seed_fields(db)
    finally:
        db.close()
    yield


app = FastAPI(
    title=settings.APP_NAME,
    description=settings.APP_DESCRIPTION,
    lifespan=lifespan,
)

# Static files
app.mount("/static", StaticFiles(directory="app/static"), name="static")
app.mount("/uploads", StaticFiles(directory=settings.UPLOAD_DIR), name="uploads")

# API routers
app.include_router(auth.router)
app.include_router(publications.router)
app.include_router(questions.router)
app.include_router(jobs.router)
app.include_router(fields.router)
app.include_router(notifications.router)

# Page routers (HTML)
app.include_router(pages.router)
