from fastapi import APIRouter, Depends, Query, status
from sqlalchemy.orm import Session
from typing import Optional, List
from datetime import datetime
from utils.utils import get_db
from . import handler
from .schema import ActivitylogCreate, ActivitylogUpdate, ActivitylogResponse, ActivitylogDetailResponse

router = APIRouter(prefix="/activity-logs", tags=["Activity Logs"])


@router.post(
    "/",
    response_model=ActivitylogResponse,
    status_code=status.HTTP_201_CREATED,
    summary="Create Activity Log",
    description="Creates a new activity log entry recording a system action. Validates entity_type, entity_id, action_type, and optional JSON details. Returns the created log with generated ID and timestamps.",
)
def create_activitylog_route(data: ActivitylogCreate, db: Session = Depends(get_db)):
    return handler.create_activitylog(db, data)


@router.get(
    "/",
    response_model=List[ActivitylogResponse],
    summary="List Activity Logs",
    description="Returns a paginated list of activity logs ordered by timestamp descending. Supports optional filters for entity_type, entity_id, user_id, action_type, and date range (start_date, end_date). Useful for audit trail queries and system monitoring.",
)
def list_activitylogs_route(
    limit: int = Query(20, ge=1, le=100),
    offset: int = Query(0, ge=0),
    entity_type: Optional[str] = Query(None),
    entity_id: Optional[str] = Query(None),
    user_id: Optional[str] = Query(None),
    action_type: Optional[str] = Query(None),
    start_date: Optional[datetime] = Query(None),
    end_date: Optional[datetime] = Query(None),
    db: Session = Depends(get_db),
):
    return handler.list_activitylogs(
        db,
        limit=limit,
        offset=offset,
        entity_type=entity_type,
        entity_id=entity_id,
        user_id=user_id,
        action_type=action_type,
        start_date=start_date,
        end_date=end_date,
    )


@router.get(
    "/count",
    summary="Count Activity Logs",
    description="Returns the total count of activity logs matching the provided filters. Supports the same filter parameters as the list endpoint for entity_type, entity_id, user_id, action_type, and date range.",
)
def count_activitylogs_route(
    entity_type: Optional[str] = Query(None),
    entity_id: Optional[str] = Query(None),
    user_id: Optional[str] = Query(None),
    action_type: Optional[str] = Query(None),
    start_date: Optional[datetime] = Query(None),
    end_date: Optional[datetime] = Query(None),
    db: Session = Depends(get_db),
):
    return handler.get_activitylogs_count(
        db,
        entity_type=entity_type,
        entity_id=entity_id,
        user_id=user_id,
        action_type=action_type,
        start_date=start_date,
        end_date=end_date,
    )


@router.get(
    "/{id}",
    response_model=ActivitylogResponse,
    summary="Get Activity Log",
    description="Retrieves a single activity log entry by ID. Returns 404 if the log entry does not exist.",
)
def get_activitylog_route(id: str, db: Session = Depends(get_db)):
    return handler.get_activitylog(db, id)


@router.get(
    "/{id}/details",
    response_model=ActivitylogDetailResponse,
    summary="Get Activity Log Details",
    description="Retrieves a single activity log entry with enriched user details (email, first_name, last_name) if user_id is present. Returns 404 if the log entry does not exist.",
)
def get_activitylog_details_route(id: str, db: Session = Depends(get_db)):
    return handler.get_activitylog_details(db, id)


@router.put(
    "/{id}",
    response_model=ActivitylogResponse,
    summary="Update Activity Log",
    description="Updates an existing activity log entry. All fields are optional; only provided fields are updated. Returns 404 if the log entry does not exist, 400 if no fields are provided.",
)
def update_activitylog_route(id: str, data: ActivitylogUpdate, db: Session = Depends(get_db)):
    return handler.update_activitylog(db, id, data)


@router.delete(
    "/{id}",
    status_code=status.HTTP_200_OK,
    summary="Delete Activity Log",
    description="Deletes an activity log entry by ID. Returns 404 if the log entry does not exist. Note: deletion of audit logs should be restricted in production environments.",
)
def delete_activitylog_route(id: str, db: Session = Depends(get_db)):
    return handler.delete_activitylog(db, id)