use serde_json::Value as JsonValue;
use std::collections::HashMap;

#[derive(Clone, Debug, PartialEq)]
pub enum TypeJsonValue {
    Str(String),
    DateTime(String),
    Number(f64),
    Array(Vec<TypeJsonValue>),
    Object(HashMap<String, TypeJsonValue>),
    Bool(bool),
    Empty
}

pub fn parse_string(value: &JsonValue) -> Option<TypeJsonValue> {
    if let JsonValue::String(s) = value {
        Some(TypeJsonValue::Str(s.to_owned()))
    } else {
        None
    }
}

pub fn parse_bool(value: &JsonValue) -> Option<TypeJsonValue> {
    if let JsonValue::Bool(b) = value {
        Some(TypeJsonValue::Bool(*b))
    } else {
        None
    }
}

pub fn parse_number(value: &JsonValue) -> Option<TypeJsonValue> {
    if let JsonValue::Number(n) = value {
        if let Some(i) = n.as_f64() {
            Some(TypeJsonValue::Number(i))
        } else if let Some(f) = n.as_i64() {
            let float_value: f64 = f as f64;
            Some(TypeJsonValue::Number(float_value))
        } else {
            None
        }
    } else {
        None
    }
}

pub fn parse_array(value: &JsonValue) -> Option<TypeJsonValue> {
    if let JsonValue::Array(arr) = value {
        let values = arr
            .iter()
            .filter_map(|item| {
                // 递归解析嵌套的 JSON 值
                parse_string(item)
                    .or_else(|| parse_number(item))
                    .or_else(|| parse_bool(value))
                    .or_else(|| parse_array(item))
                    .or_else(|| parse_object(item))
            })
            .collect();
        Some(TypeJsonValue::Array(values))
    } else {
        None
    }
}

pub fn parse_object(value: &JsonValue) -> Option<TypeJsonValue> {
    if let JsonValue::Object(obj) = value {
        let mut map = HashMap::new();
        for (key, value) in obj {
            // 递归解析嵌套的 JSON 值
            let parsed_value = parse_string(value)
                .or_else(|| parse_number(value))
                .or_else(|| parse_bool(value))
                .or_else(|| parse_array(value))
                .or_else(|| parse_object(value));
            if let Some(tpye_value) = parsed_value {
                map.insert(key.clone(), tpye_value);
            }
        }
        Some(TypeJsonValue::Object(map))
    } else {
        None
    }
}

// 目前主要用来处理where  条件项的值
pub fn create_tpye_value(json: &JsonValue) -> Option<TypeJsonValue> {
    parse_string(json)
        .or_else(|| parse_number(json))
        .or_else(|| parse_bool(json))
        .or_else(|| parse_array(json))
        .or_else(|| parse_object(json))
        .or_else(|| {
            println!("字段 不存在或类型不支持");
            None
        })
}

