from sqlalchemy.orm import Session
from backend.core.security.hasher import get_hasher
from backend.core.security import create_access_token
from backend.core.security.security import create_refresh_token
from backend.repos import RepositoryUsers
from backend.schemas import UserRequest, UserCreate
from backend.services._base_service import BaseService

class UserService(BaseService):
  def __init__(self):
    self.repos = RepositoryUsers()

  def generate_token(self, user_id: str):
    access_token = create_access_token(data={"sub": str(user_id)})
    refresh_token = create_refresh_token(data={"sub": str(user_id)})
    return access_token, refresh_token

  def get_by_username(self, username: str):
    return self.repos.get_by_username(username)

  def get_access_token(self, user_id: str):
    return create_access_token(data={"sub": str(user_id)})

  def get_all(self, skip: int = 0, limit: int = 100):
    return self.repos.get_all(skip=skip, limit=limit)

  def get_by_id(self, user_id: str):
    return self.repos.get_by_id(user_id)

  def create(self, db: Session, user: UserCreate):
    return self.repos.create(db=db, user=user)

  def check_exist(self, user: UserRequest):
    db_user = self.get_by_username(username=user.username)
    if not db_user:
      return False
    if not get_hasher().verify(password=user.password, hashed=db_user.password):
      return False
    return db_user

  def update(self, db: Session, user: UserCreate, user_id: str):
    return self.repos.update(db=db, user=user, user_id=user_id)