from typing import Any
from fastapi import APIRouter, Depends, HTTPException, Response

from fastapi.encoders import jsonable_encoder
from sqlalchemy.orm import Session
from fuware.core.config import get_app_settings
from fuware.core.security.hasher import get_hasher
from fuware.db.db_setup import generate_session
from fuware.schemas import ReturnValue, UserRequest
from fuware.schemas.user.user import UserCreate
from fuware.services import UserService


public_router = APIRouter(tags=["Users: Authentication"])
user_service = UserService()
hasher = get_hasher()
settings = get_app_settings()

@public_router.put('/register')
def register_user(user: UserCreate, db: Session = Depends(generate_session)) -> ReturnValue[Any]:
  db_user = user_service.get_by_username(username=user.username)
  if db_user:
    raise HTTPException(status_code=400, detail="Username already registered!")
  user_return = user_service.create(db=db, user=user)
  return ReturnValue(status=200, data=jsonable_encoder(user_return))

@public_router.post('/login', response_model=ReturnValue[Any])
def user_login(user: UserRequest, response: Response, db: Session = Depends(generate_session)) -> ReturnValue[Any]:
  db_user = user_service.get_by_username(username=user.username)
  if not db_user:
    raise HTTPException(status_code=401, detail="Your username or password input is wrong!")
  if not hasher.verify(password=user.password, hashed=db_user.password):
    raise HTTPException(status_code=401, detail="Your username or password input is wrong!")
  if db_user.is_lock is True:
    raise HTTPException(status_code=401, detail="Your Account was locked")
  cookieEncode = user_service.check_login(db=db, user_id=db_user.id)
  response.set_cookie(key=settings.COOKIE_KEY, value=cookieEncode.session)
  return ReturnValue(status=200, data=jsonable_encoder(db_user))