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

from src.apps.user.models.user_model import Users
from src.apps.user.schemas.user_schemas import (
    ChangePasswordSchema,
    UserCreateSchema,
    UserFilterSchema,
    UserReturnSchema,
    UserSessionsResponse,
    UserUpdateSchema,
)
from src.apps.user.services.user_services import (
    change_password_service,
    create_user_service,
    delete_user_service,
    get_all_users_service,
    get_user_by_user_id_service,
    get_user_sessions_with_limit,
    update_user_profile,
    update_user_service,
    user_status_change_service,
)
from src.core.dependencies import get_db
from src.utils import constants
from src.utils.guard import get_current_user
from src.apps.base.schemas.response_model import ResponseModel

router = APIRouter()


@router.post("", response_model=ResponseModel, summary="Register a new user")
async def register_user(payload: UserCreateSchema, db: Session = Depends(get_db)):
    response = await create_user_service(payload, db)
    return ResponseModel(
        data=response, status_code=status.HTTP_201_CREATED, message="Record created successfully"
    )


@router.get("", response_model=ResponseModel, summary="Get all users")
def get_all_users(
    payload: UserFilterSchema = Depends(),
    sort_by: str = Query(default="-created_at"),
    page: int = Query(default=1, ge=1, description="Page number"),
    per_page: int = Query(
        default=constants.DEFAULT_PER_PAGE,
        ge=1,
        le=constants.MAX_PER_PAGE,
        description="Items per page",
    ),
    db: Session = Depends(get_db),
    current_user: Users = Depends(get_current_user),
):
    response= get_all_users_service(
        db, page=page, per_page=per_page, payload=payload, sort_by=sort_by.split(",") if sort_by else []
    )
    return ResponseModel(
        data=response, status_code=status.HTTP_200_OK, message="Record fetched successfully"
    )


@router.post("/change-password", response_model=ResponseModel, summary="Get all users")
def change_password(
    payload: ChangePasswordSchema,
    db: Session = Depends(get_db),
    current_user: Users = Depends(get_current_user),
):
    response= change_password_service(db, current_user, payload)
    return ResponseModel(
        data=response, status_code=status.HTTP_200_OK, message="Password changed successfully"
    )


@router.put("/update-profile", response_model=ResponseModel)
async def update_my_profile(
    payload: UserUpdateSchema,
    db: Session = Depends(get_db),
    current_user: Users = Depends(get_current_user),
):
    response = await update_user_profile(current_user, payload, db)
    return ResponseModel(
        data=response, status_code=status.HTTP_200_OK, message="Record updated successfully"
    )


@router.get("/user-session", response_model=ResponseModel)
def get_my_sessions(db: Session = Depends(get_db), current_user: Users = Depends(get_current_user)):
    response= get_user_sessions_with_limit(db=db, user_id=current_user.id)
    return ResponseModel(
        data=response, status_code=status.HTTP_200_OK, message="Record fetched successfully"
    )


@router.get("/{user_id}", response_model=ResponseModel, summary="Get all users")
def get_user_by_id(
    user_id: str,
    db: Session = Depends(get_db),
    current_user: Users = Depends(get_current_user),
):
    response= get_user_by_user_id_service(db, user_id)
    return ResponseModel(
        data=response, status_code=status.HTTP_200_OK, message="Record fetched successfully"
    )

@router.get("/change-status/{user_id}", summary="Change user status")
def change_user_status(
    user_id: str = Path(..., description="ID of the user to change status"),
    is_active: bool = Query(..., description="Change status of the user"),
    db: Session = Depends(get_db),
    current_user: Users = Depends(get_current_user),
):
    response = user_status_change_service(db, user_id, is_active)
    return ResponseModel(
        data=response, status_code=status.HTTP_200_OK, message="Record updated successfully"
    )


@router.delete("/{user_id}", summary="Delete a user")
def delete_user(
    user_id: str = Path(..., description="ID of the user to delete"),
    db: Session = Depends(get_db),
    current_user: Users = Depends(get_current_user),
):
    response= delete_user_service(db, user_id)
    return ResponseModel(
        data=response, status_code=status.HTTP_200_OK, message="Record deleted successfully"
    )



@router.put("/{user_id}", response_model=ResponseModel)
async def update_user_details(
    payload: UserUpdateSchema,
    user_id: str = Path(..., description="ID of the user to update"),
    db: Session = Depends(get_db),
    current_user: Users = Depends(get_current_user),
):
    response = update_user_service(payload, db, user_id)

    return ResponseModel(
        data=response, status_code=status.HTTP_200_OK, message="Record updated successfully"
    )


