from typing import Annotated, Optional
from fastapi import APIRouter, BackgroundTasks, Depends
from fastapi.security import OAuth2PasswordRequestForm
from sqlalchemy.orm import Session
from app.api.user import service
from app.database.main.mysql import get_db
from .schemas import ForgotPasswordRequest, UserCreate, UserPassUpdate, VerifyOTPRequest, NewPass
from app.dependency.authantication import get_current_user, JWTPayloadSchema

from app.api.user import schemas

user_router = APIRouter()

# oauth2_scheme = OAuth2PasswordBearer(tokenUrl="/FASTAPI/user/login")
# pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")

@user_router.post("/user", response_model_exclude_none=True)
async def create_user(request: UserCreate,db: Session = Depends(get_db),token: JWTPayloadSchema = Depends(get_current_user)):
    return await service.UserService(db,token).create_user(request)

@user_router.post("/user/login",response_model_exclude_none=True)
async def login_user(credentials: Annotated[OAuth2PasswordRequestForm, Depends()],db: Session = Depends(get_db)):
    return await service.UserService.user_login(credentials, db)

@user_router.get("/superadmin/get/all/admin", response_model_exclude_none=True)
async def get(db: Session = Depends(get_db), token: JWTPayloadSchema = Depends(get_current_user)):
    return await service.UserService(db, token).superadmin_get_all_admin()

@user_router.post("/user/logout",response_model_exclude_none=True)
async def logout_user(db: Session = Depends(get_db), token: JWTPayloadSchema = Depends(get_current_user)):
    return await service.UserService(db,token).logout()

@user_router.put("/user_change_pass/update", response_model_exclude_none=True)
async def update_admin(request: UserPassUpdate,db: Session = Depends(get_db),token: JWTPayloadSchema = Depends(get_current_user),):
    return await service.UserService(db, token).update_pass(request)

# @user_router.delete("/user/{user_id}", response_model_exclude_none=True)
# async def delete_user(user_id: int, db: Session = Depends(get_db),token: JWTPayloadSchema = Depends(get_current_user)):
#     return await service.UserService(db,token).delete_user(user_id)

# @user_router.get("/user-details/{user_id}", response_model_exclude_none=True)
# async def get_user_details(user_id:int,db: Session = Depends(get_db), token: JWTPayloadSchema = Depends(get_current_user)):
#     return await service.UserService(db, token).fetch_user(user_id)

@user_router.post("/forgot-password")
async def forgot_password(request: ForgotPasswordRequest, background_tasks: BackgroundTasks, db: Session = Depends(get_db)):
    return await service.forgot_password_service(db,request, background_tasks)

@user_router.post("/reset-password")
def reset_password(request: VerifyOTPRequest, db: Session = Depends(get_db)):
    return service.reset_password_service(db,request)

@user_router.post("/new-password")
def reset_password(request: NewPass, db: Session = Depends(get_db)):
    return service.new_password_service(db,request)

@user_router.get("/get_admin", response_model_exclude_none=True)
async def get_admin(db: Session = Depends(get_db), token: JWTPayloadSchema = Depends(get_current_user)):
    return await service.UserService(db,token).get_admin()

@user_router.get("/superadmin_get_all_admin", response_model_exclude_none=True)
async def get_all_admins(db: Session = Depends(get_db), token: JWTPayloadSchema = Depends(get_current_user)):
    return await service.UserService(db,token).get_all_admin()

@user_router.get("/get_admin_institution", response_model_exclude_none=True)
async def get_admins_institution(user_id:int, db: Session = Depends(get_db), token: JWTPayloadSchema = Depends(get_current_user)):
    return await service.UserService(db,token).get_admin_institution(user_id)

@user_router.get("/simulation/{status}",response_model_exclude_none=True)
async def simulation(status:str, db: Session = Depends(get_db), token: JWTPayloadSchema = Depends(get_current_user)):
    return await service.UserService(db, token).simulation(status)

@user_router.post("/admin_link", response_model_exclude_none=True)
async def admin_link(admin_id:int, simulation_id:int,request: Optional[schemas.UserCreateLink] = None, db: Session = Depends(get_db), token: JWTPayloadSchema = Depends(get_current_user)):
    return await service.UserService(db, token).admin_link(admin_id,simulation_id, request)

@user_router.get("/get_user_details", response_model_exclude_none=True)
async def get_user_details(db: Session = Depends(get_db), token: JWTPayloadSchema = Depends(get_current_user)):
    return await service.UserService(db,token).get_user_details()











