// 坐标转换工具函数
// 来源: u-charts.ts

/**
 * 坐标点接口
 */
export interface Point {
  x: number;
  y: number;
}

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

/**
 * 坐标原点转换
 * @param x - 原 x 坐标
 * @param y - 原 y 坐标
 * @param center - 中心点坐标
 * @returns 转换后的坐标点
 */
export function convertCoordinateOrigin(x: number, y: number, center: Center): Point {
  return {
    x: center.x + x,
    y: center.y - y
  };
}

/**
 * 判断角度是否在指定范围内
 * @param angle - 待判断的角度（弧度）
 * @param startAngle - 起始角度（弧度）
 * @param endAngle - 结束角度（弧度）
 * @returns 是否在范围内
 */
export function isInAngleRange(
  angle: number,
  startAngle: number,
  endAngle: number
): boolean {
  function adjust(angle: number): number {
    while (angle < 0) {
      angle += 2 * Math.PI;
    }
    while (angle > 2 * Math.PI) {
      angle -= 2 * Math.PI;
    }
    return angle;
  }
  angle = adjust(angle);
  startAngle = adjust(startAngle);
  endAngle = adjust(endAngle);
  if (startAngle > endAngle) {
    endAngle += 2 * Math.PI;
    if (angle < startAngle) {
      angle += 2 * Math.PI;
    }
  }
  return angle >= startAngle && angle <= endAngle;
}

/**
 * 图表配置接口（用于 calValidDistance）
 */
export interface ChartConfig {
  type: string;
  width: number;
  height: number;
  area: number[];
  extra?: {
    mount?: {
      widthRatio?: number;
    };
  };
  xAxis?: {
    scrollPosition?: string | number;
  };
  chartData?: {
    xAxisData?: {
      xAxisPoints: Point[];
    };
    eachSpacing?: number;
  };
  rotate?: boolean;
  pix?: number;
}

/**
 * 图表数据接口
 */
export interface ChartData {
  eachSpacing: number;
}

/**
 * 滚动选项接口
 */
export interface ScrollOption {
  position: string | number;
}

/**
 * 图表实例接口（用于 calValidDistance）
 */
export interface UChartInstance {
  uevent: {
    trigger: (event: string) => void;
  };
  scrollOption: ScrollOption;
}

/**
 * 计算有效的滚动距离
 * @param self - 图表实例
 * @param distance - 滚动距离
 * @param chartData - 图表数据
 * @param config - 图表配置
 * @param opts - 图表选项
 * @returns 有效的滚动距离
 */
export function calValidDistance(
  self: UChartInstance,
  distance: number,
  chartData: ChartData,
  config: ChartConfig,
  opts: ChartConfig
): number {
  let dataChartAreaWidth = opts.width - opts.area[1] - opts.area[3];
  let dataChartWidth = chartData.eachSpacing * (opts.chartData!.xAxisData!.xAxisPoints.length - 1);
  if(opts.type == 'mount' && opts.extra && opts.extra.mount && opts.extra.mount.widthRatio && opts.extra.mount.widthRatio > 1){
    if(opts.extra.mount.widthRatio > 2) opts.extra.mount.widthRatio = 2
    dataChartWidth += (opts.extra.mount.widthRatio - 1) * chartData.eachSpacing;
  }
  let validDistance = distance;
  if (distance >= 0) {
    validDistance = 0;
    self.uevent.trigger('scrollLeft');
    self.scrollOption.position = 'left'
    opts.xAxis!.scrollPosition = 'left';
  } else if (Math.abs(distance) >= dataChartWidth - dataChartAreaWidth) {
    validDistance = dataChartAreaWidth - dataChartWidth;
    self.uevent.trigger('scrollRight');
    self.scrollOption.position = 'right'
    opts.xAxis!.scrollPosition = 'right';
  } else {
    self.scrollOption.position = distance
    opts.xAxis!.scrollPosition = distance;
  }
  return validDistance;
}
