from fastapi import APIRouter, Depends, Query, status, HTTPException
from sqlalchemy.orm import Session
from typing import Optional
from datetime import datetime
from utils.utils import get_db
from . import handler
from .schema import (
    TimelogCreate,
    TimelogUpdate,
    TimelogResponse,
    TimelogListResponse,
    TimelogStartRequest,
    TimelogStopRequest
)

router = APIRouter(prefix="/time-logs", tags=["Time Logs"])


@router.post(
    "/",
    response_model=TimelogResponse,
    status_code=status.HTTP_201_CREATED,
    summary="Create Time Log",
    description="Creates a new time log entry for a job. Validates that the job and user exist, and that the user does not have overlapping time logs.",
)
def create_timelog_route(data: TimelogCreate, db: Session = Depends(get_db)):
    return handler.create_timelog(db, data)


@router.get(
    "/",
    response_model=TimelogListResponse,
    summary="List Time Logs",
    description="Returns a paginated list of time logs. Supports filtering by job_id, user_id, and date range.",
)
def list_timelogs_route(
    limit: int = Query(20, ge=1),
    offset: int = Query(0, ge=0),
    job_id: Optional[str] = None,
    user_id: Optional[str] = None,
    start_date: Optional[datetime] = None,
    end_date: Optional[datetime] = None,
    db: Session = Depends(get_db),
):
    return handler.list_timelogs(db, limit, offset, job_id, user_id, start_date, end_date)


@router.get(
    "/{timelog_id}",
    response_model=TimelogResponse,
    summary="Get Time Log",
    description="Returns a single time log by ID. Returns 404 if the time log does not exist.",
)
def get_timelog_route(timelog_id: str, db: Session = Depends(get_db)):
    return handler.get_timelog(db, timelog_id)


@router.put(
    "/{timelog_id}",
    response_model=TimelogResponse,
    summary="Update Time Log",
    description="Updates an existing time log. Validates that end_time is after start_time and that the user does not have overlapping time logs. Returns 404 if the time log does not exist.",
)
def update_timelog_route(timelog_id: str, data: TimelogUpdate, db: Session = Depends(get_db)):
    return handler.update_timelog(db, timelog_id, data)


@router.delete(
    "/{timelog_id}",
    status_code=status.HTTP_204_NO_CONTENT,
    summary="Delete Time Log",
    description="Deletes a time log by ID. Returns 404 if the time log does not exist.",
)
def delete_timelog_route(timelog_id: str, db: Session = Depends(get_db)):
    handler.delete_timelog(db, timelog_id)


@router.post(
    "/start",
    response_model=TimelogResponse,
    status_code=status.HTTP_201_CREATED,
    summary="Start Time Tracking",
    description="Starts a new time tracking session for a user on a specified job. Validates that the user does not already have an active timer running. Returns 409 if the user has an active time log.",
)
def start_time_tracking_route(
    data: TimelogStartRequest,
    user_id: str = Query(..., description="ID of the user starting the timer"),
    db: Session = Depends(get_db)
):
    return handler.start_time_tracking(db, user_id, data)


@router.post(
    "/{timelog_id}/stop",
    response_model=TimelogResponse,
    summary="Stop Time Tracking",
    description="Stops an active time tracking session. Calculates duration in minutes and updates the time log. Returns 400 if the time log has already been stopped. Returns 404 if the time log does not exist.",
)
def stop_time_tracking_route(timelog_id: str, data: TimelogStopRequest, db: Session = Depends(get_db)):
    return handler.stop_time_tracking(db, timelog_id, data)