from fastapi import Depends, HTTPException, Request, status
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy import select
from app.core.database import get_db
from app.models.models import User

async def get_current_user(request: Request, db: AsyncSession = Depends(get_db)) -> User:
    user_id = request.cookies.get("user_id")
    if not user_id or not user_id.isdigit():
        raise HTTPException(status_code=status.HTTP_303_SEE_OTHER, headers={"Location": "/login"})
    user = await db.scalar(select(User).where(User.id == int(user_id), User.is_active == True))
    if not user:
        raise HTTPException(status_code=status.HTTP_303_SEE_OTHER, headers={"Location": "/login"})
    return user

def require_roles(*roles):
    async def checker(user: User = Depends(get_current_user)) -> User:
        if user.role not in roles and user.role != "super_admin":
            raise HTTPException(status_code=403, detail="Akses tidak diizinkan")
        return user
    return checker
