from fastapi import APIRouter, Query, HTTPException, Depends
from src.auth.dependencies import get_current_user
from .models import TileResponse, JobCreateRequest, LeadStatusUpdate, BulkLeadStatusUpdate, RunStatusUpdate
from .dependencies import TileServiceDep
from typing import List

router = APIRouter()


@router.get("/", response_model=TileResponse)
async def get_tiles(
    service: TileServiceDep,
    user_id: str = Depends(get_current_user),
    city: str = Query(..., description="City name"),
    zoom: int = Query(15, ge=0, le=22),
    step: int = Query(3, ge=1),
):
    try:
        total, skipped, points = service.generate_tile_points(city, zoom, step)
    except ValueError as e:
        raise HTTPException(status_code=400, detail=str(e))

    return TileResponse(
        total_tiles=total,
        skipped_tiles=skipped,
        points=points,
    )

@router.post("/create-jobs")
async def create_jobs(
    request: JobCreateRequest,
    service: TileServiceDep,
    user_id: str = Depends(get_current_user),
):
    try:
        result = await service.create_jobs_from_tiles(request, user_id)
        return result
    except ValueError as e:
        raise HTTPException(status_code=400, detail=str(e))
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

@router.get("/runs", response_model=List[dict])
async def get_all_runs(
    service: TileServiceDep,
    user_id: str = Depends(get_current_user),
):
    try:
        runs = service.get_all_runs(user_id)
        return runs
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

@router.get("/runs/{run_id}", response_model=dict)
async def get_run_by_id(
    run_id: str,
    service: TileServiceDep,
    user_id: str = Depends(get_current_user),
):
    try:
        run = service.get_run_by_id(run_id, user_id)
        if not run:
            raise HTTPException(status_code=404, detail="Run not found")
        return run
    except HTTPException:
        raise
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

@router.patch("/leads/{lead_id}/status")
async def update_lead_status(
    lead_id: int,
    request: LeadStatusUpdate,
    service: TileServiceDep,
    user_id: str = Depends(get_current_user),
):
    try:
        lead = service.update_lead_status(lead_id, request.status, user_id)
        if not lead:
            raise HTTPException(status_code=404, detail="Lead not found")
        return {"status": "success", "lead_id": lead_id, "new_status": request.status}
    except HTTPException:
        raise
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

@router.post("/leads/bulk-status")
async def bulk_update_lead_status(
    request: BulkLeadStatusUpdate,
    service: TileServiceDep,
    user_id: str = Depends(get_current_user),
):
    try:
        count = service.bulk_update_lead_status(request.lead_ids, request.status, user_id)
        return {"status": "success", "updated_count": count}
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

@router.post("/runs/{run_id}/status")
async def update_run_status(
    run_id: str,
    request: RunStatusUpdate,
    service: TileServiceDep,
    user_id: str = Depends(get_current_user),
):
    try:
        count = service.update_run_status(run_id, request.status, user_id)
        return {"status": "success", "run_id": run_id, "updated_count": count, "new_status": request.status}
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))