/**
 * @typedef {Object} Node
 *
 * @property {number} id dataset id
 * @property {string} uuid globally unique id
 * @property {('regular'|'group'|'alias')} type
 * @property {'person'|'document'|'unknown'} [entityClass] like person, document, etc.
 * @property {string} [label]
 *
 * @property {NodeVis} [vis] storage for visualization data
 */

/**
 * @typedef {Object} NodeVis
 * @property {boolean}  [vis.isUserDefined]
 * @property {boolean}  [vis.aggregatesUserDefined] when aggregation
 * @property {boolean}  [vis.aggregationSize] when aggregation
 * @property {number}   [vis.replacedBy] id of presentational node which replaced this node in aggregation
 * @property {number}   [vis.bundledIn] id of presentational node behind which this one is bundled
 * @property {number[]} [vis.bundledNodes] ids of nodes bundled in this node
 * @property {boolean}  [vis.isMiniature] visualize as small dot
 * @property {number[]} [vis.tags] id of tags assigned to the node
 * @property {number[]} [vis.graph]
 * @property {number[]} [vis.graph.x] saved position
 * @property {number[]} [vis.graph.y] saved position
 */

/**
 * @typedef {Object} Link
 *
 * @property {number} id dataset id
 * @property {string} uuid globally unique id
 * @property {number} source id of end node
 * @property {number} target id of end node
 * @property {string} [relationClass] like murder, married, etc.
 *
 * @property {boolean|object} [direction] boolean for singlelink, object for multilink
 * @property {boolean}  [direction.nonDirectional] specific for multilinks
 * @property {boolean}  [direction.sourceToTarget] specific for multilinks
 * @property {boolean}  [direction.targetToSource] specific for multilinks
 *
 * @property {LinkVis}   [vis] storage for visualization data
 */

/**
 * @typedef {Object} LinkVis
 * @property {boolean}  [vis.isUserDefined]
 * @property {boolean}  [vis.aggregatesUserDefined] specific for multilinks
 * @property {boolean}  [vis.isMultilink] specific for multilinks
 * @property {number}   [vis.inMultilink] id of multilink which it belongs to
 * @property {number}   [vis.newSource] specific for singlelinks
 * @property {number}   [vis.newTarget]
 * @property {boolean}  [vis.isRemoved]
 * @property {boolean}  [vis.isArchived] specific for multilinks: when link is inactive, waiting to be recovered when ungrouping
 * @property {boolean}  [vis.isTransferred]
 * @property {number[]} [vis.tags] ids of tags assigned to the link
 * @property {number}   [vis.multilinkSize] number of links aggregated under this multilin
 * @property {number}   [vis.weight] weight of the edge // FIXME: not implemented
 * @property {Timestamp}  [vis.timestamp] // FIXME: not implemented
 */

/**
 * @typedef {Object} Timestamp
 * @property {number} from
 * @property {number} [to]
 * @property {boolean} isInterval
 */

/**
 * @typedef {Object} Tag
 * FIXME: some of these should be optional
 *
 * @property {number}   id
 * @property {string}   uuid globally unique id
 * @property {string}   name
 * @property {number}   groupNodeId id of aggregation node created with tag
 * @property {number[]} assignedObjectsIds arr of object ids which have the tag
 * @property {boolean}  isVisualized if tag is visible in graph near the nodes
 * @property {string}   color in hexa
 * @property {string}   stroke in hexa
 * @property {'group'|'alias'|'bundle'|'manual'|'link'} type if created automatically by aggregation or manually by user
 * @property {boolean}  [isMiniaturized] whether nodes assigned to tag are miniature
 */

export default {}
