import type DataModel from "./DataModel.js";
import type ServiceDefinition from "./ServiceDefinition.js";
import type { JSONSupport } from "../../core/JSONSupport.js";

export interface KnowledgeGraphProperties extends Partial<Pick<KnowledgeGraph, "url">> {}

/**
 * The knowledge graph associated with the [knowledgeGraphService](https://developers.arcgis.com/javascript/latest/references/core/rest/knowledgeGraphService/). This is a graph database that stores entities and relationships.
 *
 * @since 4.25
 * @see [fetchKnowledgeGraph()](https://developers.arcgis.com/javascript/latest/references/core/rest/knowledgeGraphService/#fetchKnowledgeGraph)
 * @see [Hosted Knowledge Graph Service](https://developers.arcgis.com/rest/services-reference/enterprise/kgs-hosted-server.htm) for information on the structure knowledge graph services on ArcGIS Enterprise and the REST API
 * @example
 * //fetch the knowledge graph
 * const KnowledgeGraphModule = await $arcgis.import("@arcgis/core/rest/knowledgeGraphService.js");
 * const url = "https://<web server hostname>/server/rest/admin/services/<serviceName>/KnowledgeGraphServer";
 * KnowledgeGraphModule.fetchKnowledgeGraph(url)
 *  .then((kg) => {
 *     //do something with result
 *    console.log(kg)
 * });
 * @example
 * //sample result returned from fetchKnowledgeGraph()
 * {
 *  "url":"https://myHostName.domain.com/arcgis/rest/services/Hosted/myServiceName/KnowledgeGraphServer"
 *  {
 *  "dataModel": {
 *    "declaredClass": "esri.rest.knowledgeGraph.DataModel",
 *    "timestamp": {},
 *    "spatialReference": {
 *      "latestWkid": 0,
 *      "wkid": 4326,
 *      "vcsWkid": 0,
 *      "latestVcsWkid": 0
 *    },
 *    "strict": false,
 *    "entityTypes": [
 *      {
 *        "declaredClass": "esri.rest.knowledgeGraph.EntityType",
 *        "name": "company",
 *        "alias": "Company",
 *        "role": "Regular",
 *        "strict": false,
 *        "properties": [
 *          {
 *            "declaredClass": "esri.rest.knowledgeGraph.GraphProperty",
 *            "name": "Name",
 *            "alias": "Name",
 *            "fieldType": "esriFieldTypeString",
 *            "geometryType": "esriGeometryNull",
 *            "hasM": false,
 *            "hasZ": false,
 *            "nullable": true,
 *            "editable": true,
 *            "required": false,
 *            "defaultVisibility": true,
 *            "systemMaintained": false,
 *            "role": "esriGraphPropertyRegular",
 *            "defaultValue": null
 *          },
 *          {
 *            "declaredClass": "esri.rest.knowledgeGraph.GraphProperty",
 *            "name": "id",
 *            "alias": "ID",
 *            "fieldType": "esriFieldTypeOID",
 *            "geometryType": "esriGeometryNull",
 *            "hasM": false,
 *            "hasZ": false,
 *            "nullable": false,
 *            "editable": false,
 *            "required": true,
 *            "defaultVisibility": true,
 *            "systemMaintained": true,
 *            "role": "esriGraphPropertyRegular",
 *            "defaultValue": null
 *          }
 *        ],
 *        "fieldIndexes": [
 *          {
 *            "declaredClass": "esri.rest.knowledgeGraph.FieldIndex",
 *            "name": "esri__id_idx",
 *            "unique": true,
 *            "ascending": true,
 *            "description": "",
 *            "fieldNames": [
 *              "id"
 *            ]
 *          },
 *          {
 *            "declaredClass": "esri.rest.knowledgeGraph.FieldIndex",
 *            "name": "esri__name_idx",
 *            "unique": true,
 *            "ascending": true,
 *            "description": "",
 *            "fieldNames": [
 *              "name"
 *            ]
 *          }
 *        ]
 *      }
 *    ],
 *    "relationshipTypes": [
 *      {
 *        "declaredClass": "esri.rest.knowledgeGraph.RelationshipType",
 *        "name": "employed_bu",
 *        "alias": "Employed By",
 *        "role": "Regular",
 *        "strict": false,
 *        "properties": [
 *          {
 *            "declaredClass": "esri.rest.knowledgeGraph.GraphProperty",
 *            "name": "id",
 *            "alias": "id",
 *            "fieldType": "esriFieldTypeGUID",
 *            "geometryType": "esriGeometryNull",
 *            "hasM": false,
 *            "hasZ": false,
 *            "nullable": false,
 *            "editable": false,
 *            "required": true,
 *            "defaultVisibility": true,
 *            "systemMaintained": true,
 *            "role": "esriGraphPropertyRegular",
 *            "defaultValue": null
 *          },
 *          {
 *            "declaredClass": "esri.rest.knowledgeGraph.GraphProperty",
 *            "name": "start_date",
 *            "alias": "Start Date",
 *            "fieldType": "esriFieldTypeGUID",
 *            "geometryType": "esriGeometryNull",
 *            "hasM": false,
 *            "hasZ": false,
 *            "nullable": false,
 *            "editable": false,
 *            "required": true,
 *            "defaultVisibility": true,
 *            "systemMaintained": false,
 *            "role": "esriGraphPropertyRegular",
 *            "defaultValue": null
 *          }
 *        ],
 *        "fieldIndexes": [
 *             {
 *             "ascending": true,
 *             "description": "index on id field",
 *             "fieldNames": ["id"],
 *             "name": "esri_id_idx",
 *             "unique": "true",
 *           }
 *        ],
 *        "originEntityTypes": [
 *          "Person"
 *        ],
 *        "destinationEntityTypes": [
 *          "Company"
 *        ]
 *      }
 *    ]
 *   }
 *  }
 * }
 */
export default class KnowledgeGraph extends JSONSupport {
  constructor(properties?: KnowledgeGraphProperties);
  /**
   * The [data model](https://developers.arcgis.com/javascript/latest/references/core/rest/knowledgeGraph/DataModel/) of the knowledge graph service.
   * The data model defines the types of entities and relationships that can exist in the knowledge graph
   * and the properties that can exist for each type of entity and relationship.
   */
  get dataModel(): DataModel;
  /**
   * The [service definition](https://developers.arcgis.com/javascript/latest/references/core/rest/knowledgeGraph/ServiceDefinition/) of the knowledge graph service.
   * The service definition outlines the capabilities of the knowledge graph such as search indexes, operations allowed etc.
   */
  get serviceDefinition(): ServiceDefinition;
  /** The url to a hosted knowledge graph. See [ArcGIS Hosted Knowledge Graph](https://developers.arcgis.com/rest/services-reference/enterprise/kgs-hosted-server.htm) for more information on knowledge graph services. */
  accessor url: string;
}