"""Puls Backend – FastAPI App."""
from typing import Optional, List
from fastapi import FastAPI, Depends, HTTPException, Query
from sqlalchemy.orm import Session

from .db import Base, engine, get_db
from .models import Application
from .schemas import ApplicationCreate, ApplicationUpdate, ApplicationOut

# Tabellen anlegen
Base.metadata.create_all(bind=engine)

app = FastAPI(
    title="Puls Backend",
    description="Bewerbungs-Tracker API für Chris Bringemeier",
    version="0.1.0",
)


@app.get("/")
def root():
    return {"service": "puls-backend", "status": "ok", "docs": "/docs"}


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


@app.get("/applications", response_model=List[ApplicationOut])
def list_applications(
    status: Optional[str] = Query(None, description="Filter by status"),
    q: Optional[str] = Query(None, description="Suche in Firma/Position"),
    db: Session = Depends(get_db),
):
    query = db.query(Application)
    if status:
        query = query.filter(Application.status == status)
    if q:
        like = f"%{q}%"
        query = query.filter((Application.company.ilike(like)) | (Application.position.ilike(like)))
    return query.order_by(Application.last_update.desc()).all()


@app.get("/applications/{app_id}", response_model=ApplicationOut)
def get_application(app_id: int, db: Session = Depends(get_db)):
    app_obj = db.query(Application).filter(Application.id == app_id).first()
    if not app_obj:
        raise HTTPException(status_code=404, detail="Application not found")
    return app_obj


@app.post("/applications", response_model=ApplicationOut, status_code=201)
def create_application(payload: ApplicationCreate, db: Session = Depends(get_db)):
    app_obj = Application(**payload.model_dump())
    db.add(app_obj)
    db.commit()
    db.refresh(app_obj)
    return app_obj


@app.put("/applications/{app_id}", response_model=ApplicationOut)
def update_application(app_id: int, payload: ApplicationUpdate, db: Session = Depends(get_db)):
    app_obj = db.query(Application).filter(Application.id == app_id).first()
    if not app_obj:
        raise HTTPException(status_code=404, detail="Application not found")
    updates = payload.model_dump(exclude_unset=True)
    for key, value in updates.items():
        setattr(app_obj, key, value)
    db.commit()
    db.refresh(app_obj)
    return app_obj


@app.delete("/applications/{app_id}", status_code=204)
def delete_application(app_id: int, db: Session = Depends(get_db)):
    app_obj = db.query(Application).filter(Application.id == app_id).first()
    if not app_obj:
        raise HTTPException(status_code=404, detail="Application not found")
    db.delete(app_obj)
    db.commit()
    return None
