use async_trait::async_trait;
use serde_json::Value;

#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Decision {
    Allowed,
    Denied(String),
}

#[derive(Debug, Clone)]
pub struct PermissionRequest {
    pub tool: String,
    pub args: Value,
}

impl PermissionRequest {
    pub fn new(tool: impl Into<String>, args: Value) -> Self {
        Self {
            tool: tool.into(),
            args,
        }
    }
}

#[async_trait]
pub trait PermissionGate: Send + Sync {
    async fn check(&self, request: PermissionRequest) -> Decision;
}

pub struct NoOpPermissionGate;

#[async_trait]
impl PermissionGate for NoOpPermissionGate {
    async fn check(&self, _request: PermissionRequest) -> Decision {
        Decision::Allowed
    }
}
