// The MIT License (MIT)
//
// Copyright (c) 2019-2021 Camptocamp SA
//
// Permission is hereby granted, free of charge, to any person obtaining a copy of
// this software and associated documentation files (the "Software"), to deal in
// the Software without restriction, including without limitation the rights to
// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
// the Software, and to permit persons to whom the Software is furnished to do so,
// subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
/**
* The GeoMapFish "themes" web service.
*/
/**
* @typedef {Object} GmfThemes
*/
/**
* @typedef {Object} GmfThemesResponse
* @property {Array<GmfLayer|GmfGroup>} background_layers
* @property {string[]} errors
* @property {GmfOgcServers} ogcServers
* @property {GmfTheme[]} themes
*/
/**
* @typedef {Object} GmfRootNode
* @property {GmfGroup[]} children
*/
/**
* Contains the common element of all the elements of the GeoMapFish layer tree.
* @typedef {Object} GmfBaseNode
* @property {number} id
* @property {GmfMetaData} metadata The related metadata.
* @property {string} name
*/
/**
* The element we can select in the theme selector.
* extends GmfBaseNode
* @typedef {Object} GmfTheme
* @property {number} id (GmfBaseNode)
* @property {GmfMetaData} metadata (GmfBaseNode)
* @property {string} name (GmfBaseNode)
* @property {GmfGroup[]} children The first level layer groups.
* @property {GmfFunctionalities} functionalities
*/
/**
* A GeoMapFish group
* not an OpenLayers group
* neither a WMS group.
* This represent « first level group » (Block in the layer tree),
* or all sub nodes that's not a leaf.
* extends GmfBaseNode
* @typedef {Object} GmfGroup
* @property {number} id (GmfBaseNode)
* @property {GmfMetaData} metadata (GmfBaseNode)
* @property {string} name (GmfBaseNode)
* @property {Array<GmfGroup|GmfLayer>} children
* @property {import('ngeo/datasource/OGC.js').Dimensions} dimensions The dimensions managed by the
* OpenLayers layer, if the value is null we will take the dimension from the application.
* This is present only on non mixed first level group.
* @property {boolean} mixed A mixed group is a group on which one the layers comes from different sources,
* then all the sub GeoMapFish layers (leaf) will be an OpenLayers layer.
* By opposition a non mixed first level group contains only GeoMapFish layers WMS
* from the same server, then we have only one OpenLayers layer for all the first level group.
* All the group child will have the same value of his parent,
* In other word, all the group of a first level group will have the same value.
* @property {string} [ogcServer] On non mixed first level group it is the ogc server to use.
* @property {import('ngeo/datasource/OGC.js').TimeProperty} [time] On non mixed first level group with more
* then one time layer, it is the time information.
* @property {string} [popupId] a popup identifier for the associate submenu.
*/
/**
* A GeoMapFish layer
* not an OpenLayers layer
* neither a WMS layer.
* This is also the leaf of the tree.
* extends GmfBaseNode
* @typedef {Object} GmfLayer
* @property {number} id (GmfBaseNode)
* @property {GmfMetaData} metadata (GmfBaseNode)
* @property {string} name (GmfBaseNode)
* @property {import('ngeo/datasource/OGC.js').Dimensions} dimensions The dimensions managed by the layer,
* if the value is null we will take the dimension from the application.
* Present only on layer in a mixed group.
* @property {import('ngeo/datasource/OGC.js').DimensionsFiltersConfig} dimensionsFilters The dimensions
* applied by filters on the layer configuration, if the value is null we will take the dimension from
* the application.
* @property {boolean} [editable]
* @property {string} [style]
* @property {string} type WMS or WMTS.
* @property {string} [ogcServer]
* @property {string} [popupId] a popup identifier for the associate submenu.
*/
/**
* extends GmfLayer
* @typedef {Object} GmfLayerWMS
* @property {number} id (GmfBaseNode)
* @property {GmfMetaData} metadata (GmfBaseNode)
* @property {string} name (GmfBaseNode)
* @property {import('ngeo/datasource/OGC.js').Dimensions} dimensions (GmfLayer)
* @property {import('ngeo/datasource/OGC.js').DimensionsFiltersConfig} dimensionsFilters (GmfLayer)
* @property {boolean} [editable] (GmfLayer)
* @property {string} [style] (GmfLayer)
* @property {string} type (GmfLayer)
* @property {GmfLayerChildLayer[]} childLayers
* @property {string} layers The comma separated list of WMS layers or groups.
* @property {number} maxResolutionHint The max resolution where the layer is visible.
* @property {number} minResolutionHint The min resolution where the layer is visible.
* @property {string} [ogcServer]
* @property {import('ngeo/datasource/OGC.js').TimeProperty} [time] The time information if the layer
* directly manage it, see also `{GmfGroup.time}`.
*/
/**
* extends GmfLayer
* @typedef {Object} GmfLayerWMTS
* @property {number} id (GmfBaseNode)
* @property {GmfMetaData} metadata (GmfBaseNode)
* @property {string} name (GmfBaseNode)
* @property {import('ngeo/datasource/OGC.js').Dimensions} dimensions (GmfLayer)
* @property {import('ngeo/datasource/OGC.js').DimensionsFiltersConfig} dimensionsFilters (GmfLayer)
* @property {boolean} [editable] (GmfLayer)
* @property {string} [style] (GmfLayer)
* @property {string} type (GmfLayer)
* @property {string} imageType 'image/png' or 'image/jpeg'.
* @property {string} layer
* @property {string} matrixSet
* @property {string} url
*/
/**
* Additional attributes related on a WMS layers (or WFS features type).
* @typedef {Object} GmfLayerChildLayer
* @property {boolean|undefined} [getData] If the layer is queryable and this property is set to
* false, then the layer won't be used in queries issued. Defaults to `true`.
* @property {number} maxResolutionHint The min resolution where the layer is visible.
* @property {number} minResolutionHint The max resolution where the layer is visible.
* @property {string} name
* @property {boolean} queryable
*/
/**
* @typedef {Object<string, GmfOgcServer>} GmfOgcServers
*/
/**
* @typedef {Object} GmfOgcServerAttribute
* @property {string} [alias] The attribute alias.
* @property {string} [minOccurs] If not '0', then the attribute is
* considered required.
* @property {string} namespace The attribute namespace.
* @property {string} type The attribute type (in namspace).
*/
/**
* @typedef {Object} GmfOgcServer
* @property {boolean} credential
* @property {string} imageType 'image/png' or 'image/jpeg'.
* @property {boolean} isSingleTile
* @property {string} [namespace] Namespace
* @property {string} type 'mapserver', 'qgisserver', 'geoserver' or 'other'.
* @property {string} url
* @property {string} urlWfs The WFS URL.
* @property {string} [wfsFeatureNS] WFS feature namespace
* @property {boolean} wfsSupport
* @property {Object<string, Object<string, GmfOgcServerAttribute>>} attributes
*/
/**
* @typedef {Object} GmfFunctionalities
* @property {string[]} [default_basemap] The default base map.
* @property {string[]} [open_panel] When set, contains the name of the panel to open upon loading an
* application.
* Note: although this is a list, only one can be defined.
* @property {string[]} [preset_layer_filter] Name of the layer (data source) that should be toggled
* in the filter tool upon loading an application.
* Note: although this is a list, only one can be defined.
*/
/**
* @typedef {Object} GmfMetaData
* @property {boolean} [copyable=false] Whether the geometry from this data source can be copied to other data
* sources or not. For WMS layers.
* @property {string[]} [directedFilterAttributes] List of attribute names which should have rules
* already ready when using the filter tools. For WMS layers.
* @property {string} [disclaimer] The disclaimer text for this element.
* For WMS and WMTS layers, layer groups and themes.
* @property {string[]} [enumeratedAttributes] List of attribute names which have enumerated attribute
* values (for filters purpose). For WMS layers.
* @property {boolean} [exclusiveGroup=false] Whether the group contains children that have to be mutually
* exclusive, meaning that only one child may be ON at any time.
* @property {string} [iconUrl] The URL of the icon to display in the layer tree. For WMS and WMTS layers.
* @property {string} identifierAttributeField The field used in the 'display query window' as feature title.
* For WMS layers.
* @property {boolean|undefined} [isChecked=false] Is the layer checked by default. For WMS and WMTS layers.
* @property {boolean|undefined} [isExpanded=false] Whether the layer group is expanded by default. For
* layer groups (only).
* @property {boolean} [printNativeAngle=true] Whether the print should rotate the symbols. For layer groups
* (only).
* @property {boolean|undefined} [isLegendExpanded=false] Whether the legend is expanded by default. For WMS
* and WMTS layers.
* @property {boolean} [legend=false] Display the legend of this layers. For WMS and WMTS layers.
* @property {string} [legendImage] The URL to the image used as a legend in the layer tree. For WMS and
* WMTS layers.
* @property {Object<string, string>} [hiDPILegendImages] The URLs to the hi DPI images used as a legend
* in the layer tree. For WMS and WMTS layers.
* @property {string} [legendRule] The WMS 'RULE' parameter used to display the icon in the layer tree.
* "Short version" of the 'iconURL' metadata for WMS layers. For WMS layers.
* @property {number} [maxResolution] The max resolution where the layer is visible. For WMS layers.
* On WMTS layers it will have an effect on the node in the layertree but not on the layertree directly.
* @property {string} [metadataUrl] The URL to the information on this layer. For WMS and WMTS layers.
* @property {number} [minResolution] The min resolution where the layer is visible. For WMS layers.
* On WMTS layers it will have an effect on the node in the layertree but not on the layer directly.
* @property {string} [ogcServer] The corresponding OGC server for a WMTS layer. For WMTS layers.
* @property {number} [opacity=1.0] Layer opacity. 1.0 means fully visible, 0 means invisible, For WMS and
* WMTS layers.
* @property {string} [printLayers] A WMS layer that will be used instead of the WMTS layers in the print.
* Used to increase quality of printed WMTS layers. For WMTS layers.
* @property {string} [queryLayers] The WMS layers used as references to query the WMTS layers (for WMTS
* layers) or the WFS layers that should be queried only in case of a WFS GetFeature request.
* @property {string} [thumbnail] The icon visible in the background selector. For WMS and WMTS layers.
* @property {string} [timeAttribute] The name of the time attribute. For WMS(-T) layers.
* @property {GmfSnappingConfig} [snappingConfig] The snapping configuration for the leaf. If set, the
* leaf's layer is considered to be "snappable", even if the config itself is empty.
* Example value: {'tolerance': 50, 'edge': false} For WMS layers.
* @property {string} [wmsLayers] A corresponding WMS layer for WMTS layers. Used to query the WMTS layers
* and to print them. (See also printLayers and queryLayers metadata for more
* granularity). For WMTS Layers.
* @property {Object} [customOpenLayersOptions] The custom OpenLayers WMS layer options.
*/
/**
* @typedef {Object} GmfSnappingConfig
* @property {boolean} [activated=true] Determines whether the snapping on this layer is activated by default.
* @property {boolean} [edge=true] Determines whethers the edges of features from the node layer can be
* snapped or not.
* @property {number} [tolerance=10] The tolerance in pixels the snapping should occur for the node layer.
* @property {boolean} [vertex=true] Determines whethers the vertices of features from the node layer can be
* snapped or not.
* @property {boolean} [invertXY=false] Switches coordinates while reading a GML getFeature request
*/
/**
* @typedef {Object} GmfLayerAttributeValuesResponse
* @property {GmfLayerAttributeValue[]} items
*/
/**
* @typedef {Object} GmfLayerAttributeValue
* @property {string} label
* @property {string} value
*/
export default null;