import type Color from "../../Color.js";

/**
 * Describes a theme that pairs well with the given basemaps.
 * See the table below for more details of the properties in this object.
 *
 * @since 5.0
 */
export interface Theme {
  /**
   * The Esri basemaps that pair well with the given theme.
   *
   * @since 5.0
   */
  basemaps: string[];
  /**
   * Text describing the theme in the UI.
   *
   * @since 5.0
   */
  description: string;
  /**
   * The label identifying the theme in UI elements.
   *
   * @since 5.0
   */
  label: string;
  /**
   * The name of the theme.
   *
   * @since 5.0
   */
  name: string;
}

/** @since 5.0 */
export interface SchemeOutline {
  /**
   * The outline color of the symbol.
   *
   * @since 5.0
   */
  color: Color;
  /**
   * The width of the symbol in pixels or points.
   *
   * @since 5.0
   */
  width: string | number;
}

/**
 * Properties defining the symbology scheme used to visualize point features with attribute data-driven color.
 *
 * @since 5.0
 */
export interface ColorSchemeForPoint {
  /**
   * The unique id of the color scheme to use in the visualization. The id is
   * assigned based on the following template: `<themeName>/<basemapName>/<schemeName>`.
   *
   * @since 5.0
   */
  id: string;
  /**
   * The unique name of the scheme.
   *
   * @since 5.0
   */
  name: string;
  /**
   * Tags associated with the scheme.
   *
   * @since 5.0
   */
  tags: string[];
  /**
   * Indicates which values will be emphasized in the continuous ramp and the map.
   * Possible values are listed below.
   * | Value | Description | Example |
   * | ----- | ----------- | ------- |
   * | high-to-low | High values are emphasized with strong colors. | ![high-to-low](https://developers.arcgis.com/javascript/latest/assets/img/apiref/renderers/sm-high-to-low.png) |
   * | above-and-below | Values centered around a given point (e.g. the average) are visualized with weak colors while other values are emphasized with strong colors. | ![above-and-below](https://developers.arcgis.com/javascript/latest/assets/img/apiref/renderers/sm-above-and-below.png) |
   * | centered-on | Values centered around a given point (e.g. the average) are emphasized with strong colors while other values are visualized with weak colors. | ![centered-on](https://developers.arcgis.com/javascript/latest/assets/img/apiref/renderers/sm-centered-on.png) |
   * | extremes | High and low values are emphasized with strong colors. All others are visualized with weak colors. | ![extremes](https://developers.arcgis.com/javascript/latest/assets/img/apiref/renderers/sm-extremes.png) |
   *
   * @since 5.0
   */
  theme: string;
  /**
   * The continuous color ramp that will be applied to the visualization.
   *
   * @since 5.0
   */
  colors: Color[];
  /**
   * Predefined classed color schemes to use for the visualization.
   *
   * @since 5.0
   */
  colorsForClassBreaks: ColorsForClassBreak[];
  /**
   * The color of the symbol used to indicate
   * features with no data and features that are out of range.
   *
   * @since 5.0
   */
  noDataColor: Color;
  /**
   * The opacity of the symbol.
   *
   * @since 5.0
   */
  opacity: number;
  /**
   * Properties for defining the outline of the symbol.
   *
   * @since 5.0
   */
  outline: SchemeOutline;
  /**
   * The default size of the symbol in pixels or points.
   *
   * @since 5.0
   */
  size: string | number;
}

/**
 * Properties defining the symbology scheme used to visualize polyline features with attribute data-driven color.
 *
 * @since 5.0
 */
export interface ColorSchemeForPolyline {
  /**
   * The unique id of the color scheme to use in the visualization. The id is
   * assigned based on the following template: `<themeName>/<basemapName>/<schemeName>`.
   *
   * @since 5.0
   */
  id: string;
  /**
   * The unique name of the scheme.
   *
   * @since 5.0
   */
  name: string;
  /**
   * Tags associated with the scheme.
   *
   * @since 5.0
   */
  tags: string[];
  /**
   * Indicates which values will be emphasized in the continuous ramp and the map.
   * Possible values are listed below.
   * | Value | Description | Example |
   * | ----- | ----------- | ------- |
   * | high-to-low | High values are emphasized with strong colors. | ![high-to-low](https://developers.arcgis.com/javascript/latest/assets/img/apiref/renderers/sm-high-to-low.png) |
   * | above-and-below | Values centered around a given point (e.g. the average) are visualized with weak colors while other values are emphasized with strong colors. | ![above-and-below](https://developers.arcgis.com/javascript/latest/assets/img/apiref/renderers/sm-above-and-below.png) |
   * | centered-on | Values centered around a given point (e.g. the average) are emphasized with strong colors while other values are visualized with weak colors. | ![centered-on](https://developers.arcgis.com/javascript/latest/assets/img/apiref/renderers/sm-centered-on.png) |
   * | extremes | High and low values are emphasized with strong colors. All others are visualized with weak colors. | ![extremes](https://developers.arcgis.com/javascript/latest/assets/img/apiref/renderers/sm-extremes.png) |
   *
   * @since 5.0
   */
  theme: string;
  /**
   * The continuous color ramp that will be applied to the visualization.
   *
   * @since 5.0
   */
  colors: Color[];
  /**
   * Predefined classed color schemes to use for the visualization.
   *
   * @since 5.0
   */
  colorsForClassBreaks: ColorsForClassBreak[];
  /**
   * The color of the symbol used to indicate
   * features with no data and features that are out of range.
   *
   * @since 5.0
   */
  noDataColor: Color;
  /**
   * The opacity of the symbol.
   *
   * @since 5.0
   */
  opacity: number;
  /**
   * The default width of the symbol in pixels or points.
   *
   * @since 5.0
   */
  width: string | number;
}

/**
 * Properties defining the symbology scheme used to visualize polygon features with attribute data-driven color.
 *
 * @since 5.0
 */
export interface ColorSchemeForPolygon {
  /**
   * The unique id of the color scheme to use in the visualization. The id is
   * assigned based on the following template: `<themeName>/<basemapName>/<schemeName>`.
   *
   * @since 5.0
   */
  id: string;
  /**
   * The unique name of the scheme.
   *
   * @since 5.0
   */
  name: string;
  /**
   * Tags associated with the scheme.
   *
   * @since 5.0
   */
  tags: string[];
  /**
   * Indicates which values will be emphasized in the continuous ramp and the map.
   * Possible values are listed below.
   * | Value | Description | Example |
   * | ----- | ----------- | ------- |
   * | high-to-low | High values are emphasized with strong colors. | ![high-to-low](https://developers.arcgis.com/javascript/latest/assets/img/apiref/renderers/sm-high-to-low.png) |
   * | above-and-below | Values centered around a given point (e.g. the average) are visualized with weak colors while other values are emphasized with strong colors. | ![above-and-below](https://developers.arcgis.com/javascript/latest/assets/img/apiref/renderers/sm-above-and-below.png) |
   * | centered-on | Values centered around a given point (e.g. the average) are emphasized with strong colors while other values are visualized with weak colors. | ![centered-on](https://developers.arcgis.com/javascript/latest/assets/img/apiref/renderers/sm-centered-on.png) |
   * | extremes | High and low values are emphasized with strong colors. All others are visualized with weak colors. | ![extremes](https://developers.arcgis.com/javascript/latest/assets/img/apiref/renderers/sm-extremes.png) |
   *
   * @since 5.0
   */
  theme: string;
  /**
   * The continuous color ramp that will be applied to the visualization.
   *
   * @since 5.0
   */
  colors: Color[];
  /**
   * Predefined classed color schemes to use for the visualization.
   *
   * @since 5.0
   */
  colorsForClassBreaks: ColorsForClassBreak[];
  /**
   * The color of the symbol used to indicate
   * features with no data and features that are out of range.
   *
   * @since 5.0
   */
  noDataColor: Color;
  /**
   * The opacity of the symbol.
   *
   * @since 5.0
   */
  opacity: number;
  /**
   * Properties for defining the outline of the symbol.
   *
   * @since 5.0
   */
  outline: SchemeOutline;
}

/**
 * Properties defining the symbology scheme used to visualize mesh features with attribute data-driven color.
 *
 * @since 5.0
 */
export interface ColorSchemeForMesh {
  /**
   * The unique id of the color scheme to use in the visualization. The id is
   * assigned based on the following template: `<themeName>/<basemapName>/<schemeName>`.
   *
   * @since 5.0
   */
  id: string;
  /**
   * The unique name of the scheme.
   *
   * @since 5.0
   */
  name: string;
  /**
   * Tags associated with the scheme.
   *
   * @since 5.0
   */
  tags: string[];
  /**
   * Indicates which values will be emphasized in the continuous ramp and the map.
   * Possible values are listed below.
   * | Value | Description | Example |
   * | ----- | ----------- | ------- |
   * | high-to-low | High values are emphasized with strong colors. | ![high-to-low](https://developers.arcgis.com/javascript/latest/assets/img/apiref/renderers/sm-high-to-low.png) |
   * | above-and-below | Values centered around a given point (e.g. the average) are visualized with weak colors while other values are emphasized with strong colors. | ![above-and-below](https://developers.arcgis.com/javascript/latest/assets/img/apiref/renderers/sm-above-and-below.png) |
   * | centered-on | Values centered around a given point (e.g. the average) are emphasized with strong colors while other values are visualized with weak colors. | ![centered-on](https://developers.arcgis.com/javascript/latest/assets/img/apiref/renderers/sm-centered-on.png) |
   * | extremes | High and low values are emphasized with strong colors. All others are visualized with weak colors. | ![extremes](https://developers.arcgis.com/javascript/latest/assets/img/apiref/renderers/sm-extremes.png) |
   *
   * @since 5.0
   */
  theme: string;
  /**
   * The continuous color ramp that will be applied to the visualization.
   *
   * @since 5.0
   */
  colors: Color[];
  /**
   * Predefined classed color schemes to use for the visualization.
   *
   * @since 5.0
   */
  colorsForClassBreaks: ColorsForClassBreak[];
  /**
   * The color of the symbol used to indicate
   * features with no data and features that are out of range.
   *
   * @since 5.0
   */
  noDataColor: Color;
  /**
   * The opacity of the symbol.
   *
   * @since 5.0
   */
  opacity: number;
}

/**
 * Properties defining the symbology scheme used to visualize features with attribute data-driven color.
 *
 * @since 5.0
 */
export type ColorScheme = ColorSchemeForPoint | ColorSchemeForPolyline | ColorSchemeForPolygon | ColorSchemeForMesh;

/** @since 5.0 */
export interface ColorsForClassBreak {
  /**
   * An array of hex color strings. Each color is
   * assigned to a specific break in classed color visualizations.
   *
   * @since 5.0
   */
  colors: Color[];
  /**
   * The number of classes or colors used in the ramp of discrete colors.
   *
   * @since 5.0
   */
  numClasses: number;
}

/**
 * The return object of the [getSchemes()](https://developers.arcgis.com/javascript/latest/references/core/smartMapping/symbology/color/#getSchemes) method.
 *
 * @since 5.0
 */
export interface ColorSchemes {
  /**
   * The color scheme best suited for the given basemap and geometry type.
   *
   * @since 5.0
   */
  primaryScheme: ColorScheme;
  /**
   * Additional color schemes that may be used to visualize data of the given geometry type overlaid on the given basemap.
   *
   * @since 5.0
   */
  secondarySchemes: ColorScheme[];
  /**
   * The ID of the basemap associated with the given schemes.
   *
   * @since 5.0
   */
  basemapId?: string | null;
  /**
   * Indicates whether the average basemap color is `light` or `dark`.
   *
   * @since 5.0
   */
  basemapTheme?: BasemapTheme | null;
}

/**
 * Properties defining the symbology scheme used to visualize point features driven by attribute data.
 *
 * @since 5.0
 */
export interface SizeSchemeForPoint {
  /**
   * The fill color of the marker symbol.
   *
   * @since 5.0
   */
  color: Color;
  /**
   * The color of the marker symbol used to indicate
   * features with no data and features that are out of range.
   *
   * @since 5.0
   */
  noDataColor: Color;
  /**
   * Properties for defining the outline of the marker symbol.
   *
   * @since 5.0
   */
  outline: SchemeOutline;
  /**
   * The default size of the marker symbol in pixels or points.
   *
   * @since 5.0
   */
  size: string | number;
  /**
   * The size of the marker symbol (in pixels or points) used to indicate
   * features with no data and features that are out of range.
   *
   * @since 5.0
   */
  noDataSize: string | number;
  /**
   * The minimum size of a marker symbol in pixels or points representing features
   * with low data values.
   *
   * @since 5.0
   */
  minSize: string | number;
  /**
   * The maximum size of a marker symbol in pixels or points representing features
   * with high data values.
   *
   * @since 5.0
   */
  maxSize: string | number;
  /**
   * The opacity of the marker symbol.
   *
   * @since 5.0
   */
  opacity?: number;
}

/**
 * Properties defining the symbology scheme used to visualize polyline features driven by attribute data.
 *
 * @since 5.0
 */
export interface SizeSchemeForPolyline {
  /**
   * The color of the line symbol.
   *
   * @since 5.0
   */
  color: Color;
  /**
   * The color of the line symbol used to indicate
   * features with no data and features that are out of range.
   *
   * @since 5.0
   */
  noDataColor: Color;
  /**
   * The default width of the line symbol in pixels or points.
   *
   * @since 5.0
   */
  width: string | number;
  /**
   * The width of the line symbol in pixels or points used to indicate
   * features with no data and features that are out of range.
   *
   * @since 5.0
   */
  noDataWidth: string | number;
  /**
   * The minimum width of a line symbol in pixels or points representing features
   * with low data values.
   *
   * @since 5.0
   */
  minWidth: string | number;
  /**
   * The maximum width of a line symbol in pixels or points representing features
   * with high data values.
   *
   * @since 5.0
   */
  maxWidth: string | number;
  /**
   * The opacity of the line symbol.
   *
   * @since 5.0
   */
  opacity?: number;
}

/**
 * Properties defining the symbology scheme used to visualize polygon features driven by attribute data.
 * When visualized by size, polygons are represented with marker symbols.
 *
 * @since 5.0
 */
export interface SizeSchemeForPolygon {
  /**
   * The opacity of the symbol.
   *
   * @since 5.0
   */
  opacity?: number;
  /**
   * The scheme defining the symbology of the marker symbol used to represent polygon features by size.
   *
   * @since 5.0
   */
  marker: SizeSchemeForPoint;
  /**
   * The schema defining the backgound symbol of the feature. This is a fill symbol.
   *
   * @since 5.0
   */
  background: SizeSchemeForPolygonBackground;
}

/** @since 5.0 */
export interface SizeSchemeForPolygonBackground {
  /**
   * The color of the fill symbol representing the polygon.
   *
   * @since 5.0
   */
  color: Color;
  /**
   * Properties for defining the outline of the background fill symbol.
   *
   * @since 5.0
   */
  outline: SchemeOutline;
}

/**
 * Properties defining the symbology scheme used to visualize features with attribute data-driven size.
 *
 * @since 5.0
 */
export type SizeScheme = SizeSchemeForPoint | SizeSchemeForPolyline | SizeSchemeForPolygon;

/**
 * The return object of the [getSchemes()](https://developers.arcgis.com/javascript/latest/references/core/smartMapping/symbology/size/#getSchemes) method.
 *
 * @since 5.0
 */
export interface SizeSchemes {
  /**
   * The size scheme best suited for the given basemap and geometry type.
   *
   * @since 5.0
   */
  primaryScheme: SizeScheme;
  /**
   * Additional size schemes that may be used to visualize data of the given geometry type overlaid on the given basemap.
   *
   * @since 5.0
   */
  secondarySchemes: SizeScheme[];
  /**
   * The ID of the basemap associated with the given schemes.
   *
   * @since 5.0
   */
  basemapId?: string | null;
  /**
   * Indicates whether the average basemap color is `light` or `dark`.
   *
   * @since 5.0
   */
  basemapTheme?: BasemapTheme | null;
}

/**
 * Properties defining the location-only symbology scheme used to visualize point features.
 *
 * @since 5.0
 */
export interface LocationSchemeForPoint {
  /**
   * The fill color of the marker symbol.
   *
   * @since 5.0
   */
  color: Color;
  /**
   * Properties for defining the outline of the marker symbol.
   *
   * @since 5.0
   */
  outline: SchemeOutline;
  /**
   * The size of the marker symbol in pixels or points.
   *
   * @since 5.0
   */
  size: string | number;
  /**
   * The opacity of the marker symbol.
   *
   * @since 5.0
   */
  opacity: number;
}

/**
 * Properties defining the location-only symbology scheme used to visualize polyline features.
 *
 * @since 5.0
 */
export interface LocationSchemeForPolyline {
  /**
   * The color of the line symbol.
   *
   * @since 5.0
   */
  color: Color;
  /**
   * The width of the line symbol in pixels or points.
   *
   * @since 5.0
   */
  width: string | number;
  /**
   * The opacity of the line symbol.
   *
   * @since 5.0
   */
  opacity: number;
}

/**
 * Properties defining the location-only symbology scheme used to visualize polygon features.
 *
 * @since 5.0
 */
export interface LocationSchemeForPolygon {
  /**
   * The color of the fill symbol.
   *
   * @since 5.0
   */
  color: Color;
  /**
   * Properties for defining the outline of the fill symbol.
   *
   * @since 5.0
   */
  outline: SchemeOutline;
  /**
   * The opacity of the fill symbol.
   *
   * @since 5.0
   */
  opacity: number;
}

/**
 * Properties defining the location-only symbology scheme used to visualize mesh features.
 *
 * @since 5.0
 */
export interface LocationSchemeForMesh {
  /**
   * The color of the fill symbol.
   *
   * @since 5.0
   */
  color: Color;
  /**
   * The opacity of the fill symbol.
   *
   * @since 5.0
   */
  opacity: number;
}

/**
 * Defines the symbology scheme used to visualize default location-based symbols depending on the layer's geometry type.
 *
 * @since 5.0
 */
export type LocationScheme = LocationSchemeForPoint | LocationSchemeForPolyline | LocationSchemeForPolygon | LocationSchemeForMesh;

/**
 * The return object of the [getSchemes()](https://developers.arcgis.com/javascript/latest/references/core/smartMapping/symbology/location/#getSchemes) method.
 *
 * @since 5.0
 */
export interface LocationSchemes {
  /**
   * The location scheme best suited for the given basemap and geometry type.
   *
   * @since 5.0
   */
  primaryScheme: LocationScheme;
  /**
   * Additional location schemes that may be used to visualize data of the given geometry type overlaid on the given basemap.
   *
   * @since 5.0
   */
  secondarySchemes: LocationScheme[];
  /**
   * The ID of the basemap associated with the given schemes.
   *
   * @since 5.0
   */
  basemapId?: string | null;
  /**
   * Indicates whether the average basemap color is `light` or `dark`.
   *
   * @since 5.0
   */
  basemapTheme?: BasemapTheme | null;
}

/**
 * Properties defining the symbology scheme used to visualize point features driven by type-based attribute data.
 *
 * @since 5.0
 */
export interface TypeSchemeForPoint {
  /**
   * The unique name of the scheme.
   *
   * @since 5.0
   */
  name: string;
  /**
   * Tags associated with the scheme.
   *
   * @since 5.0
   */
  tags: string[];
  /**
   * The theme.
   *
   * @since 5.0
   */
  theme: string;
  /**
   * The fill colors of the point symbols comprising the theme.
   *
   * @since 5.0
   */
  colors: Color[];
  /**
   * The color of the point symbol used to indicate
   * features with no data.
   *
   * @since 5.0
   */
  noDataColor: Color;
  /**
   * The opacity of the point symbol.
   *
   * @since 5.0
   */
  opacity: number;
  /**
   * Properties for defining the outline of the marker symbol.
   *
   * @since 5.0
   */
  outline: SchemeOutline;
  /**
   * The default size of the point symbol in pixels, points, or real-world units.
   *
   * @since 5.0
   */
  size: string | number;
}

/**
 * Properties defining the symbology scheme used to visualize polyline features driven by type-based attribute data.
 *
 * @since 5.0
 */
export interface TypeSchemeForPolyline {
  /**
   * The unique name of the scheme.
   *
   * @since 5.0
   */
  name: string;
  /**
   * Tags associated with the scheme.
   *
   * @since 5.0
   */
  tags: string[];
  /**
   * The theme.
   *
   * @since 5.0
   */
  theme: string;
  /**
   * The colors of the line symbols comprising the theme.
   *
   * @since 5.0
   */
  colors: Color[];
  /**
   * The color of the line symbol used to indicate
   * features with no data and features that are out of range.
   *
   * @since 5.0
   */
  noDataColor: Color;
  /**
   * The opacity of the line symbol (0 - 1).
   *
   * @since 5.0
   */
  opacity: number;
  /**
   * The default width of the line symbol in pixels or points.
   *
   * @since 5.0
   */
  width: string | number;
}

/**
 * Properties defining the symbology scheme used to visualize polygon features driven by type-based attribute data.
 *
 * @since 5.0
 */
export interface TypeSchemeForPolygon {
  /**
   * The unique name of the scheme.
   *
   * @since 5.0
   */
  name: string;
  /**
   * Tags associated with the scheme.
   *
   * @since 5.0
   */
  tags: string[];
  /**
   * The theme.
   *
   * @since 5.0
   */
  theme: string;
  /**
   * The fill colors of the symbols comprising the theme.
   *
   * @since 5.0
   */
  colors: Color[];
  /**
   * The color of the fill symbol used to indicate
   * features with no data.
   *
   * @since 5.0
   */
  noDataColor: Color;
  /**
   * The opacity of the symbol (0 - 1).
   *
   * @since 5.0
   */
  opacity: number;
  /**
   * Properties for defining the outline of the fill symbol.
   *
   * @since 5.0
   */
  outline: SchemeOutline;
}

/**
 * Properties defining the symbology scheme used to visualize mesh features driven by type-based attribute data.
 *
 * @since 5.0
 */
export interface TypeSchemeForMesh {
  /**
   * The unique name of the scheme.
   *
   * @since 5.0
   */
  name: string;
  /**
   * Tags associated with the scheme.
   *
   * @since 5.0
   */
  tags: string[];
  /**
   * The theme.
   *
   * @since 5.0
   */
  theme: string;
  /**
   * The fill colors of the symbols comprising the theme.
   *
   * @since 5.0
   */
  colors: Color[];
  /**
   * The color of the fill symbol used to indicate
   * features with no data.
   *
   * @since 5.0
   */
  noDataColor: Color;
  /**
   * The opacity of the symbol (0 - 1).
   *
   * @since 5.0
   */
  opacity: number;
}

/**
 * Properties defining the symbology scheme used to visualize point clouds.
 *
 * @since 5.0
 */
export interface PointCloudClassScheme {
  /**
   * The unique name of the scheme.
   *
   * @since 5.0
   */
  name: string;
  /**
   * Tags associated with the scheme.
   *
   * @since 5.0
   */
  tags: string[];
  /**
   * The theme.
   *
   * @since 5.0
   */
  theme: string;
  /**
   * The fill colors of the point symbols comprising the theme.
   *
   * @since 5.0
   */
  colors: Color[];
}

/** @since 5.0 */
export type TypeSchemeForGeometry = TypeSchemeForPoint | TypeSchemeForPolyline | TypeSchemeForPolygon | TypeSchemeForMesh;

/**
 * Properties defining the symbology scheme used to visualize features with attribute data-driven types.
 *
 * @since 5.0
 */
export type TypeScheme = TypeSchemeForGeometry | PointCloudClassScheme;

/**
 * The return object of the [getSchemes()](https://developers.arcgis.com/javascript/latest/references/core/smartMapping/symbology/type/#getSchemes) method.
 *
 * @since 5.0
 */
export interface TypeSchemes {
  /**
   * The type scheme best suited for the given basemap and geometry type.
   *
   * @since 5.0
   */
  primaryScheme: TypeScheme;
  /**
   * Additional type schemes that may be used to visualize data of the given geometry type overlaid on the given basemap.
   *
   * @since 5.0
   */
  secondarySchemes: TypeScheme[];
  /**
   * The ID of the basemap associated with the given schemes.
   *
   * @since 5.0
   */
  basemapId?: string | null;
  /**
   * Indicates whether the average basemap color is `light` or `dark`.
   *
   * @since 5.0
   */
  basemapTheme?: BasemapTheme | null;
}

/**
 * Properties defining the symbology scheme used to visualize point features as a heatmap.
 *
 * @since 5.0
 */
export interface HeatmapScheme {
  /**
   * The unique id of the color scheme to usee in the visualization. The id is
   *   assigned based on the following template: `<themeName>/<basemapName>/<schemeName>`.
   *
   * @since 5.0
   */
  id: string;
  /**
   * The unique name of the scheme.
   *
   * @since 5.0
   */
  name: string;
  /**
   * Tags associated with the scheme.
   *
   * @since 5.0
   */
  tags: string[];
  /**
   * A continuous color ramp used to construct a heatmap.
   *
   * @since 5.0
   */
  colors: Color[];
  /**
   * The opacity of the heatmap.
   *
   * @since 5.0
   */
  opacity: number;
}

/**
 * The return object of the [getSchemes()](https://developers.arcgis.com/javascript/latest/references/core/smartMapping/symbology/heatmap/#getSchemes) method.
 *
 * @since 5.0
 */
export interface HeatmapSchemes {
  /**
   * The heatmap color scheme best suited for the given basemap and geometry type.
   *
   * @since 5.0
   */
  primaryScheme: HeatmapScheme;
  /**
   * Additional heatmap color schemes that may be used to visualize data overlaid on the given basemap.
   *
   * @since 5.0
   */
  secondarySchemes: HeatmapScheme[];
  /**
   * The ID of the basemap associated with the given schemes.
   *
   * @since 5.0
   */
  basemapId?: string | null;
  /**
   * Indicates whether the average basemap color is `light` or `dark`.
   *
   * @since 5.0
   */
  basemapTheme?: BasemapTheme | null;
}

/**
 * Properties defining the symbology scheme used to visualize predominance for point features.
 *
 * @since 5.0
 */
export interface PredominanceSchemeForPoint {
  /**
   * The unique name of the scheme.
   *
   * @since 5.0
   */
  name: string;
  /**
   * Tags associated with the scheme.
   *
   * @since 5.0
   */
  tags: string[];
  /**
   * The fill colors of the point symbols used for each category.
   *
   * @since 5.0
   */
  colors: Color[];
  /**
   * The color of the point symbol used to indicate
   *   features with no data.
   *
   * @since 5.0
   */
  noDataColor: Color;
  /**
   * The opacity of the point symbol (0 - 1).
   *
   * @since 5.0
   */
  opacity: number;
  /**
   * The scheme defining the size visual variable if included in a predominance visualization.
   *
   * @since 5.0
   */
  sizeScheme: SizeSchemeForPoint;
  /**
   * Properties for defining the outline of the marker symbol.
   *
   * @since 5.0
   */
  outline: SchemeOutline;
}

/**
 * Properties defining the symbology scheme used to visualize predominance for polyline features.
 *
 * @since 5.0
 */
export interface PredominanceSchemeForPolyline {
  /**
   * The unique name of the scheme.
   *
   * @since 5.0
   */
  name: string;
  /**
   * Tags associated with the scheme.
   *
   * @since 5.0
   */
  tags: string[];
  /**
   * The colors of the line symbols used for each category.
   *
   * @since 5.0
   */
  colors: Color[];
  /**
   * The color of the line symbol used to indicate
   *   features with no data and features that are out of range.
   *
   * @since 5.0
   */
  noDataColor: Color;
  /**
   * The opacity of the line symbol (0 - 1).
   *
   * @since 5.0
   */
  opacity: number;
  /**
   * The scheme defining the size visual variable if included in a predominance visualization.
   *
   * @since 5.0
   */
  sizeScheme: SizeSchemeForPolyline;
  /**
   * The default width of the line symbol in pixels or points.
   *
   * @since 5.0
   */
  width: string | number;
}

/**
 * Properties defining the symbology scheme used to visualize predominance for polygon features.
 *
 * @since 5.0
 */
export interface PredominanceSchemeForPolygon {
  /**
   * The unique name of the scheme.
   *
   * @since 5.0
   */
  name: string;
  /**
   * Tags associated with the scheme.
   *
   * @since 5.0
   */
  tags: string[];
  /**
   * The fill colors of the polygon symbols used for each category.
   *
   * @since 5.0
   */
  colors: Color[];
  /**
   * The color of the fill symbol used to indicate
   *   features with no data.
   *
   * @since 5.0
   */
  noDataColor: Color;
  /**
   * The opacity of the symbol (0 - 1).
   *
   * @since 5.0
   */
  opacity: number;
  /**
   * The scheme defining the size visual variable if included in a predominance visualization.
   *
   * @since 5.0
   */
  sizeScheme: SizeSchemeForPolygon;
  /**
   * Properties for defining the outline of the fill symbol.
   *
   * @since 5.0
   */
  outline: SchemeOutline;
}

/**
 * Properties defining the symbology scheme used to visualize predominance for mesh features.
 *
 * @since 5.0
 */
export interface PredominanceSchemeForMesh {
  /**
   * The unique name of the scheme.
   *
   * @since 5.0
   */
  name: string;
  /**
   * Tags associated with the scheme.
   *
   * @since 5.0
   */
  tags: string[];
  /**
   * The fill colors of the mesh symbols used for each category.
   *
   * @since 5.0
   */
  colors: Color[];
  /**
   * The color of the fill symbol used to indicate
   *   features with no data.
   *
   * @since 5.0
   */
  noDataColor: Color;
  /**
   * The opacity of the symbol (0 - 1).
   *
   * @since 5.0
   */
  opacity: number;
}

/**
 * Defines the symbology scheme used to visualize predominance based on the layer's geometry type.
 *
 * @since 5.0
 */
export type PredominanceScheme = PredominanceSchemeForPoint | PredominanceSchemeForPolyline | PredominanceSchemeForPolygon | PredominanceSchemeForMesh;

/**
 * The return object of the [getSchemes()](https://developers.arcgis.com/javascript/latest/references/core/smartMapping/symbology/predominance/#getSchemes) method.
 *
 * @since 5.0
 */
export interface PredominanceSchemes {
  /**
   * The predominance scheme best suited for the given basemap and geometry type.
   *
   * @since 5.0
   */
  primaryScheme: PredominanceScheme;
  /**
   * Additional predominance schemes that may be used to visualize data of the given geometry type overlaid on the given basemap.
   *
   * @since 5.0
   */
  secondarySchemes: PredominanceScheme[];
  /**
   * The ID of the basemap associated with the given schemes.
   *
   * @since 5.0
   */
  basemapId?: string | null;
  /**
   * Indicates whether the average basemap color is `light` or `dark`.
   *
   * @since 5.0
   */
  basemapTheme?: BasemapTheme | null;
}

/**
 * Properties defining the symbology scheme used to visualize relationship renderers (bivariate color) for point features.
 *
 * @since 5.0
 */
export interface RelationshipSchemeForPoint {
  /**
   * The ID uniquely identifying the color scheme.
   *
   * @since 5.0
   */
  id: string;
  /**
   * The unique name of the scheme.
   *
   * @since 5.0
   */
  name: string;
  /**
   * Tags associated with the scheme.
   *
   * @since 5.0
   */
  tags: string[];
  /**
   * Defines the colors to use in each bin of the relationship visualization.
   *
   * @since 5.0
   */
  colorsForClassBreaks: RelationshipColorsForClassBreak[];
  /**
   * The color of the point symbol used to indicate
   *   features with no data.
   *
   * @since 5.0
   */
  noDataColor: Color;
  /**
   * The opacity of the point symbol (0 - 1).
   *
   * @since 5.0
   */
  opacity: number;
  /**
   * Properties for defining the outline of the marker symbol.
   *
   * @since 5.0
   */
  outline: SchemeOutline;
  /**
   * The size of the point symbol in points.
   *
   * @since 5.0
   */
  size: string | number;
}

/**
 * Properties defining the symbology scheme used to visualize relationship renderers (bivariate color) for polyline features.
 *
 * @since 5.0
 */
export interface RelationshipSchemeForPolyline {
  /**
   * The ID uniquely identifying the color scheme.
   *
   * @since 5.0
   */
  id: string;
  /**
   * The unique name of the scheme.
   *
   * @since 5.0
   */
  name: string;
  /**
   * Tags associated with the scheme.
   *
   * @since 5.0
   */
  tags: string[];
  /**
   * Defines the colors to use in each bin of the relationship visualization.
   *
   * @since 5.0
   */
  colorsForClassBreaks: RelationshipColorsForClassBreak[];
  /**
   * The color of the line symbol used to indicate
   *   features with no data.
   *
   * @since 5.0
   */
  noDataColor: Color;
  /**
   * The opacity of the line symbol (0 - 1).
   *
   * @since 5.0
   */
  opacity: number;
  /**
   * The width of the line symbol in points.
   *
   * @since 5.0
   */
  width: string | number;
}

/**
 * Properties defining the symbology scheme used to visualize relationship renderers (bivariate color) for polygon features.
 *
 * @since 5.0
 */
export interface RelationshipSchemeForPolygon {
  /**
   * The ID uniquely identifying the color scheme.
   *
   * @since 5.0
   */
  id: string;
  /**
   * The unique name of the scheme.
   *
   * @since 5.0
   */
  name: string;
  /**
   * Tags associated with the scheme.
   *
   * @since 5.0
   */
  tags: string[];
  /**
   * Defines the colors to use in each bin of the relationship visualization.
   *
   * @since 5.0
   */
  colorsForClassBreaks: RelationshipColorsForClassBreak[];
  /**
   * The color of the fill symbol used to indicate
   *   features with no data.
   *
   * @since 5.0
   */
  noDataColor: Color;
  /**
   * The opacity of the fill symbol (0 - 1).
   *
   * @since 5.0
   */
  opacity: number;
  /**
   * Properties for defining the outline of the fill symbol.
   *
   * @since 5.0
   */
  outline: SchemeOutline;
}

/**
 * Properties defining the symbology scheme used to visualize relationship renderers (bivariate color) for mesh features.
 *
 * @since 5.0
 */
export interface RelationshipSchemeForMesh {
  /**
   * The ID uniquely identifying the color scheme.
   *
   * @since 5.0
   */
  id: string;
  /**
   * The unique name of the scheme.
   *
   * @since 5.0
   */
  name: string;
  /**
   * Tags associated with the scheme.
   *
   * @since 5.0
   */
  tags: string[];
  /**
   * Defines the colors to use in each bin of the relationship visualization.
   *
   * @since 5.0
   */
  colorsForClassBreaks: RelationshipColorsForClassBreak[];
  /**
   * The color of the fill symbol used to indicate
   *   features with no data.
   *
   * @since 5.0
   */
  noDataColor: Color;
  /**
   * The opacity of the fill symbol (0 - 1).
   *
   * @since 5.0
   */
  opacity: number;
}

/**
 * Defines the symbology scheme used to visualize relationship renderers (bivariate color) based on the layer's geometry type.
 *
 * @since 5.0
 */
export type RelationshipScheme = RelationshipSchemeForPoint | RelationshipSchemeForPolyline | RelationshipSchemeForPolygon | RelationshipSchemeForMesh;

/** @since 5.0 */
export interface RelationshipColorsForClassBreak {
  /**
   * The fill colors of the symbols used for each bin in the relationship visualization.
   *
   * @since 5.0
   */
  colors: Color[][];
  /**
   * The number of breaks (rows/columns) for each variable in the relationship visualization.
   *
   * @since 5.0
   */
  numClasses: number;
}

/**
 * The return object of the [getSchemes()](https://developers.arcgis.com/javascript/latest/references/core/smartMapping/symbology/relationship/#getSchemes) method.
 *
 * @since 5.0
 */
export interface RelationshipSchemes {
  /**
   * The relationship scheme best suited for the given basemap and geometry type.
   *
   * @since 5.0
   */
  primaryScheme: RelationshipScheme;
  /**
   * Additional relationship schemes that may be used to visualize data of the given geometry type overlaid on the given basemap.
   *
   * @since 5.0
   */
  secondarySchemes: RelationshipScheme[];
  /**
   * The ID of the basemap associated with the given schemes.
   *
   * @since 5.0
   */
  basemapId?: string | null;
  /**
   * Indicates whether the average basemap color is `light` or `dark`.
   *
   * @since 5.0
   */
  basemapTheme?: BasemapTheme | null;
}

/**
 * Properties defining the symbology scheme used to visualize predominance for polygon features.
 *
 * @since 5.0
 */
export interface DotDensityScheme {
  /**
   * The unique name of the scheme.
   *
   * @since 5.0
   */
  name: string;
  /**
   * Tags associated with the scheme.
   *
   * @since 5.0
   */
  tags: string[];
  /**
   * The dot color for each attribute.
   *
   * @since 5.0
   */
  colors: Color[];
  /**
   * The opacity of the symbol (0 - 1).
   *
   * @since 5.0
   */
  opacity: number;
  /**
   * Properties for defining the outline of the symbol.
   *
   * @since 5.0
   */
  outline: SchemeOutline;
}

/**
 * The return object of the [getSchemes()](https://developers.arcgis.com/javascript/latest/references/core/smartMapping/symbology/dotDensity/#getSchemes) method.
 *
 * @since 5.0
 */
export interface DotDensitySchemes {
  /**
   * The dot density scheme best suited for the given basemap and geometry type.
   *
   * @since 5.0
   */
  primaryScheme: DotDensityScheme;
  /**
   * Additional dot density schemes that may be used to visualize data of the given geometry type overlaid on the given basemap.
   *
   * @since 5.0
   */
  secondarySchemes: DotDensityScheme[];
  /**
   * The ID of the basemap associated with the given schemes.
   *
   * @since 5.0
   */
  basemapId?: string | null;
  /**
   * Indicates whether the average basemap color is `light` or `dark`.
   *
   * @since 5.0
   */
  basemapTheme?: BasemapTheme | null;
}

/**
 * Properties defining the colors and schemes used to visualize pie charts.
 *
 * @since 5.0
 */
export interface PieChartScheme {
  /**
   * The unique name of the color scheme.
   *
   * @since 5.0
   */
  name: string;
  /**
   * Tags associated with the color scheme.
   *
   * @since 5.0
   */
  tags: string[];
  /**
   * The colors used to visualize pie slices in the chart.
   *
   * @since 5.0
   */
  colors: Color[];
  /**
   * The color of the "others" category.
   *
   * @since 5.0
   */
  colorForOthersCategory: Color;
  /**
   * The scheme defining the size visual variable used to vary chart size per feature.
   *
   * @since 5.0
   */
  sizeScheme?: SizeScheme | null;
  /**
   * Properties for defining the outline of the pie chart.
   *
   * @since 5.0
   */
  outline: SchemeOutline;
  /**
   * The default size of the pie charts in points or pixels.
   *
   * @since 5.0
   */
  size: string | number;
}

/**
 * The return object of the [getSchemes()](https://developers.arcgis.com/javascript/latest/references/core/smartMapping/symbology/pieChart/#getSchemes) method.
 *
 * @since 5.0
 */
export interface PieChartSchemes {
  /**
   * The suggest default chart scheme based on the given basemap.
   *
   * @since 5.0
   */
  primaryScheme: PieChartScheme;
  /**
   * Additional chart schemes that may be used to visualize data overlaid on the given basemap.
   *
   * @since 5.0
   */
  secondarySchemes: PieChartScheme[];
  /**
   * The ID of the basemap associated with the given schemes.
   *
   * @since 5.0
   */
  basemapId?: string | null;
  /**
   * Indicates whether the average basemap color is `light` or `dark`.
   *
   * @since 5.0
   */
  basemapTheme?: BasemapTheme | null;
}

/**
 * Suggested property values for defining the scheme used to visualize flow lines.
 *
 * @since 5.0
 */
export interface FlowScheme {
  /**
   * The unique id of the color scheme to use in the visualization. The id is
   * assigned based on the following template: `<themeName>/<basemapName>/<schemeName>`.
   *
   * @since 5.0
   */
  id: string;
  /**
   * The unique name of the scheme.
   *
   * @since 5.0
   */
  name: string;
  /**
   * Tags associated with the scheme.
   *
   * @since 5.0
   */
  tags: string[];
  /**
   * Determines how flow lines will render.
   *   Possible values are listed below.
   * | Value | Description | Example |
   * | ----- | ----------- | ------- |
   * | flow-line | Renders the uv and magnitude data as animated flow lines. This is ideal for representing wind and other atmospheric data. | ![flow-line](https://developers.arcgis.com/javascript/latest/assets/img/apiref/renderers/animated-flow/sm-flow-line-2.gif) |
   * | wave-front | Renders UV and magnitude data in a wave-like animation. This theme works well for ocean data. | ![above](https://developers.arcgis.com/javascript/latest/assets/img/apiref/renderers/animated-flow/sm-wave-front-2.gif) |
   *
   * > [!WARNING]
   * >
   * > **Known Limitations**
   * >
   * > The `wave-front` flow theme is not supported in 3D [SceneView](https://developers.arcgis.com/javascript/latest/references/core/views/SceneView/).
   *
   * @since 5.0
   */
  theme: "flow-line" | "wave-front";
  /**
   * The suggested color of the flow lines if a color visual variable is not desired.
   *
   * @since 5.0
   */
  color: Color;
  /**
   * The suggested colors to use if a
   *   [ColorVariable](https://developers.arcgis.com/javascript/latest/references/core/renderers/visualVariables/ColorVariable/) is set on the flow renderer.
   *
   * @since 5.0
   */
  colors: Color[];
  /**
   * The suggested [FlowRenderer.density](https://developers.arcgis.com/javascript/latest/references/core/renderers/FlowRenderer/#density) of the streamlines.
   *
   * @since 5.0
   */
  density: number;
  /**
   * The suggested [FlowRenderer.flowSpeed](https://developers.arcgis.com/javascript/latest/references/core/renderers/FlowRenderer/#flowSpeed) of the streamlines.
   *
   * @since 5.0
   */
  flowSpeed: number;
  /**
   * The suggested [length](https://developers.arcgis.com/javascript/latest/references/core/renderers/FlowRenderer/#trailLength) of the streamlines.
   *
   * @since 5.0
   */
  trailLength: number;
  /**
   * The suggested [width](https://developers.arcgis.com/javascript/latest/references/core/renderers/FlowRenderer/#trailWidth) of the streamlines.
   *
   * @since 5.0
   */
  trailWidth: number;
  /**
   * The suggested [cap style](https://developers.arcgis.com/javascript/latest/references/core/renderers/FlowRenderer/#trailCap) of the streamlines.
   *
   * > [!WARNING]
   * >
   * > **Known Limitations**
   * >
   * > The `round` trail cap is not supported in 3D [SceneView](https://developers.arcgis.com/javascript/latest/references/core/views/SceneView/).
   *
   * @since 5.0
   */
  trailCap: "butt" | "round";
  /**
   * The suggested [ImageryTileLayer.effect](https://developers.arcgis.com/javascript/latest/references/core/layers/ImageryTileLayer/#effect) to apply to the input layer.
   *
   * > [!WARNING]
   * >
   * > **Known Limitations**
   * >
   * > The layer effects are not supported in 3D [SceneView](https://developers.arcgis.com/javascript/latest/references/core/views/SceneView/).
   *
   * @since 5.0
   */
  layerEffect: string;
  /**
   * The suggested size to apply to small magnitude values if a
   *   [SizeVariable](https://developers.arcgis.com/javascript/latest/references/core/renderers/visualVariables/SizeVariable/) is set on the flow renderer.
   *
   * @since 5.0
   */
  minSize: number;
  /**
   * The suggested size to apply to large magnitude values if a
   *   [SizeVariable](https://developers.arcgis.com/javascript/latest/references/core/renderers/visualVariables/SizeVariable/) is set on the flow renderer.
   *
   * @since 5.0
   */
  maxSize: number;
  /**
   * The suggested opacity to apply to small magnitude values if an
   *   [OpacityVariable](https://developers.arcgis.com/javascript/latest/references/core/renderers/visualVariables/OpacityVariable/) is set on the flow renderer.
   *
   * @since 5.0
   */
  minOpacity: number;
  /**
   * The suggested opacity to apply to large magnitude values if an
   *   [OpacityVariable](https://developers.arcgis.com/javascript/latest/references/core/renderers/visualVariables/OpacityVariable/) is set on the flow renderer.
   *
   * @since 5.0
   */
  maxOpacity: number;
}

/**
 * The return object of the [getSchemes()](https://developers.arcgis.com/javascript/latest/references/core/smartMapping/symbology/flow/#getSchemes) method.
 *
 * @since 5.0
 */
export interface FlowSchemes {
  /**
   * The flow scheme best suited for the given basemap.
   *
   * @since 5.0
   */
  primaryScheme: FlowScheme;
  /**
   * Additional flow schemes that may be used to visualize streamlines overlaid on the given basemap or basemap theme.
   *
   * @since 5.0
   */
  secondarySchemes: FlowScheme[];
  /**
   * The ID of the basemap associated with the given schemes.
   *
   * @since 5.0
   */
  basemapId?: string | null;
  /**
   * Indicates whether the average basemap color is `light` or `dark`.
   *
   * @since 5.0
   */
  basemapTheme?: BasemapTheme | null;
}

/** @since 5.0 */
export type BasemapTheme = "light" | "dark";

/**
 * Defines a ramp of colors to use for visualizing data in a chart, [Renderer](https://developers.arcgis.com/javascript/latest/references/core/renderers/Renderer/), or [ColorVariable](https://developers.arcgis.com/javascript/latest/references/core/renderers/visualVariables/ColorVariable/).
 *
 * @since 5.0
 */
export interface ColorRamp {
  /**
   * The unique name of the color ramp.
   *
   * @since 5.0
   */
  name: string;
  /**
   * Tags associated with the color ramp.
   *
   * @since 5.0
   */
  tags: string[];
  /**
   * An array of five colors intended for displaying a continuous color ramp.
   *
   * @since 5.0
   */
  colors: Color[];
  /**
   * Contains an array of ramps ranging in size from 1 color to 10 colors. All ramps are part of the same color
   *   scheme, but provide a different number of colors depending on the requirements of the ramp needed for the visualization.
   *
   * @since 5.0
   */
  colorsForClassBreaks: ColorsForClassBreak[];
}