import type { SeriesProcessor } from "./seriesProcessor.types.js";
import type { CartesianChartSeriesType, ChartSeriesType, ChartsSeriesConfig, PolarChartSeriesType } from "../../../../models/seriesType/config.js";
import type { ColorProcessor } from "./colorProcessor.types.js";
import type { CartesianExtremumGetter } from "./cartesianExtremumGetter.types.js";
import type { LegendGetter } from "./legendGetter.types.js";
import type { AxisTooltipGetter, TooltipGetter } from "./tooltipGetter.types.js";
import { type PolarExtremumGetter } from "./polarExtremumGetter.types.js";
import { type GetSeriesWithDefaultValues } from "./getSeriesWithDefaultValues.types.js";
import { type TooltipItemPositionGetter } from "./tooltipItemPositionGetter.types.js";
import { type SeriesLayoutGetter } from "./seriesLayout.types.js";
import { type KeyboardFocusHandler } from "../../featurePlugins/useChartKeyboardNavigation/keyboardFocusHandler.types.js";
import { type IdentifierSerializer } from "./identifierSerializer.types.js";
import { type GetItemAtPosition } from "./getItemAtPosition.types.js";
import { type UseChartCartesianAxisSignature } from "../../featurePlugins/useChartCartesianAxis/index.js";
import { type UseChartPolarAxisSignature } from "../../featurePlugins/useChartPolarAxis/index.js";
export type ChartSeriesTypeRequiredPlugins<TSeriesType extends ChartSeriesType> = ChartsSeriesConfig[TSeriesType] extends {
  axisType: 'cartesian';
} ? [UseChartCartesianAxisSignature] : ChartsSeriesConfig[TSeriesType] extends {
  axisType: 'polar';
} ? [UseChartPolarAxisSignature] : [];
export type ChartSeriesTypeConfig<TSeriesType extends ChartSeriesType> = {
  seriesProcessor: SeriesProcessor<TSeriesType>;
  /**
   * A processor to add series layout when the layout does not depend from other series.
   */
  seriesLayout?: SeriesLayoutGetter<TSeriesType>;
  colorProcessor: ColorProcessor<TSeriesType>;
  legendGetter: LegendGetter<TSeriesType>;
  tooltipGetter: TooltipGetter<TSeriesType>;
  tooltipItemPositionGetter?: TooltipItemPositionGetter<TSeriesType>;
  getSeriesWithDefaultValues: GetSeriesWithDefaultValues<TSeriesType>;
  keyboardFocusHandler?: KeyboardFocusHandler<TSeriesType>;
  /**
   * A function to serialize the series item identifier into a unique string.
   * @param {ChartsSeriesConfig[TSeriesType]['itemIdentifier']} identifier The series item identifier.
   * @returns {string} A unique string representation of the identifier.
   */
  identifierSerializer: IdentifierSerializer<TSeriesType>;
  getItemAtPosition?: GetItemAtPosition<TSeriesType>;
} & (TSeriesType extends CartesianChartSeriesType ? {
  xExtremumGetter: CartesianExtremumGetter<TSeriesType>;
  yExtremumGetter: CartesianExtremumGetter<TSeriesType>;
  axisTooltipGetter?: AxisTooltipGetter<TSeriesType, 'x' | 'y'>;
} : {}) & (TSeriesType extends PolarChartSeriesType ? {
  rotationExtremumGetter: PolarExtremumGetter<TSeriesType>;
  radiusExtremumGetter: PolarExtremumGetter<TSeriesType>;
  axisTooltipGetter?: AxisTooltipGetter<TSeriesType, 'rotation' | 'radius'>;
} : {});
export type ChartSeriesConfig<TSeriesType extends ChartSeriesType> = { [Key in TSeriesType]: ChartSeriesTypeConfig<Key> };