import jwt
from datetime import datetime, timedelta
from fastapi import HTTPException
from jwt import InvalidTokenError
import os
from dotenv import load_dotenv

load_dotenv(override=True)


class JWTUtils:

    JWT_SECRET = os.getenv("JWT_SECRET", "")
    JWT_ALGORITHM = os.getenv("JWT_ALGORITHM", "HS256")
    JWT_EXPIRATION_MINUTES = int(os.getenv("JWT_EXPIRATION_MINUTES", "1440"))  # 24 hours

    @staticmethod
    def create_token(data: dict) -> str:
        payload = data.copy()
        expire = datetime.utcnow() + timedelta(minutes=JWTUtils.JWT_EXPIRATION_MINUTES)
        payload.update({"exp": expire})
        token = jwt.encode(
            payload,
            JWTUtils.JWT_SECRET,
            algorithm=JWTUtils.JWT_ALGORITHM
        )
        return token

    @staticmethod
    def decode_token(token: str) -> dict:
        try:
            payload = jwt.decode(
                token,
                JWTUtils.JWT_SECRET,
                algorithms=[JWTUtils.JWT_ALGORITHM]
            )
            return payload
        except jwt.ExpiredSignatureError:
            raise HTTPException(status_code=401, detail="Token expired")
        except InvalidTokenError:
            raise HTTPException(status_code=401, detail="Invalid token")