Documentation
use std::collections::HashMap;

use crate::infrastructure::http::request::request::Request;
use crate::infrastructure::http::response::response::Response;
use crate::infrastructure::http::routes::REGISTRY;

pub fn dispatch_request(request: &mut Request) -> Response {
    let registry = REGISTRY
        .lock()
        .expect("Route registry poisoned");

    for route in registry.get_routes() {
        if route.method == request.method {
            if let Some(params) = match_route(&route.path, &request.path) {
                request.params = params;
                return (route.handler)(request.clone());
            }
        }
    }
    Response::not_found()
}

fn match_route(route_path: &str, request_path: &str) -> Option<HashMap<String, String>> {
    let route_segments: Vec<&str> = route_path.split('/').filter(|s| !s.is_empty()).collect();
    let request_segments: Vec<&str> = request_path.split('/').filter(|s| !s.is_empty()).collect();

    if route_segments.len() != request_segments.len() {
        return None;
    }

    let mut params = HashMap::new();
    for (route_seg, req_seg) in route_segments.iter().zip(request_segments.iter()) {
        if route_seg.starts_with('{') && route_seg.ends_with('}') {
            let param_name = &route_seg[1..route_seg.len() - 1];
            params.insert(param_name.to_string(), req_seg.to_string());
        } else if route_seg != req_seg {
            return None;
        }
    }
    Some(params)
}