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

from typing import Dict
from src.database.session import get_db
from src.modules.users.schemas.requests import UserCreateSchema, UserUpdateSchema
from src.modules._lib.schemas.responses import ResponseModel
import src.modules.users.controller as user_controller

router = APIRouter()


@router.get("/", name="List Users", response_model=Dict)
async def list_users(
    db: Session = Depends(get_db),  # Dependency injected database session
    # filters: UserListFilterSchema = Depends(),  # Dependency injected user list filter schema
    sort_by: str = Query(  # Sort column name with direction. Default is "-id"
        default="-id",
        description="Sort column name with direction. Prepend '-' to sort descending. E.g: ?sort_by=-id",
    ),
    fields: str = Query(  # Additional related fields that are requested
        default=None,
        description="Additional related fields that are requested. Could be any of ...",
    ),
    page: int = Query(  # Number of page that needs to be fetched from the records
        default=1,
        ge=1,
        description="Number of page that needs to be fetched from the records",
    ),
    per_page: int = Query(  # Number of records per page
        default=10,
        ge=1,
        le=1000,
        description="Number of page that needs to be fetched from the records",
    ),
) -> ResponseModel:
    """
    List Users API

    This API is used to list all users.

    Supports pagination style.

    Returns:
        Dict: A dictionary containing the user list and pagination information.
    """

    # Create an instance of UserController

    # Retrieve the list of users
    response = await user_controller.list_users(
        db=db,
        sort_by=(sort_by.split(",") if sort_by else []),
        fields=fields,
        skip=((page - 1) * per_page),
        limit=per_page,
        paginate=True,
    )

    # Return the response with pagination information
    return ResponseModel(data=response, message="Users listed successfully")


@router.post("/", response_model=ResponseModel)
async def create_user(payload: UserCreateSchema, db: Session = Depends(get_db)):
    user = await user_controller.create_user(db=db, payload=payload)
    if user:
        return user
    raise HTTPException(status_code=400, detail="Failed to create user")


@router.get("/{user_id}", response_model=ResponseModel)
def read_user(user_id: int, db: Session = Depends(get_db)):
    user, message = user_controller.get_user_by_id(db=db, user_id=user_id)
    if user:
        return user
    raise HTTPException(status_code=404, detail=message)


@router.get("/email/{email}", response_model=ResponseModel)
def read_user_by_email(email: str, db: Session = Depends(get_db)):
    user, message = user_controller.get_user_by_email(db=db, email=email)
    if user:
        return user
    raise HTTPException(status_code=404, detail=message)


@router.put("/{user_id}", response_model=ResponseModel)
def update_user(
    user_id: int, user_data: UserUpdateSchema, db: Session = Depends(get_db)
):
    user, message = user_controller.update_user(
        db=db, user_id=user_id, payload=user_data
    )
    if user:
        return user
    raise HTTPException(status_code=404, detail=message)


@router.delete("/{user_id}", response_model=ResponseModel)
def delete_user(user_id: int, db: Session = Depends(get_db)):
    user, message = user_controller.delete_user(db=db, user_id=user_id)
    if user:
        return user
    raise HTTPException(status_code=404, detail=message)
