Documentation
use crate::infrastructure::http::request::form_request::validator::Validator;
use serde_json::Value;

pub fn required_if(
    field: &str,
    field_name: &str,
    value: Option<&Value>,
    validator: &Validator,
    params: Option<&str>,
) -> Result<(), String> {
    let custom_message = validator
        .custom_messages
        .get(&format!("{}.required_if", field))
        .map(|s| s.as_str());

    let params = match params {
        Some(p) => p,
        None => return Ok(()),
    };

    let mut split = params.splitn(2, ',');
    let other_field = split.next().unwrap();
    let expected_value = split.next().unwrap_or("");

    let other_val = validator.data.get(other_field);

    if other_val.map(|v| normalize(v)) == Some(expected_value.to_string()) {
        if value.is_none() || value == Some(&Value::Null) {
            return Err(custom_message.map(|s| s.to_string()).unwrap_or_else(|| {
                format!(
                    "The field {} is required when {} is {}.",
                    field_name, other_field, expected_value
                )
            }));
        }
    }

    Ok(())
}

fn normalize(v: &Value) -> String {
    match v {
        Value::String(s) => s.trim().to_lowercase(),
        _ => v.to_string().trim().to_lowercase(),
    }
}