"""Hotspot CRUD router."""

from datetime import datetime

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

from app.database import get_db
from app.models.hotspot import Hotspot
from app.models.panorama import Panorama
from app.models.user import User
from app.schemas.hotspot import (
    HotspotBatchApprove,
    HotspotCreate,
    HotspotRead,
    HotspotUpdate,
)
from app.services.auth_service import get_current_user
from app.utils.helpers import generate_uuid, paginate

router = APIRouter()


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

class BatchStatusBody(BaseModel):
    ids: list[str]


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

def get_hotspot_or_404(hotspot_id: str, db: Session) -> Hotspot:
    hotspot = db.query(Hotspot).filter(Hotspot.id == hotspot_id).first()
    if not hotspot:
        raise HTTPException(
            status_code=status.HTTP_404_NOT_FOUND,
            detail="热点不存在",
        )
    return hotspot


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

@router.get(
    "/api/panoramas/{pid}/hotspots",
    response_model=dict,
    summary="获取全景图热点列表",
)
def list_hotspots(
    pid: 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),
):
    """List all hotspots for a panorama (paginated)."""
    pano = db.query(Panorama).filter(Panorama.id == pid).first()
    if not pano:
        raise HTTPException(
            status_code=status.HTTP_404_NOT_FOUND,
            detail="全景图不存在",
        )

    query = (
        db.query(Hotspot)
        .filter(Hotspot.from_pano_id == pid)
        .order_by(Hotspot.created_at.desc())
    )
    result = paginate(query, page=page, size=size)

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


@router.post(
    "/api/panoramas/{pid}/hotspots",
    response_model=HotspotRead,
    status_code=status.HTTP_201_CREATED,
    summary="创建热点",
)
def create_hotspot(
    pid: str,
    body: HotspotCreate,
    db: Session = Depends(get_db),
    _: User = Depends(get_current_user),
):
    """Create a new hotspot originating from a panorama."""
    # Validate from_pano_id matches URL
    if body.from_pano_id != pid:
        raise HTTPException(
            status_code=status.HTTP_400_BAD_REQUEST,
            detail="热点源全景图ID与URL参数不匹配",
        )

    from_pano = db.query(Panorama).filter(Panorama.id == pid).first()
    if not from_pano:
        raise HTTPException(
            status_code=status.HTTP_404_NOT_FOUND,
            detail="源全景图不存在",
        )

    # Validate to_pano_id if provided
    if body.to_pano_id:
        to_pano = db.query(Panorama).filter(Panorama.id == body.to_pano_id).first()
        if not to_pano:
            raise HTTPException(
                status_code=status.HTTP_404_NOT_FOUND,
                detail="目标全景图不存在",
            )

    hotspot = Hotspot(
        id=generate_uuid(),
        from_pano_id=pid,
        to_pano_id=body.to_pano_id,
        yaw=body.yaw,
        pitch=body.pitch,
        type=body.type,
        label=body.label,
        confidence=body.confidence,
        status=body.status,
        created_by=body.created_by,
        metadata=body.metadata,
        created_at=datetime.utcnow(),
        updated_at=datetime.utcnow(),
    )
    db.add(hotspot)
    db.commit()
    db.refresh(hotspot)

    return HotspotRead.model_validate(hotspot)


@router.put("/api/hotspots/{id}", response_model=HotspotRead, summary="更新热点")
def update_hotspot(
    id: str,
    body: HotspotUpdate,
    db: Session = Depends(get_db),
    _: User = Depends(get_current_user),
):
    """Update a hotspot."""
    hotspot = get_hotspot_or_404(id, db)

    update_data = body.model_dump(exclude_unset=True)
    for field, value in update_data.items():
        setattr(hotspot, field, value)
    hotspot.updated_at = datetime.utcnow()

    db.commit()
    db.refresh(hotspot)
    return HotspotRead.model_validate(hotspot)


@router.delete("/api/hotspots/{id}", status_code=status.HTTP_200_OK, summary="删除热点")
def delete_hotspot(
    id: str,
    db: Session = Depends(get_db),
    _: User = Depends(get_current_user),
):
    """Delete a hotspot."""
    hotspot = get_hotspot_or_404(id, db)
    db.delete(hotspot)
    db.commit()

    return {"message": "热点已删除", "hotspot_id": id}


@router.post("/api/hotspots/batch-approve", summary="批量审批热点")
def batch_approve(
    body: HotspotBatchApprove,
    db: Session = Depends(get_db),
    _: User = Depends(get_current_user),
):
    """Approve multiple hotspots at once."""
    hotspots = (
        db.query(Hotspot)
        .filter(Hotspot.id.in_(body.ids))
        .all()
    )

    if not hotspots:
        raise HTTPException(
            status_code=status.HTTP_404_NOT_FOUND,
            detail="未找到任何热点",
        )

    updated_count = 0
    for hotspot in hotspots:
        hotspot.status = "approved"
        hotspot.updated_at = datetime.utcnow()
        updated_count += 1

    db.commit()

    return {"message": f"已审批 {updated_count} 个热点", "count": updated_count}


@router.post("/api/hotspots/batch-reject", summary="批量拒绝热点")
def batch_reject(
    body: BatchStatusBody,
    db: Session = Depends(get_db),
    _: User = Depends(get_current_user),
):
    """Reject multiple hotspots at once."""
    hotspots = (
        db.query(Hotspot)
        .filter(Hotspot.id.in_(body.ids))
        .all()
    )

    if not hotspots:
        raise HTTPException(
            status_code=status.HTTP_404_NOT_FOUND,
            detail="未找到任何热点",
        )

    updated_count = 0
    for hotspot in hotspots:
        hotspot.status = "rejected"
        hotspot.updated_at = datetime.utcnow()
        updated_count += 1

    db.commit()

    return {"message": f"已拒绝 {updated_count} 个热点", "count": updated_count}
