use anyhow::Result;
use dbui_core::field_type::FieldType;
use tokio_postgres::types::FromSql;
use uuid::Uuid;
pub(crate) fn array_to_string(row: &postgres::row::Row, idx: usize, t: &FieldType) -> Result<Option<String>> {
match t {
FieldType::String => Ok(get_array_opt::<String>(row, idx)?.map(|v| format!("{:?}", v))),
FieldType::Boolean => Ok(get_array_opt::<bool>(row, idx)?.map(|v| format!("{:?}", v))),
FieldType::Char => Ok(get_array_opt::<i8>(row, idx)?.map(|v| format!("{:?}", v))),
FieldType::I16 => Ok(get_array_opt::<i16>(row, idx)?.map(|v| format!("{:?}", v))),
FieldType::I32 => Ok(get_array_opt::<i32>(row, idx)?.map(|v| format!("{:?}", v))),
FieldType::U32 => Ok(get_array_opt::<u32>(row, idx)?.map(|v| format!("{:?}", v))),
FieldType::I64 => Ok(get_array_opt::<i64>(row, idx)?.map(|v| format!("{:?}", v))),
FieldType::F32 => Ok(get_array_opt::<f32>(row, idx)?.map(|v| format!("{:?}", v))),
FieldType::F64 => Ok(get_array_opt::<f64>(row, idx)?.map(|v| format!("{:?}", v))),
FieldType::Date => Ok(get_array_opt::<chrono::NaiveDate>(row, idx)?.map(|v| format!("{:?}", v))),
FieldType::Time => Ok(get_array_opt::<chrono::NaiveTime>(row, idx)?.map(|v| format!("{:?}", v))),
FieldType::Timestamp => Ok(get_array_opt::<chrono::NaiveDateTime>(row, idx)?.map(|v| format!("{:?}", v))),
FieldType::TimestampZoned => Ok(get_array_opt::<chrono::DateTime<chrono::Utc>>(row, idx)?.map(|v| format!("{:?}", v))),
FieldType::Uuid => Ok(get_array_opt::<Uuid>(row, idx)?.map(|v| format!("{:?}", v))),
FieldType::Json => Ok(get_array_opt::<serde_json::Value>(row, idx)?.map(|v| {
let x: Vec<String> = v
.iter()
.map(|j| match serde_json::to_string_pretty(&j) {
Ok(s) => s,
Err(e) => format!("Error writing json: [{:?}]", e)
})
.collect();
format!("{:?}", x)
})),
FieldType::StringMap => Ok(get_array_opt::<std::collections::HashMap<String, Option<String>>>(row, idx)?.map(|v| format!("{:?}", v))),
_ => Ok(Some(format!("List[{:?}]", t)))
}
}
fn get_array_opt<'a, T: FromSql<'a>>(row: &'a postgres::row::Row, idx: usize) -> Result<Option<Vec<T>>> {
let o: Result<Option<Vec<T>>> = crate::get_idx(row, idx);
o
}