from datetime import datetime, timedelta
from typing import Any, Dict
from jose import jwt
from src.core.config import settings

# In-memory blacklist for demonstration. Use Redis/DB in production.
blacklisted_tokens = set()


def create_access_token(data: dict, expires_delta: int = None) -> str:
    to_encode = data.copy()
    expire = datetime.utcnow() + timedelta(seconds=expires_delta or settings.JWT_EXPIRATION)
    to_encode.update({"exp": expire, "iat": datetime.utcnow()})
    encoded_jwt = jwt.encode(to_encode, settings.JWT_SECRET, algorithm=settings.JWT_ALGORITHM)
    return encoded_jwt


def create_refresh_token(data: dict, expires_delta: int = None) -> str:
    # Default: 7 days for refresh token
    to_encode = data.copy()
    expire = datetime.utcnow() + timedelta(seconds=expires_delta or 7 * 24 * 3600)
    to_encode.update({"exp": expire, "iat": datetime.utcnow()})
    encoded_jwt = jwt.encode(to_encode, settings.JWT_SECRET, algorithm=settings.JWT_ALGORITHM)
    return encoded_jwt


def blacklist_token(token: str):
    blacklisted_tokens.add(token)


def is_token_blacklisted(token: str) -> bool:
    return token in blacklisted_tokens
