// 数学工具函数
// 来源: u-charts.ts

/**
 * 计算数值范围（向上或向下取整到指定倍数）
 * @param num - 输入数值
 * @param type - 取整类型: 'upper' 向上取整, 'lower' 向下取整
 * @param limit - 倍数限制，默认 10
 * @returns 取整后的数值
 * @throws Error 如果 num 不是数字
 */
export function findRange(num: number, type?: 'upper' | 'lower', limit?: number): number {
  if (isNaN(num)) {
    throw new Error('[uCharts] series数据需为Number格式');
  }
  limit = limit || 10;
  type = type ? type : 'upper';
  let multiple = 1;
  while (limit < 1) {
    limit *= 10;
    multiple *= 10;
  }
  if (type === 'upper') {
    num = Math.ceil(num * multiple);
  } else {
    num = Math.floor(num * multiple);
  }
  while (num % limit !== 0) {
    if (type === 'upper') {
      if (num == num + 1) { //修复数据值过大num++无效的bug by 向日葵 @xrk_jy
        break;
      }
      num++;
    } else {
      num--;
    }
  }
  return num / multiple;
}

/**
 * K线图数据点接口
 */
export interface CandleDataPoint {
  [key: string]: number;
}

/**
 * 移动平均线系列项接口
 */
export interface MASeriesItem {
  data: (number | null)[];
  name: string;
  color: string;
}

/**
 * 计算 K 线图的移动平均线
 * @param dayArr - MA 天数数组 (如 [5, 10, 20, 30])
 * @param nameArr - MA 名称数组 (如 ['MA5', 'MA10', 'MA20', 'MA30'])
 * @param colorArr - MA 颜色数组
 * @param kdata - K 线数据数组，每个元素包含 OHLC 数据
 * @returns MA 系列数据数组
 */
export function calCandleMA(
  dayArr: number[],
  nameArr: string[],
  colorArr: string[],
  kdata: CandleDataPoint[]
): MASeriesItem[] {
  let seriesTemp: MASeriesItem[] = [];
  for (let k = 0; k < dayArr.length; k++) {
    let seriesItem: MASeriesItem = {
      data: [],
      name: nameArr[k],
      color: colorArr[k]
    };
    for (let i = 0, len = kdata.length; i < len; i++) {
      if (i < dayArr[k]) {
        seriesItem.data.push(null);
        continue;
      }
      let sum = 0;
      for (let j = 0; j < dayArr[k]; j++) {
        sum += kdata[i - j][1];
      }
      seriesItem.data.push(+(sum / dayArr[k]).toFixed(3));
    }
    seriesTemp.push(seriesItem);
  }
  return seriesTemp;
}
