from fastapi import APIRouter,Depends,status, Request, HTTPException
from typing import List
from sqlalchemy.orm import Session
from utils.get_db import get_db
from services.user_services import (
    all_users_from_db,
    create_new_user,
    user_login,
    get_user_by_id,
    forgot_password,
    change_user_password,
    update_profile,
    delete_user_by_id,
    get_org_members_from_db,
    reset_password,
    update_profile_by_org_admin
)
from schema.user_schema import (
    CreateUserSchema, 
    UserSchema, 
    CreateUserResponseSchema,
    UserLoginSchema, 
    ForgotPasswordRequestSchema,
    ForgotPasswordResponseSchema,
    ResetPasswordRequestSchema,
    ResetPasswordResponseSchema,
    UpdateUserProfileResponse,
    ChangePasswordSchema,
    UpdateProfileSchema,UpdateProfileByOrgSchema,
    ListOfAllUsers
)
from uuid import UUID
from fastapi.security import HTTPBearer
from utils.logging import logger
from utils.role_verification import verify_super_admin

security = HTTPBearer()

user_router=APIRouter()


@user_router.get("/get-all-users",status_code=status.HTTP_200_OK, response_model=ListOfAllUsers, dependencies=[Depends(security), Depends(verify_super_admin)])
def all_users(request:Request, db:Session=Depends(get_db), page: int = 1, limit: int = 10, search: str = None, platform_role: str = None):
    return all_users_from_db(db, request, page, limit, search, platform_role)


@user_router.post('/create-user',status_code=status.HTTP_201_CREATED,response_model=CreateUserResponseSchema)
def create_users(request:CreateUserSchema,db:Session=Depends(get_db)):
    return create_new_user(request,db)

@user_router.post('/login-user',status_code=status.HTTP_200_OK,response_model=CreateUserResponseSchema)
def create_login_user(request:UserLoginSchema,db:Session=Depends(get_db)):
    return user_login(request,db)


@user_router.get('/get-user-details-by-id',status_code=status.HTTP_200_OK,response_model=UserSchema,dependencies=[Depends(security)])
def get_user_by_user_id(request:Request,db:Session=Depends(get_db)):
    user=request.state.user
    logger.info(f"Fetching user details for user_id: {user.id}")
    user_id=user.id
    return get_user_by_id(user_id,db)


@user_router.patch("/change-user-password")
def change_user_password_by_id(
    payload: ChangePasswordSchema,
    request: Request,
    db: Session = Depends(get_db)
):
    user = request.state.user
    return change_user_password(payload, user.id, db)


@user_router.patch('/update-user-profile',status_code=status.HTTP_200_OK,response_model=UpdateUserProfileResponse)
def update_user_profile(payload:UpdateProfileSchema,request:Request,db:Session=Depends(get_db)):
    user_id = request.state.user.id
    return update_profile(payload,user_id,db)

@user_router.patch('/update-user-profile-by-org',status_code=status.HTTP_200_OK,response_model=UpdateUserProfileResponse)
def update_user_profile_status(payload:UpdateProfileByOrgSchema,request:Request,db:Session=Depends(get_db)):
    return update_profile_by_org_admin(payload,request,db)


@user_router.post('/forgot-password',status_code=status.HTTP_200_OK, response_model=ForgotPasswordResponseSchema)
async def forgot_user_password(payload: ForgotPasswordRequestSchema, db:Session=Depends(get_db)):
    return await forgot_password(payload, db)

@user_router.post('/reset-password',status_code=status.HTTP_200_OK, response_model=ResetPasswordResponseSchema)
def reset_user_password(payload: ResetPasswordRequestSchema, db:Session=Depends(get_db)):
    return reset_password(payload, db)


@user_router.delete('/delete-user',status_code=status.HTTP_200_OK, dependencies=[Depends(security)])
def delete_user(request:Request,db:Session=Depends(get_db)):
    return delete_user_by_id(request,db)

@user_router.get('/org-members', status_code=status.HTTP_200_OK, response_model=List[UserSchema], dependencies=[Depends(security)])
def get_org_members(request: Request, db: Session = Depends(get_db)):
    user = request.state.user
    if not user.org_id:
        return []
    return get_org_members_from_db(user.org_id, db)
