import re
from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.orm import Session

from app.database import get_db
from app.models.user import User
from app.models.field import Field
from app.schemas import FieldCreate
from app.services.auth import require_user

router = APIRouter(prefix="/api/fields", tags=["fields"])


@router.get("")
def list_fields(db: Session = Depends(get_db)):
    fields = db.query(Field).filter(Field.is_active == True).order_by(Field.name).all()
    return [
        {"id": f.id, "name": f.name, "slug": f.slug, "description": f.description, "icon": f.icon, "color": f.color}
        for f in fields
    ]


@router.post("")
def create_field(data: FieldCreate, user: User = Depends(require_user), db: Session = Depends(get_db)):
    if not user.is_admin:
        raise HTTPException(status_code=403, detail="Admin only")
    slug = re.sub(r"[^a-z0-9]+", "-", data.name.lower()).strip("-")
    if db.query(Field).filter(Field.slug == slug).first():
        raise HTTPException(status_code=400, detail="Field already exists")
    field = Field(name=data.name, slug=slug, description=data.description, icon=data.icon, color=data.color)
    db.add(field)
    db.commit()
    db.refresh(field)
    return {"id": field.id, "name": field.name, "slug": field.slug}


@router.put("/{field_id}")
def update_field(field_id: int, data: FieldCreate, user: User = Depends(require_user), db: Session = Depends(get_db)):
    if not user.is_admin:
        raise HTTPException(status_code=403, detail="Admin only")
    field = db.query(Field).filter(Field.id == field_id).first()
    if not field:
        raise HTTPException(status_code=404, detail="Field not found")
    field.name = data.name
    field.slug = re.sub(r"[^a-z0-9]+", "-", data.name.lower()).strip("-")
    field.description = data.description
    field.icon = data.icon
    field.color = data.color
    db.commit()
    return {"id": field.id, "name": field.name}


@router.delete("/{field_id}")
def delete_field(field_id: int, user: User = Depends(require_user), db: Session = Depends(get_db)):
    if not user.is_admin:
        raise HTTPException(status_code=403, detail="Admin only")
    field = db.query(Field).filter(Field.id == field_id).first()
    if not field:
        raise HTTPException(status_code=404, detail="Field not found")
    field.is_active = False
    db.commit()
    return {"message": "Field deactivated"}
