#![cfg(feature = "web")]

use actix_web::{HttpMessage, HttpRequest};

use crate::middleware::RequestId;
use crate::response::ApiResponse;

/// HttpRequest üzerinden request_id çekmek için helper.
/// RequestId middleware'in extensions'a koyduğu değeri okur.
pub fn request_id(req: &HttpRequest) -> String {
    req.extensions()
        .get::<RequestId>()
        .map(|r| r.0.clone())
        .unwrap_or_else(|| uuid::Uuid::new_v4().to_string())
}

/// ApiResponse üretimini handler’da “tek satır” yapmak için trait.
pub trait ApiResponseActixExt {
    fn ok_from_req<T: serde::Serialize>(req: &HttpRequest, data: T) -> ApiResponse<T>;
    fn empty_ok_from_req(req: &HttpRequest) -> ApiResponse<()>;
}

impl ApiResponseActixExt for ApiResponse<()> {
    fn ok_from_req<T: serde::Serialize>(req: &HttpRequest, data: T) -> ApiResponse<T> {
        ApiResponse::ok(data, request_id(req))
    }

    fn empty_ok_from_req(req: &HttpRequest) -> ApiResponse<()> {
        ApiResponse::empty_ok(request_id(req))
    }
}
