Source: plateform/main/loadDatas.js

import {
  _3DSpace_download_doc,
  _3DSpace_download_multidoc,
  _3DSpace_get_csrf,
  _3DSpace_csrf,
} from "./3dspace_api";

let listObjectId, datas;

const mixedDatas = [];

/**
 * @description La fonction `get_3DSpace_csrf` récupère un jeton CSRF du 3DSpace en utilisant les  informations d'identification fournies.(Anciennement loadDatas()) avec ou sans objID
 *
 * @param {Object} credentials - Un objet contenant les informations d'identification requises pour authentifier
 * la demande. Il inclut généralement des propriétés telles qu'ici' « objID », « space ».
 * @param {String} credentials.space - (3DSpace) L'URL du serveur sur lequel l'API est déployée.(3DSpace, 3DSwym, 3DCompass,...etc)
 * @example pour le 3DSpace {space:"https://r1132100968447-eu1-space.3dexperience.3ds.com/enovia"}
 * @param {String} credentials.objID - Le paramètre objID correspond à un object ID contant les objets Id des bases de données)(se base sur un tenant).
 * @param {Function} [onDone] - Le paramètre `onDone` est une fonction de rappel qui sera appelée lorsque le jeton
 * CSRF sera récupéré avec succès. Il faut un argument, qui est la valeur du jeton CSRF.
 * @param {Function} [onError] - Le paramètre `onError` est une fonction de rappel qui sera appelée si une erreur
 * survient lors de l'exécution de la fonction `get_3DSpace_csrf`. C'est un paramètre facultatif, donc
 * s'il n'est pas fourni, la fonction ne fera rien en cas d'erreur.
 */
export async function get_3DSpace_csrf(
  credentials,
  onDone = undefined,
  onError = undefined,
) {
  if (credentials.objID && credentials.objID !== "") {
    _3DSpace_get_csrf(
      credentials,
      (response) => {
        if (onDone) onDone(response);
      },
      (err) => {
        if (onError) onError(err);
      },
    );
  } else if (credentials.objID === null || credentials.objID === "") {
    _3DSpace_csrf(
      credentials,
      (rep) => {
        const msg = "Pas d'objID, ou invalide";
        const info = { rep, msg };
        if (onDone) onDone(info);
      },
      (err) => {
        const msg = "Pas d'objID et erreur sur le Space";
        const infos = { msg, err };
        if (onError) onError(infos);
      },
    );
  }
}

/**
 * @description La fonction `getDatasByTenant` est une fonction asynchrone qui télécharge une liste de documents à partir du 3DSpace à l'aide des informations d'identification fournies (un ObjectId) et appelle le rappel `onDone`
 * avec les données téléchargées ou le rappel `onError` avec une erreur le cas échéant. (anciennement getDocuments())

 * @param {Object} credentials - Un objet contenant les informations d'identification requises pour authentifier
 * la demande. Il inclut généralement des propriétés telles qu'ici « token » et « space ».(ex: credentials.space, credentials.tenant, credentials.token...).
 * @param {String} credentials.space - (3DSpace) L'URL du serveur sur lequel l'API est déployée.(3DSpace, 3DSwym, 3DCompass,...etc)
 * @example pour le 3DSpace {space:"https://r1132100968447-eu1-space.3dexperience.3ds.com/enovia"}
 * @param {String} credentials.tenant - le tenant courant 
 * @example {tenant:"R1132100968447"}
 * @param {String} credentials.token - Le paramètre token est le jeton CSRF. (headers ex: ENO_CSRF_TOKEN:token) (get_3DSpace_csrf())
 * @param {String} credentials.objID - object Id contenant une liste d'object IDs.
 * @param {Function} [onDone] - Le paramètre onDone est une fonction de rappel qui sera appelée lorsque les
 * données seront téléchargées avec succès. Il faut un argument, qui correspond aux données
 * téléchargées.
 * @param {Function} [onError] - Le paramètre `onError` est une fonction de rappel qui sera appelée si une erreur
 * survient lors de l'exécution de la fonction `_3DSpace_download_doc`. Il vous permet de gérer et de
 * répondre à toute erreur pouvant survenir.
 */
export async function getDatasByTenant(
  credentials,
  onDone = undefined,
  onError = undefined,
) {
  console.log("getDatasByTenant (getDocuments)", credentials);

  await _3DSpace_download_doc(
    credentials,
    (data) => {
      const _datas = {};
      _datas["obj"] = data;
      console.log("getDatasByTenant (getDocuments) _datas", _datas);
      onDone && onDone?.(_datas);

      // getDatasFrom3DSpace(
      //   credentials,
      //   (reponse) => {

      //     _datas["datas"] = reponse;

      //     if (onDone) onDone(_datas);
      //   },
      //   (err) => {
      //     if (onError) onError(err);
      //   },
      // );
    },
    (err) => {
      onError && onError?.(err);
    },
  );
}

/**
 * @description La fonction `getDatasFrom3DSpace` récupère les données d'un espace 3D en utilisant les informations
 * d'identification fournies et appelle le rappel `onDone` avec les données récupérées ou le rappel
 * `onError` avec une erreur le cas échéant.
 * @param {Object} credentials - Un objet contenant les informations d'identification requises pour authentifier
 * la demande. Il inclut généralement des propriétés telles qu'ici « token » et « space ».(ex: credentials.space, credentials.tenant, credentials.token...).
 * @param {String} credentials.space - (3DSpace) L'URL du serveur sur lequel l'API est déployée.(3DSpace, 3DSwym, 3DCompass,...etc)
 * @example pour le 3DSpace {space:"https://r1132100968447-eu1-space.3dexperience.3ds.com/enovia"}
 * @param {String} credentials.tenant - le tenant courant
 * @example {tenant:"R1132100968447"}
 * @param {String} credentials.token - Le paramètre token est le jeton CSRF. (headers ex: ENO_CSRF_TOKEN:token)
 * @param {ArrayOfObject} credentials.objIds - Tableau d'objets des objets Id des bases de données et leur nom.(ex: credentials.objIds=[{objID:"xxx",name:"xxx"},{objID:"xxx",name:"xxx"}] ) (name disponible dans le module :
 * - dbClients,
 * - dbCatalogs,
 * - dbProjets )
 * @param {Function} [onDone] - Le paramètre `onDone` est une fonction de rappel qui sera appelée lorsque toutes
 * les données auront été téléchargées avec succès depuis l'espace 3D. Il faut un argument, qui est un
 * tableau d’objets. Chaque objet du tableau représente un document téléchargé et possède deux
 * propriétés: le nom du document
 * @param {Function} [onError] - Le paramètre `onError` est une fonction de rappel qui sera appelée s'il y a une
 * erreur lors de l'exécution de la fonction `_3DSpace_download_doc`. Il vous permet de gérer et de
 * répondre à toute erreur qui se produit.
 */
export function getDatasFrom3DSpace(
  credentials,
  onDone = undefined,
  onError = undefined,
) {
  const bbds = [];
  if (
    !credentials.objIds &&
    !Array.isArray(credentials.objIds) &&
    credentials.objIds.length === 0
  ) {
    console.warn("la liste est vide ou n'est pas un tableau");
    return;
  }
  credentials.objIds.forEach((obj, i) => {
    _3DSpace_download_doc(
      credentials,
      obj.objID,
      (data) => {
        bbds.push({ [obj.name]: data });
        if (obj.name === "dbProjets") {
          listObjectId = data.affaires.map((aff) => {
            return aff.objectID;
          });
          dataMixing(credentials, datas);
        }
        if (i === credentials.objIds.length - 1) {
          if (onDone) onDone(bbds);

          delete credentials.objIds;
          delete credentials.datas;
        }
      },
      (err) => {
        if (onError) onError(err);
      },
    );
  });
}

/**
 * @description La fonction `dataMixing` prend en compte les informations d'identification, les données et les
 * rappels facultatifs, télécharge les données à partir d'un espace 3D, les mélange avec les données
 * d'entrée et renvoie les données mélangées.
 * @param {Object} credentials - Un objet contenant les informations d'identification requises pour authentifier
 * la demande. Il inclut généralement des propriétés telles qu'ici « token » et « space ».(ex: credentials.space, credentials.tenant, credentials.token...).
@param {String} credentials.space - (3DSpace) L'URL du serveur sur lequel l'API est déployée.(3DSpace, 3DSwym, 3DCompass,...etc)
 * @example pour le 3DSpace {space:"https://r1132100968447-eu1-space.3dexperience.3ds.com/enovia"}
 * @param {String} credentials.tenant - le tenant courant 
 * @example {tenant:"R1132100968447"}
 * @param {String} credentials.token - Le paramètre token est le jeton CSRF. (headers ex: ENO_CSRF_TOKEN:token)
 * @param _datas - Le paramètre `_datas` est un tableau d'objets ID d'Affaires
 * @param {Function} [onDone] - Le paramètre `onDone` est une fonction de rappel qui sera appelée lorsque le
 * processus de mélange des données sera terminé avec succès. Il prend un argument, `mixedDatas`, qui
 * est un tableau contenant les données mixtes.
 * @param {Function} [onError] - Le paramètre `onError` est une fonction de rappel qui sera appelée en cas
 * d'erreur lors du processus de mélange des données. Il faut un argument, qui est l'objet d'erreur.
 */
export function dataMixing(
  credentials,
  _datas,
  onDone = undefined,
  onError = undefined,
) {
  _3DSpace_download_multidoc(
    credentials,
    listObjectId,
    (result) => {
      const copyData = [..._datas];
      copyData.find((e) => e.objectID === result.objectId)["data"] =
        result.data;
      datas = copyData;

      mixedDatas.push(result.data);
      if (onDone) onDone(mixedDatas);
    },
    (err) => {
      if (onError) onError(err), console.log(err);
    },
  );
}