import type { BuildingSceneSublayerJson } from "./BuildingSceneSublayerJson.js";
import type { LayerDefinitionJson } from "./LayerDefinitionJson.js";
import type { OperationalLayerJsonBase } from "./OperationalLayerJson.js";
import type { EdgesJson } from "./SymbolJson.js";
/**
 * The BuildingSceneLayer is a layer type designed for on-demand streaming and
 * displaying building data.
 */
export interface BuildingSceneLayerJson extends OperationalLayerJsonBase {
    /**
     * Specifies the id of the currently active filter.
     */
    activeFilterId?: string | null;
    /**
     * A list of filters available for this layer. Overrides filters defined on
     * the service.
     */
    filters?: FilterJson[] | null;
    /**
     * Optional string containing the item ID of the service if it's registered
     * on ArcGIS Online or your organization's portal.
     */
    itemId?: string | null;
    /**
     * Additional properties that can define an elevation offset for the layer.
     */
    layerDefinition?: LayerDefinitionJson | null;
    /**
     * The type of layer.
     */
    layerType: "BuildingSceneLayer";
    /**
     * The URL to the service.
     */
    url?: string | null;
    /**
     * An array of objects specifying overrides for building scene layer
     * sublayers.
     */
    sublayers?: BuildingSceneSublayerJson[] | null;
}
/**
 * Filter allows client applications to reduce the drawn elements of a building
 * to specific types and values. Filters on the webscene override the list of
 * existing filters on the service.
 */
export interface FilterJson {
    /**
     * Description of the filter.
     */
    description?: string | null;
    /**
     * Metadata about the authoring process for this filter.
     */
    filterAuthoringInfo?: FilterAuthoringInfoCheckboxJson | null;
    /**
     * Array of filter blocks defining the filter. A filter contains at least
     * one filter block.
     */
    filterBlocks: FilterBlockJson[];
    /**
     * Unique filter id (uuid). Either a new id to extend the list of filters,
     * or an existing id to override properties of an existing filter.
     */
    id?: string | null;
    /**
     * Name of the filter.
     */
    name?: string | null;
}
/**
 * Client UI with checkbox representation for each filter type and filter value.
 */
export interface FilterAuthoringInfoCheckboxJson {
    /**
     * Type of filter authoring info. Value of this property must be checkbox.
     */
    type: "checkbox";
    /**
     * Array of filter block authoring infos.
     */
    filterBlocks?: AuthoringInfoFilterBlockJson[] | null;
}
/**
 * A filter block defines what elements will be filtered with a specific filter
 * mode. To ensure performance on client applications, it is not recommended to
 * declare multiple filter blocks with the same filter mode. Filter blocks are
 * contained in a filter for a building scene layer. Each filter includes at
 * least one filter block.
 */
export interface FilterBlockJson {
    /**
     * SQL expression to select features that belong to this filter block.
     */
    filterExpression?: string | null;
    /**
     * Filter mode defines how features are drawn. For example, the filter mode
     * of a filter can be solid or wire frame.
     */
    filterMode?: FilterModeJson | null;
    /**
     * Title of the filter block.
     */
    title?: string | null;
}
/**
 * Filter mode represents the way elements draw when participating in a filter
 * block.
 */
export type FilterModeJson = FilterModeSolidJson | FilterModeWireFrameJson;
/**
 * Draw elements of this filter block in solid mode. This mode does not change
 * the display of features.
 */
export interface FilterModeSolidJson {
    /**
     * Declares filter mode of type solid. Value of this property must be solid.
     */
    type: "solid";
}
/**
 * Draw elements of this filter block in wireframe mode. This mode draws only
 * the edges of the features with the specified edge style.
 */
export interface FilterModeWireFrameJson {
    /**
     * Declares filter mode of type wire frame. Value of this property must be
     * wireFrame.
     */
    type: "wireFrame";
    /**
     * A size in points by which to extend edges beyond their original end
     * points.
     */
    edges?: EdgesJson | null;
}
/**
 * The filter authoring info object contains metadata about the authoring
 * process for creating a filter block object. This allows the authoring client
 * to save specific, overridable settings. The next time it is accessed via an
 * authoring client, their selections are remembered. Non-authoring clients can
 * ignore it.
 */
export interface AuthoringInfoFilterBlockJson {
    /**
     * Array of defined filter types. Each filter type has an array of filter
     * values.
     */
    filterTypes?: AuthoringInfoFilterTypeJson[] | null;
}
/**
 * The file authoring information for a filter, including the filter type and
 * its value settings.
 */
export interface AuthoringInfoFilterTypeJson {
    /**
     * Represents the filter type name. Name is a unique identifier.
     */
    filterType?: string | null;
    /**
     * Array of filter values. Filter values are the attributes that can be
     * stored for individual fields in a layer.
     */
    filterValues?: string[] | null;
}
