import { convertCoordinateOrigin } from '../utils/coordinate';

// 动画进度全局变量
declare const process: number;

/**
 * 图表配置接口
 */
export interface ChartOptions {
  extra?: {
    radar?: {
      max?: number;
    };
  };
  [key: string]: any;
}

/**
 * 雷达图系列数据
 */
export interface RadarSeriesItem {
  data: number[];
  color?: string;
  [key: string]: any;
}

/**
 * 雷达图数据项（包含计算后的位置）
 */
export interface RadarDataItem {
  color?: string;
  legendShape?: string;
  pointShape?: string;
  data: {
    angle: number;
    proportion: number;
    value: number;
    position: { x: number; y: number };
  }[];
}

/**
 * 中心点接口
 */
export interface CenterPoint {
  x: number;
  y: number;
}

/**
 * 合并雷达图系列数据到单个数组
 * 本地实现以避免与 data-processing 模块的类型冲突
 */
function dataCombineRadar(series: RadarSeriesItem[]): number[] {
  return series.reduce(function(a: number[], b) {
    return a.concat(b.data);
  }, [] as number[]);
}

/**
 * 获取雷达图数据点
 * 计算雷达图上每个数据点的位置
 * @param angleList - 每个轴的角度数组
 * @param center - 中心点 {x, y}
 * @param radius - 雷达图半径
 * @param series - 系列数据数组
 * @param opts - 图表配置
 * @returns 包含计算后位置的雷达图数据项数组
 */
export function getRadarDataPoints(
  angleList: number[],
  center: CenterPoint,
  radius: number,
  series: RadarSeriesItem[],
  opts: ChartOptions
): RadarDataItem[] {
  let radarOption = opts.extra?.radar || {};
  radarOption.max = radarOption.max || 0;
  let maxData = Math.max(radarOption.max || 0, Math.max.apply(null, dataCombineRadar(series)));
  let data: RadarDataItem[] = [];
  for (let i = 0; i < series.length; i++) {
    let each = series[i];
    let listItem: RadarDataItem = {
      data: []
    };
    listItem.color = each.color;
    listItem.legendShape = each.legendShape;
    listItem.pointShape = each.pointShape;
    listItem.data = [];
    each.data.forEach(function(item, index) {
      let tmp: {
        angle: number;
        proportion: number;
        value: number;
        position: { x: number; y: number };
      } = { angle: 0, proportion: 0, value: 0, position: { x: 0, y: 0 } };
      tmp.angle = angleList[index];
      tmp.proportion = item / maxData;
      tmp.value = item;
      tmp.position = convertCoordinateOrigin(
        radius * tmp.proportion * process * Math.cos(tmp.angle),
        radius * tmp.proportion * process * Math.sin(tmp.angle),
        center
      );
      listItem.data.push(tmp);
    });
    data.push(listItem);
  }
  return data;
}
