import type { RendererJson } from "./RendererJson";
import type { LabelSymbol3DJson, TextSymbolJson } from "./SymbolJson";
/**
 * The drawingInfo object contains drawing information for a feature collection
 * or a single layer in a map service. This object is used in LayerDefinition.
 *
 * See
 * {@link https://developers.arcgis.com/web-map-specification/objects/drawingInfo/}
 * {@link https://developers.arcgis.com/web-scene-specification/objects/drawingInfo/}.
 */
export interface DrawingInfoJson {
    /**
     * Filters for PointCloud layers.
     */
    filters?: PointCloudFilterJson[] | null;
    /**
     * Only used for feature collections with a renderer. The feature's symbol
     * is defined by the layer's renderer. Not implemented in JSAPI 4.x.
     */
    fixedSymbols?: boolean | null;
    /**
     * An object defining the properties used for labeling the layer.
     */
    labelingInfo?: LabelingInfoJson[] | null;
    /**
     * A renderer object that provides the symbology for the layer.
     */
    renderer?: RendererJson | null;
    /**
     * Boolean property indicating whether symbols should stay the same size in
     * screen units as you zoom in. A value of false means the symbols stay the
     * same size in screen units regardless of the map scale. Not implemented in
     * JSAPI 4.x.
     */
    scaleSymbols?: boolean | null;
    /**
     * Defines whether labels should be shown or not. This is only valid for
     * sublayers.
     */
    showLabels?: boolean | null;
    /**
     * Number value ranging between 0 (no transparency) to 100 (completely
     * transparent).
     */
    transparency?: number | null;
}
/**
 * Filters applied to the pointCloud which will hide a point.
 *
 * See
 * {@link https://developers.arcgis.com/web-scene-specification/objects/pointCloudFilter/}.
 */
export type PointCloudFilterJson = PointCloudBitfieldFilterJson | PointCloudReturnFilterJson | PointCloudValueFilterJson;
/**
 * Filters points based on the value of the specified bitfield attribute.
 *
 * See
 * {@link https://developers.arcgis.com/web-scene-specification/objects/pointCloudBitfieldFilter/}.
 */
export interface PointCloudBitfieldFilterJson {
    /**
     * The name of the field that is used for the filter.
     */
    field?: string | null;
    /**
     * List ALL bit numbers that must cleared (=0) for the point to be kept. Bit
     * 0 is LSB.
     */
    requiredClearBits?: number[] | null;
    /**
     * List ALL bit numbers that must set (=1) for the point to be kept. Bit 0
     * is LSB.
     */
    requiredSetBits?: number[] | null;
    /**
     * Filters points based on the value of an specified attribute.
     */
    type: "pointCloudBitfieldFilter";
}
/**
 * Filters points based on the value of the return number/return count.
 *
 * See
 * {@link https://developers.arcgis.com/web-scene-specification/objects/pointCloudReturnFilter/}.
 */
export interface PointCloudReturnFilterJson {
    /**
     * The name of the field that is used for the filter.
     */
    field?: string | null;
    /**
     * All points with at least one specified return status will be kept. Status
     * values: last, firstOfMany, lastOfMany, single.
     */
    includedReturns?: string[] | null;
    /**
     * Filters points based on the value of an specified attribute.
     */
    type: "pointCloudReturnFilter";
}
/**
 * Filters points based on the value of an specified attribute.
 *
 * See
 * {@link https://developers.arcgis.com/web-scene-specification/objects/pointCloudValueFilter/}.
 */
export interface PointCloudValueFilterJson {
    /**
     * The name of the field that is used for the filter.
     */
    field?: string | null;
    /**
     * Defines if values should be included or excluded. Must be one of the
     * following values: exclude, include.
     */
    mode?: string | null;
    /**
     * Filters points based on the value of an specified attribute.
     */
    type: "pointCloudValueFilter";
    /**
     * List of values.
     */
    values?: number[] | null;
}
/**
 * The labelingInfo object specifies the label definition for a layer.
 *
 * See
 * {@link https://developers.arcgis.com/web-map-specification/objects/labelingInfo/}
 * {@link https://developers.arcgis.com/web-scene-specification/objects/labelingInfo/}.
 */
export interface LabelingInfoJson {
    /**
     * This read-only web map property allows formatting of labels. Use
     * labelExpressionInfo instead.
     */
    labelExpression?: string | null;
    /**
     * This object allows label text to be read similar to that of the
     * popupInfo's description property. See
     * {@link https://developers.arcgis.com/web-map-specification/objects/labelExpressionInfo/}
     * {@link https://developers.arcgis.com/web-scene-specification/objects/labelExpressionInfo/}.
     */
    labelExpressionInfo?: {
        /**
         * The title of the expression.
         */
        title?: string | null;
        /**
         * Represents a simple template string. This property is deprecated as
         * of version 2.7 of the web map in favor of 'expression'.
         */
        value?: string | null;
        /**
         * An Arcade expression evaluating to either a string or a number.
         */
        expression?: string | null;
    } | null;
    /**
     * This string property specifies the label placement with respect to that
     * of its feature. A list of label placement values categorized by feature
     * geometry types.
     */
    labelPlacement?: "esriServerLinePlacementAboveAfter" | "esriServerLinePlacementAboveAlong" | "esriServerLinePlacementAboveBefore" | "esriServerLinePlacementAboveEnd" | "esriServerLinePlacementAboveStart" | "esriServerLinePlacementBelowAfter" | "esriServerLinePlacementBelowAlong" | "esriServerLinePlacementBelowBefore" | "esriServerLinePlacementBelowEnd" | "esriServerLinePlacementBelowStart" | "esriServerLinePlacementCenterAfter" | "esriServerLinePlacementCenterAlong" | "esriServerLinePlacementCenterBefore" | "esriServerLinePlacementCenterEnd" | "esriServerLinePlacementCenterStart" | "esriServerPointLabelPlacementAboveCenter" | "esriServerPointLabelPlacementAboveLeft" | "esriServerPointLabelPlacementAboveRight" | "esriServerPointLabelPlacementBelowCenter" | "esriServerPointLabelPlacementBelowLeft" | "esriServerPointLabelPlacementBelowRight" | "esriServerPointLabelPlacementCenterCenter" | "esriServerPointLabelPlacementCenterLeft" | "esriServerPointLabelPlacementCenterRight" | "esriServerPolygonPlacementAlwaysHorizontal" | null;
    /**
     * Represents the maximum scale at which the layer definition will be
     * applied.
     */
    maxScale?: number | null;
    /**
     * Represents the minimum scale at which the layer definition will be
     * applied.
     */
    minScale?: number | null;
    /**
     * The name of the label class.
     */
    name?: string | null;
    /**
     * A boolean value indicating whether or not to repeat the label along or
     * across the feature. If true, the label will be repeated according to the
     * repeatLabelDistance. If missing, the default depends on the geometry of
     * the feature: false for point and polygon feature geometries, and true for
     * line feature geometries.
     */
    repeatLabel?: boolean | null;
    /**
     * The repeat label distance used when repeatLabel is true. It represents a
     * screen distance in points.
     */
    repeatLabelDistance?: number | null;
    /**
     * The text symbol used to label.
     */
    symbol?: TextSymbolJson | LabelSymbol3DJson | null;
    /**
     * Boolean value indicating whether to display the coded values for the
     * specified field name(s).
     */
    useCodedValues?: boolean | null;
    /**
     * String template used to determine which features to label.
     */
    where?: string | null;
}
