use std::rc::Rc;
use super::client::PlmClient;
use crate::panels::plm_parts::CreatedPart;
pub fn part_type_of(document: &serde_json::Value) -> &'static str {
let assembly = document["features"].as_array().is_some_and(|f| f.iter().any(|f| f["type"] == "ACOMP"));
if assembly { "assembly" } else { "component" }
}
pub async fn make_items(client: Rc<PlmClient>, requests: Vec<(String, String, String)>, folder: String) -> Result<Vec<String>, String> {
let body = |value: serde_json::Value| Some(serde_json::to_vec(&value).unwrap_or_default());
let mut keys = Vec::new();
for (_, name, part_type) in requests {
let create = |part_type: &str| client.call("POST", "/api/parts", body(serde_json::json!({ "part_type": part_type, "name": name, "document_class": "normal", "workspace_folder": folder })));
let response = match create(&part_type).await {
Ok(response) => response,
Err(_) if part_type != "component" => create("component").await.map_err(|e| format!("'{name}': {e}"))?,
Err(error) => return Err(format!("'{name}': {error}")),
};
let part: CreatedPart = serde_json::from_slice(&response.body).map_err(|e| format!("'{name}': the new part's answer: {e}"))?;
let revision = part.revisions.first().ok_or_else(|| format!("'{name}': the new part has no revision"))?;
let path = format!("{}/checkout", crate::plm::identity::revision_path(&part.id, &revision.id));
client.call("POST", &path, body(serde_json::json!({ "client_id": "brep-app" }))).await.map_err(|e| format!("'{name}': {e}"))?;
keys.push(crate::plm::identity::document_key(&part.id, &revision.id));
}
Ok(keys)
}
pub async fn linking_folder(client: &PlmClient, part: &str) -> Option<(String, String)> {
let path = format!("/api/workspace/links?part={}", crate::plm::identity::segment(part));
let answer = client.call("GET", &path, None).await.ok()?;
let answer: serde_json::Value = serde_json::from_slice(&answer.body).ok()?;
match answer["folders"].as_array()?.as_slice() {
[one] => Some((one["id"].as_str()?.to_string(), one["path"].as_str()?.to_string())),
_ => None,
}
}