use crate::{KondutoClient, KondutoError, KondutoResult};
use reqwest::Response;
use serde::de::DeserializeOwned;

impl KondutoClient {
    /// Processa a resposta da API, tratando erros
    pub(crate) async fn handle_response<T: DeserializeOwned>(
        &self,
        response: Response,
    ) -> KondutoResult<T> {
        let status = response.status();

        if status.is_success() {
            let data = response.json::<T>().await?;
            Ok(data)
        } else {
            let status_code = status.as_u16();
            let error_text = response
                .text()
                .await
                .unwrap_or_else(|_| "Unknown error".to_string());

            // Tentar parsear como JSON de erro da Konduto
            if let Ok(error_json) = serde_json::from_str::<serde_json::Value>(&error_text) {
                let message = error_json["message"]
                    .as_str()
                    .unwrap_or("Unknown error")
                    .to_string();
                let code = error_json["code"].as_str().map(|s| s.to_string());

                Err(KondutoError::api_error(status_code, message, code))
            } else {
                Err(KondutoError::api_error(status_code, error_text, None))
            }
        }
    }
}
