"""Floor CRUD router."""

from datetime import datetime

from fastapi import APIRouter, Depends, HTTPException, Query, status
from pydantic import BaseModel, Field
from sqlalchemy.orm import Session

from app.database import get_db
from app.models.floor import Floor
from app.models.house import House
from app.models.user import User
from app.schemas.floor import FloorCreate, FloorRead, FloorUpdate
from app.services.auth_service import get_current_user
from app.services.permission_service import require_permission
from app.utils.helpers import generate_uuid, paginate

router = APIRouter()


# ── Custom schemas ─────────────────────────────────────────────────────── #

class ReorderBody(BaseModel):
    sort_order: int = Field(..., ge=0)


# ── Helpers ────────────────────────────────────────────────────────────── #

def get_floor_or_404(floor_id: str, db: Session) -> Floor:
    floor = db.query(Floor).filter(Floor.id == floor_id).first()
    if not floor:
        raise HTTPException(
            status_code=status.HTTP_404_NOT_FOUND,
            detail="楼层不存在",
        )
    return floor


# ── Endpoints ──────────────────────────────────────────────────────────── #

@router.get(
    "/api/houses/{hid}/floors",
    response_model=dict,
    summary="获取房屋楼层列表",
)
def list_floors(
    hid: str,
    page: int = Query(1, ge=1),
    size: int = Query(50, ge=1, le=200),
    db: Session = Depends(get_db),
    _: User = Depends(get_current_user),
    __=Depends(require_permission("house.view")),
):
    """List all floors for a house (paginated)."""
    # Verify house exists
    house = db.query(House).filter(House.id == hid).first()
    if not house:
        raise HTTPException(
            status_code=status.HTTP_404_NOT_FOUND,
            detail="房屋不存在",
        )

    query = (
        db.query(Floor)
        .filter(Floor.house_id == hid)
        .order_by(Floor.sort_order, Floor.level)
    )
    result = paginate(query, page=page, size=size)

    return {
        "items": [FloorRead.model_validate(f) for f in result["items"]],
        "total": result["total"],
        "page": result["page"],
        "size": result["size"],
        "pages": result["pages"],
    }


@router.post(
    "/api/houses/{hid}/floors",
    response_model=FloorRead,
    status_code=status.HTTP_201_CREATED,
    summary="创建楼层",
)
def create_floor(
    hid: str,
    body: FloorCreate,
    db: Session = Depends(get_db),
    _: User = Depends(get_current_user),
    __=Depends(require_permission("house.edit")),
):
    """Create a new floor in a house."""
    # Verify house exists
    house = db.query(House).filter(House.id == hid).first()
    if not house:
        raise HTTPException(
            status_code=status.HTTP_404_NOT_FOUND,
            detail="房屋不存在",
        )

    floor = Floor(
        id=generate_uuid(),
        house_id=hid,
        name=body.name,
        level=body.level,
        sort_order=body.sort_order,
        created_at=datetime.utcnow(),
    )
    db.add(floor)
    db.commit()
    db.refresh(floor)

    return FloorRead.model_validate(floor)


@router.put("/api/floors/{id}", response_model=FloorRead, summary="更新楼层")
def update_floor(
    id: str,
    body: FloorUpdate,
    db: Session = Depends(get_db),
    _: User = Depends(get_current_user),
):
    """Update a floor."""
    floor = get_floor_or_404(id, db)

    update_data = body.model_dump(exclude_unset=True)
    for field, value in update_data.items():
        setattr(floor, field, value)

    db.commit()
    db.refresh(floor)
    return FloorRead.model_validate(floor)


@router.delete("/api/floors/{id}", status_code=status.HTTP_200_OK, summary="删除楼层")
def delete_floor(
    id: str,
    db: Session = Depends(get_db),
    _: User = Depends(get_current_user),
):
    """Delete a floor."""
    floor = get_floor_or_404(id, db)
    db.delete(floor)
    db.commit()

    return {"message": "楼层已删除", "floor_id": id}


@router.put("/api/floors/{id}/reorder", response_model=FloorRead, summary="重排楼层")
def reorder_floor(
    id: str,
    body: ReorderBody,
    db: Session = Depends(get_db),
    _: User = Depends(get_current_user),
):
    """Update the sort order of a floor."""
    floor = get_floor_or_404(id, db)
    floor.sort_order = body.sort_order
    db.commit()
    db.refresh(floor)
    return FloorRead.model_validate(floor)
