import type Accessor from "../../core/Accessor.js";
import type EsriError from "../../core/Error.js";

export interface GraphApplyEditsResultProperties extends Partial<Pick<GraphApplyEditsResult, "cascadeProvenanceDeleteResults" | "cascadeRelationshipDeleteResults" | "editResults" | "error" | "hasError">> {}

/**
 * The result of an [executeApplyEdits()](https://developers.arcgis.com/javascript/latest/references/core/rest/knowledgeGraphService/#executeApplyEdits) performed on a knowledge graph service's
 * [graph](https://developers.arcgis.com/javascript/latest/references/core/rest/knowledgeGraph/KnowledgeGraph/) resource. Summarizes the edits to the graph
 * and provides any errors encountered in performing the edits.
 *
 * @since 4.25
 * @see [GraphApplyEdits](https://developers.arcgis.com/javascript/latest/references/core/rest/knowledgeGraph/GraphApplyEdits/)
 * @example
 * // sample executeApplyEdits() to add a new entity
 * const newEntity = new Entity({
 *   typeName: "Supplier",
 *   properties: {
 *     Name: "Supplier 5",
 *     EmployeeCount: 681
 *   }
 * })
 *
 * KnowledgeGraphModule.executeApplyEdits(graph, {
 *   entityAdds: [newEntity],
 * })
 * .then((editResult) => {
 *   console.log("Graph Add Result", editResult);
 * });
 * @example
 * // Results of adding one entity to the `Supplier` entity type
 * {
 *   editResults:[{
 *     adds:[
 *     {
 *       id: "{AN4E4G85-41F1-49A4-8412-CACCC9906E88}",
 *       error: {errorCode: 0, errorMessage: ""}
 *     }],
 *     deletes:[],
 *     typeName: "Supplier",
 *     updates:[]
 *   }],
 *   hasError: false,
 *   error: undefined
 * }
 * @example
 * // example results of a complex executeApplyEdits that involved
 * // adding, updating and deleting multiple types.
 * {
 *   editResults:[{
 *     adds:[
 *     {
 *       id: "{AN4E4G85-41F1-49A4-8412-CACCC9906E88}",
 *       error: {errorCode: 0, errorMessage: ""}
 *     }],
 *     deletes:[],
 *     typeName: "Supplier",
 *     updates:[]
 *   },{
 *     adds:[{
 *       id: "{ANWIFHSAS-AW6F-G9W4-8412-A1A8W4F1A5S6F}",
 *       error: {errorCode: 0, errorMessage: ""}
 *     }],
 *     deletes:[{
 *       id: "{AN4E4G85-Q15F4-49A4-8412-A1W8F4S6A5S4}",
 *       error: {errorCode: 0, errorMessage: ""}
 *     },{
 *       id: "{AF15W4F8S-A1W5-A1W8F-G1E8-AF1W5F4S8F4W}",
 *       error: {errorCode: 0, errorMessage: ""}
 *     }],
 *     typeName: "Part",
 *     updates:[{
 *       id: "{2WS8F4SA-41F1-S1E8-8412-F2G5S4D8GE1S}",
 *       error: {errorCode: 0, errorMessage: ""}
 *     }]
 *   }],
 *   hasError: false,
 *   error: undefined
 * }
 * @example
 * // example of an error message due to misspelled entity type
 * {
 *   editResults:[],
 *   hasError: true,
 *   error: {
 *     errorCode: 112020,
 *     errorMessage: "The Entity/Relationship type definition, Suppplier, was not found."
 *   }
 * }
 */
export default class GraphApplyEditsResult extends Accessor {
  constructor(properties?: GraphApplyEditsResultProperties);
  /**
   * Returns a list of the Provenance entities that were deleted as a result of the [executeApplyEdits()](https://developers.arcgis.com/javascript/latest/references/core/rest/knowledgeGraphService/#executeApplyEdits)
   * call with the `cascadeProvenanceDeletes` option enabled.
   *
   * If [hasError](https://developers.arcgis.com/javascript/latest/references/core/rest/knowledgeGraph/GraphApplyEditsResult/#hasError) is `true`, `cascadeProvenanceDeletes` will be empty.
   *
   * @example
   * cascadeProvenanceDeleteResults:[{
   *     id: "{FB74F4DD-CBD7-4C94-BA89-0C044ECCC273}",
   *     error: {errorCode: 0, errorMessage: ""}
   *   }]
   */
  accessor cascadeProvenanceDeleteResults: Array<CascadeProvenanceDeleteResults>;
  /**
   * Returns a list of objects for each [relationship type](https://developers.arcgis.com/javascript/latest/references/core/rest/knowledgeGraph/RelationshipType/)
   * that was deleted by as a result of deleting its origin or destination entity during an [executeApplyEdits()](https://developers.arcgis.com/javascript/latest/references/core/rest/knowledgeGraphService/#executeApplyEdits)
   * call with the `cascadeDeletes` option enabled.
   *
   * If [hasError](https://developers.arcgis.com/javascript/latest/references/core/rest/knowledgeGraph/GraphApplyEditsResult/#hasError) is `true`, `cascadeRelationshipDeletes` will be empty.
   *
   * @example
   * cascadeRelationshipDeleteResults:[{
   *     typeName: "supplies",
   *     cascadeRelationshipDeletes: [
   *       {
   *         id: "{FB74F4DD-CBD7-4C94-BA89-0C044ECCC273}",
   *         error: {errorCode: 0, errorMessage: ""}
   *         originId: "{AN4E4G85-41F1-49A4-8412-CACCC9906E88}",
   *         destinationId: "{2WS8F4SA-41F1-S1E8-8412-F2G5S4D8GE1S}"
   *       }
   *     ]
   *   }]
   */
  accessor cascadeRelationshipDeleteResults: Array<CascadeRelationshipDeleteResults>;
  /**
   * Returns a list of objects for each [entity type](https://developers.arcgis.com/javascript/latest/references/core/rest/knowledgeGraph/EntityType/) or
   * [relationship type](https://developers.arcgis.com/javascript/latest/references/core/rest/knowledgeGraph/RelationshipType/) that added, updated or deleted records by
   * [executeApplyEdits()](https://developers.arcgis.com/javascript/latest/references/core/rest/knowledgeGraphService/#executeApplyEdits).
   *
   * If [hasError](https://developers.arcgis.com/javascript/latest/references/core/rest/knowledgeGraph/GraphApplyEditsResult/#hasError) is `true`, `editResults` will be empty.
   *
   * @example
   * editResults:[{
   *     adds:[
   *     {
   *       id: "{AN4E4G85-41F1-49A4-8412-CACCC9906E88}",
   *       error: {errorCode: 0, errorMessage: ""}
   *     }],
   *     deletes:[],
   *     typeName: "Supplier",
   *     updates:[]
   *   },{
   *     adds:[{
   *       id: "{ANWIFHSAS-AW6F-G9W4-8412-A1A8W4F1A5S6F}",
   *       error: {errorCode: 0, errorMessage: ""}
   *     }],
   *     deletes:[{
   *       id: "{AN4E4G85-Q15F4-49A4-8412-A1W8F4S6A5S4}",
   *       error: {errorCode: 0, errorMessage: ""}
   *     },{
   *       id: "{AF15W4F8S-A1W5-A1W8F-G1E8-AF1W5F4S8F4W}",
   *       error: {errorCode: 0, errorMessage: ""}
   *     }],
   *     typeName: "Part",
   *     updates:[{
   *       id: "{2WS8F4SA-41F1-S1E8-8412-F2G5S4D8GE1S}",
   *       error: {errorCode: 0, errorMessage: ""}
   *     }]
   * }],
   */
  accessor editResults: Array<EditResultsObject>;
  /**
   * The error message explaining information about why [executeApplyEdits()](https://developers.arcgis.com/javascript/latest/references/core/rest/knowledgeGraphService/#executeApplyEdits) failed.
   * Will only be defined if [hasError](https://developers.arcgis.com/javascript/latest/references/core/rest/knowledgeGraph/GraphApplyEditsResult/#hasError) is `true`.
   *
   * @example
   * // example of an error message due to misspelled entity type
   * {
   *   editResults:[],
   *   hasError: false,
   *   error: {
   *     errorCode: 112020,
   *     errorMessage: "The Entity/Relationship type definition, Suppplier, was not found."
   *   }
   * }
   */
  accessor error: EsriError | null | undefined;
  /**
   * If `true` there was an error processing [executeApplyEdits()](https://developers.arcgis.com/javascript/latest/references/core/rest/knowledgeGraphService/#executeApplyEdits).
   * The error message is captured in the [error](https://developers.arcgis.com/javascript/latest/references/core/rest/knowledgeGraph/GraphApplyEditsResult/#error) property.
   *
   * @default false
   */
  accessor hasError: boolean;
}

/**
 * EditResultsObject returns a list of all [entities](https://developers.arcgis.com/javascript/latest/references/core/rest/knowledgeGraph/Entity/)
 * and [relationships](https://developers.arcgis.com/javascript/latest/references/core/rest/knowledgeGraph/Relationship/) of each [type](https://developers.arcgis.com/javascript/latest/references/core/rest/knowledgeGraph/GraphObjectType/)
 * that was added, updated or deleted from the [KnowledgeGraph](https://developers.arcgis.com/javascript/latest/references/core/rest/knowledgeGraph/KnowledgeGraph/) as well as any errors that occurred during the operation.
 *
 * @example
 * {
 *   adds:[{
 *       id: "{ANWIFHSAS-AW6F-G9W4-8412-A1A8W4F1A5S6F}",
 *       error: {errorCode: 0, errorMessage: ""}
 *     }],
 *     deletes:[{
 *       id: "{AN4E4G85-Q15F4-49A4-8412-A1W8F4S6A5S4}",
 *       error: {errorCode: 0, errorMessage: ""}
 *     },{
 *       id: "{AF15W4F8S-A1W5-A1W8F-G1E8-AF1W5F4S8F4W}",
 *       error: {errorCode: 0, errorMessage: ""}
 *     }],
 *     typeName: "Part",
 *     updates:[{
 *       id: "{2WS8F4SA-41F1-S1E8-8412-F2G5S4D8GE1S}",
 *       error: {errorCode: 0, errorMessage: ""}
 *     }]
 * }
 */
export interface EditResultsObject {
  /**
   * The name of the [EntityType](https://developers.arcgis.com/javascript/latest/references/core/rest/knowledgeGraph/EntityType/) or [RelationshipType](https://developers.arcgis.com/javascript/latest/references/core/rest/knowledgeGraph/RelationshipType/)
   * that had changed items.
   */
  typeName: string;
  /**
   * A list of objects containing the
   * id and error information for every added entity or relationship.
   */
  adds: Array<NamedObjectEditResults>;
  /**
   * A list of objects containing the
   * id and error information for every updated entity or relationship.
   */
  updates: Array<NamedObjectEditResults>;
  /**
   * A list of objects containing the
   * id and error information for every deleted entity or relationship.
   */
  deletes: Array<NamedObjectEditResults>;
}

/**
 * NamedObjectEditResults contains the `id` of the [GraphNamedObject](https://developers.arcgis.com/javascript/latest/references/core/rest/knowledgeGraph/GraphNamedObject/)
 * ([Entity](https://developers.arcgis.com/javascript/latest/references/core/rest/knowledgeGraph/Entity/) or [Relationship](https://developers.arcgis.com/javascript/latest/references/core/rest/knowledgeGraph/Relationship/)) that
 * was added, updated or deleted from the [KnowledgeGraph](https://developers.arcgis.com/javascript/latest/references/core/rest/knowledgeGraph/KnowledgeGraph/) as well as any errors that occurred during the operation.
 *
 * @example
 * // typical structure
 * {
 *   id: "{2WS8F4SA-41F1-S1E8-8412-F2G5S4D8GE1S}", //id of entity or relationship added, updated or deleted
 *   error: {errorCode: 0, errorMessage: ""}
 * }
 */
export interface NamedObjectEditResults {
  /**
   * The id of the [Entity](https://developers.arcgis.com/javascript/latest/references/core/rest/knowledgeGraph/Entity/) or [Relationship](https://developers.arcgis.com/javascript/latest/references/core/rest/knowledgeGraph/Relationship/)
   * that was added, updated or deleted from the knowledge graph.
   */
  id: string;
  /** Indicates any errors caused during the operation applied to this object. */
  error?: EsriError;
}

/**
 * cascadeRelationshipDeletesResults returns a list of all [relationships](https://developers.arcgis.com/javascript/latest/references/core/rest/knowledgeGraph/Relationship/) of each [type](https://developers.arcgis.com/javascript/latest/references/core/rest/knowledgeGraph/GraphObjectType/)
 * that were deleted from the [KnowledgeGraph](https://developers.arcgis.com/javascript/latest/references/core/rest/knowledgeGraph/KnowledgeGraph/) due to one of their endpoints being deleted, as well as any errors that occurred during the operation.
 *
 * @example
 * {
 *     typeName: "supplies",
 *     cascadeRelationshipDeletes: [
 *       {
 *         id: "{FB74F4DD-CBD7-4C94-BA89-0C044ECCC273}",
 *         error: {errorCode: 0, errorMessage: ""}
 *         originId: "{AN4E4G85-41F1-49A4-8412-CACCC9906E88}",
 *         destinationId: "{2WS8F4SA-41F1-S1E8-8412-F2G5S4D8GE1S}"
 *       }
 *     ]
 * }
 */
export interface CascadeRelationshipDeleteResults {
  /** The name of the [RelationshipType](https://developers.arcgis.com/javascript/latest/references/core/rest/knowledgeGraph/RelationshipType/) that had deleted relationships. */
  typeName: string;
  /**
   * A list of objects containing the
   * id, origin id, destination id and error information for every deleted relationship.
   */
  cascadeRelationshipDeletes: Array<NamedObjectCascadeRelationshipDeleteResults>;
}

/**
 * NamedObjectCascadeRelationshipDeleteResults contains the `id` of the [Relationship](https://developers.arcgis.com/javascript/latest/references/core/rest/knowledgeGraph/Relationship/) that
 * was deleted from the [KnowledgeGraph](https://developers.arcgis.com/javascript/latest/references/core/rest/knowledgeGraph/KnowledgeGraph/) along with its origin id, destination id and error information.
 *
 * @example
 * // typical structure
 * {
 *   id: "{FB74F4DD-CBD7-4C94-BA89-0C044ECCC273}",
 *   error: {errorCode: 0, errorMessage: ""}
 *   originId: "{AN4E4G85-41F1-49A4-8412-CACCC9906E88}",
 *   destinationId: "{2WS8F4SA-41F1-S1E8-8412-F2G5S4D8GE1S}"
 * }
 */
export interface NamedObjectCascadeRelationshipDeleteResults extends NamedObjectEditResults {
  /** The id of the origin entity of the deleted relationship. */
  originId: string;
  /** The id of the destination entity of the deleted relationship. */
  destinationId: string;
}

/**
 * CascadeProvenanceDeleteResults contains the `id` of the Provenance [GraphNamedObject](https://developers.arcgis.com/javascript/latest/references/core/rest/knowledgeGraph/GraphNamedObject/)
 * that was deleted from the [KnowledgeGraph](https://developers.arcgis.com/javascript/latest/references/core/rest/knowledgeGraph/KnowledgeGraph/) as well as any errors that occurred during the operation,
 * when edits were applied with `cascadeProvenanceDelete` set to true.
 *
 * @example
 * // typical structure
 * {
 *   id: "{2WS8F4SA-41F1-S1E8-8412-F2G5S4D8GE1S}", //id of Provenance entity deleted
 *   error: {errorCode: 0, errorMessage: ""}
 * }
 */
export interface CascadeProvenanceDeleteResults {
  /** The id of the Provenance [Entity](https://developers.arcgis.com/javascript/latest/references/core/rest/knowledgeGraph/Entity/) deleted from the knowledge graph. */
  id: string;
  /** Indicates any errors caused during the operation applied to this object. */
  error?: EsriError;
}