use crate::core::behavior_bio::BehaviorInput;
use crate::AppState;
use actix_web::{post, web, HttpResponse, Responder};
#[derive(serde::Deserialize, Clone)]
pub struct SmartAccessRequest {
pub geo_input: Option<(std::net::IpAddr, (f64, f64, u8, f64))>,
pub behavior_input: BehaviorInput,
pub os_info: String,
pub device_details: String,
pub env_context: String,
}
#[post("/smart_access/verify")]
pub async fn smart_access_verify(
data: web::Data<AppState>,
payload: web::Json<SmartAccessRequest>,
) -> impl Responder {
let allowed_zones = vec!["Riyadh".to_string(), "Jeddah".to_string()];
let allowed_hours = Some((6, 18));
let result = data
.composite_verifier
.verify_smart_access(
payload.geo_input,
payload.behavior_input.clone(),
(
&payload.os_info,
&payload.device_details,
&payload.env_context,
),
&allowed_zones,
allowed_hours,
)
.await;
match result {
Ok(true) => HttpResponse::Ok().body("Access granted"),
Ok(false) => HttpResponse::Forbidden().body("Access denied"),
Err(e) => HttpResponse::Forbidden().body(format!("Access denied: {e}")),
}
}