import type AuthoringInfoFieldInfo from "./AuthoringInfoFieldInfo.js";
import type AuthoringInfoVisualVariable from "./AuthoringInfoVisualVariable.js";
import type ColorRamp from "../../rest/support/ColorRamp.js";
import type { JSONSupport } from "../../core/JSONSupport.js";
import type { RelationshipNumClasses } from "../types.js";
import type { AuthoringInfoTypes, AuthoringInfoLengthUnits, UnivariateTheme, FlowTheme, UnivariateSymbolStyle, AuthoringInfoClassificationMethods, RelationshipFocus, AuthoringInfoStatistics, StandardDeviationInterval } from "./types.js";
import type { ColorRampProperties } from "../../rest/support/ColorRamp.js";
import type { AuthoringInfoFieldInfoProperties } from "./AuthoringInfoFieldInfo.js";
import type { AuthoringInfoVisualVariableProperties } from "./AuthoringInfoVisualVariable.js";

export interface AuthoringInfoProperties extends Partial<Pick<AuthoringInfo, "classificationMethod" | "fadeRatio" | "fields" | "flowTheme" | "focus" | "isAutoGenerated" | "lengthUnit" | "maxSliderValue" | "minSliderValue" | "numClasses" | "standardDeviationInterval" | "type" | "univariateSymbolStyle" | "univariateTheme">> {
  /** Indicates the color ramp was used to create the symbols for Unique Value or Class Breaks renderer for Imagery Layer. */
  colorRamp?: ColorRampProperties | null;
  /**
   * A numeric field used for generating a [relationship renderer](https://developers.arcgis.com/javascript/latest/references/core/smartMapping/renderers/relationship/)
   * along with [field2](https://developers.arcgis.com/javascript/latest/references/core/renderers/support/AuthoringInfo/#field2). In the default visualization,
   *   the values of this field are rendered along the vertical axis of the [Legend](https://developers.arcgis.com/javascript/latest/references/map-components/components/arcgis-legend/).
   */
  field1?: AuthoringInfoFieldInfoProperties | null;
  /**
   * A numeric field used for generating a [relationship renderer](https://developers.arcgis.com/javascript/latest/references/core/smartMapping/renderers/relationship/)
   * along with [field1](https://developers.arcgis.com/javascript/latest/references/core/renderers/support/AuthoringInfo/#field1). In the default visualization,
   *   the values of this field are rendered along the horizontal axis of the [Legend](https://developers.arcgis.com/javascript/latest/references/map-components/components/arcgis-legend/).
   */
  field2?: AuthoringInfoFieldInfoProperties | null;
  /**
   * Only for renderers of type `univariate-color-size` with an `above-and-below` [univariateTheme](https://developers.arcgis.com/javascript/latest/references/core/renderers/support/AuthoringInfo/#univariateTheme). Contains summary statistics about the data represented by the renderer. The [Legend](https://developers.arcgis.com/javascript/latest/references/map-components/components/arcgis-legend/) can use this information to avoid displaying values beyond the `min` and `max` data values of the layer.
   *
   * @since 4.18
   */
  statistics?: {
      min: number;
      max: number;
  } | null;
  /**
   * Contains authoring properties of visual variables generated from
   * one of the Smart Mapping methods or sliders.
   */
  visualVariables?: AuthoringInfoVisualVariableProperties[];
}

/**
 * Authoring information related to generating renderers
 * and visual variables with the Smart Mapping methods. This includes information from UI
 * elements such as sliders and selected classification methods
 * and themes. This allows the authoring clients to save settings
 * so that their selections can be remembered.
 *
 * @since 4.6
 * @see [Sample - Multivariate data exploration](https://developers.arcgis.com/javascript/latest/sample-code/visualization-sm-multivariate/)
 */
export default class AuthoringInfo extends JSONSupport {
  constructor(properties?: AuthoringInfoProperties);
  /**
   * Indicates which classification method was used if a
   * classed color or classed size renderer was generated using one of the Smart Mapping functions.
   *
   * @see [colorRendererCreator.createClassBreaksRenderer()](https://developers.arcgis.com/javascript/latest/references/core/smartMapping/renderers/color/#createClassBreaksRenderer)
   * @see [sizeRendererCreator.createClassBreaksRenderer()](https://developers.arcgis.com/javascript/latest/references/core/smartMapping/renderers/size/#createClassBreaksRenderer)
   */
  accessor classificationMethod: AuthoringInfoClassificationMethods | null | undefined;
  /** Indicates the color ramp was used to create the symbols for Unique Value or Class Breaks renderer for Imagery Layer. */
  get colorRamp(): ColorRamp | null | undefined;
  set colorRamp(value: ColorRampProperties | null | undefined);
  /**
   * Only applicable to [HeatmapRenderer](https://developers.arcgis.com/javascript/latest/references/core/renderers/HeatmapRenderer/)
   * created with the [heatmap renderer creator](https://developers.arcgis.com/javascript/latest/references/core/smartMapping/renderers/heatmap/).
   * Indicates how much the user opted to fade the edges of the heatmap to transparent.
   *
   * @since 4.25
   */
  accessor fadeRatio: number | null | undefined;
  /**
   * A numeric field used for generating a [relationship renderer](https://developers.arcgis.com/javascript/latest/references/core/smartMapping/renderers/relationship/)
   * along with [field2](https://developers.arcgis.com/javascript/latest/references/core/renderers/support/AuthoringInfo/#field2). In the default visualization,
   *   the values of this field are rendered along the vertical axis of the [Legend](https://developers.arcgis.com/javascript/latest/references/map-components/components/arcgis-legend/).
   */
  get field1(): AuthoringInfoFieldInfo | null | undefined;
  set field1(value: AuthoringInfoFieldInfoProperties | null | undefined);
  /**
   * A numeric field used for generating a [relationship renderer](https://developers.arcgis.com/javascript/latest/references/core/smartMapping/renderers/relationship/)
   * along with [field1](https://developers.arcgis.com/javascript/latest/references/core/renderers/support/AuthoringInfo/#field1). In the default visualization,
   *   the values of this field are rendered along the horizontal axis of the [Legend](https://developers.arcgis.com/javascript/latest/references/map-components/components/arcgis-legend/).
   */
  get field2(): AuthoringInfoFieldInfo | null | undefined;
  set field2(value: AuthoringInfoFieldInfoProperties | null | undefined);
  /** An array of string values representing field names used for creating a [predominance renderer](https://developers.arcgis.com/javascript/latest/references/core/smartMapping/renderers/predominance/). */
  accessor fields: string[] | null | undefined;
  /**
   * Only applicable to [FlowRenderer](https://developers.arcgis.com/javascript/latest/references/core/renderers/FlowRenderer/) renderers. Indicates the user-selected theme of the generated renderer.
   *
   * > [!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 4.23
   */
  accessor flowTheme: FlowTheme | null | undefined;
  /**
   * The focus of a [relationship renderer](https://developers.arcgis.com/javascript/latest/references/core/smartMapping/renderers/relationship/). This
   * determines the orientation of the legend.
   */
  accessor focus: RelationshipFocus | null | undefined;
  /**
   * Indicates whether the renderer was created internally by the JS API's rendering engine for
   * default [FeatureReductionCluster](https://developers.arcgis.com/javascript/latest/references/core/layers/support/FeatureReductionCluster/) visualizations. You should avoid
   * setting or changing this value.
   *
   * @default false
   */
  accessor isAutoGenerated: boolean;
  /** **Only applicable to renderer used in web scenes.** Indicates the unit used in real-world sizes. */
  accessor lengthUnit: AuthoringInfoLengthUnits | null | undefined;
  /** Indicates the value of the upper handle if a slider was used to generate the dot value for dot density renderer. */
  accessor maxSliderValue: number | null | undefined;
  /** Indicates the value of the lower handle if a slider was used to generate the dot value for dot density renderer. */
  accessor minSliderValue: number | null | undefined;
  /**
   * The number of classes used to classify each field of a [relationship renderer](https://developers.arcgis.com/javascript/latest/references/core/smartMapping/renderers/relationship/). This
   * determines the number of categories in the legend.
   */
  accessor numClasses: RelationshipNumClasses | null | undefined;
  /**
   * Indicates the standard deviation interval for each stop in a classed color or
   * classed size renderer that was generated using the `standard-deviation` classification method.
   *
   * **Possible Values:** 0.25 | 0.33 | 0.5 | 1
   */
  accessor standardDeviationInterval: StandardDeviationInterval | null | undefined;
  /**
   * Only for renderers of type `univariate-color-size` with an `above-and-below` [univariateTheme](https://developers.arcgis.com/javascript/latest/references/core/renderers/support/AuthoringInfo/#univariateTheme). Contains summary statistics about the data represented by the renderer. The [Legend](https://developers.arcgis.com/javascript/latest/references/map-components/components/arcgis-legend/) can use this information to avoid displaying values beyond the `min` and `max` data values of the layer.
   *
   * @since 4.18
   */
  get statistics(): AuthoringInfoStatistics | null | undefined;
  set statistics(value: {
      min: number;
      max: number;
  } | null | undefined);
  /** Indicates the renderer type generated from one of the Smart Mapping functions. */
  accessor type: AuthoringInfoTypes;
  /**
   * Only applicable to [univariateColorSize](https://developers.arcgis.com/javascript/latest/references/core/smartMapping/renderers/univariateColorSize/) renderers with an `above-and-below` [univariateTheme](https://developers.arcgis.com/javascript/latest/references/core/renderers/support/AuthoringInfo/#univariateTheme). Indicates if the above and below renderer uses a predefined symbol pair provided by the API.
   *
   * The `custom` style indicates the renderer was authored with custom symbols not provided as a predefined symbol pair in the renderer creator.
   *
   * @since 4.18
   */
  accessor univariateSymbolStyle: UnivariateSymbolStyle | null | undefined;
  /**
   * Only applicable to [univariateColorSize](https://developers.arcgis.com/javascript/latest/references/core/smartMapping/renderers/univariateColorSize/) renderers. Indicates the theme of the univariate color and size renderer.
   *
   * @since 4.18
   */
  accessor univariateTheme: UnivariateTheme | null | undefined;
  /**
   * Contains authoring properties of visual variables generated from
   * one of the Smart Mapping methods or sliders.
   */
  get visualVariables(): AuthoringInfoVisualVariable[];
  set visualVariables(value: AuthoringInfoVisualVariableProperties[]);
  /**
   * Creates a deep clone of the instance.
   *
   * @returns A deep clone of the object that
   * invoked this method.
   * @example
   * // Creates a deep clone of the layer's authoring info
   * let authInfo = layer.renderer.authoringInfo.clone();
   */
  clone(): AuthoringInfo;
}