use actix_web::{web, HttpResponse, Responder, post};
use crate::AppState;
use crate::core::behavior_bio::BehaviorInput;
use uuid::Uuid;
#[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.clone(),
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}")),
}
}