/**
 * 文件职责：配送设置纯函数工具。
 * 1. 负责格式化展示文案。
 * 2. 负责克隆与归一化数据，避免引用污染。
 */
import type {
  DeliveryGeneralSettingsDto,
  DeliveryMode,
  PolygonZoneDto,
  RadiusTierDto,
} from '#/api/store-delivery';
import type { DeliverySettingsSnapshot } from '#/views/store/delivery/types';

import { TIER_COLOR_PALETTE } from './constants';

/** 深拷贝半径梯度数据，避免直接复用原引用。 */
export function cloneRadiusTiers(source: RadiusTierDto[]) {
  return source.map((item) => ({ ...item }));
}

/** 深拷贝多边形区域数据，避免直接复用原引用。 */
export function clonePolygonZones(source: PolygonZoneDto[]) {
  return source.map((item) => ({ ...item }));
}

/** 复制通用设置对象，供快照与回滚使用。 */
export function cloneGeneralSettings(source: DeliveryGeneralSettingsDto) {
  return { ...source };
}

/** 生成页面级快照，用于重置恢复。 */
export function createSettingsSnapshot(payload: {
  generalSettings: DeliveryGeneralSettingsDto;
  mode: DeliveryMode;
  polygonZones: PolygonZoneDto[];
  radiusCenterLatitude: null | number;
  radiusCenterLongitude: null | number;
  radiusTiers: RadiusTierDto[];
}): DeliverySettingsSnapshot {
  return {
    mode: payload.mode,
    radiusCenterLatitude: payload.radiusCenterLatitude,
    radiusCenterLongitude: payload.radiusCenterLongitude,
    radiusTiers: cloneRadiusTiers(payload.radiusTiers),
    polygonZones: clonePolygonZones(payload.polygonZones),
    generalSettings: cloneGeneralSettings(payload.generalSettings),
  };
}

/** 按距离上限升序整理梯度，保证展示顺序稳定。 */
export function sortRadiusTiers(source: RadiusTierDto[]) {
  return cloneRadiusTiers(source).toSorted(
    (a, b) => a.maxDistance - b.maxDistance,
  );
}

/** 按优先级升序整理区域，保证展示顺序稳定。 */
export function sortPolygonZones(source: PolygonZoneDto[]) {
  return clonePolygonZones(source).toSorted((a, b) => a.priority - b.priority);
}

/** 将金额格式化为货币文案。 */
export function formatCurrency(value: number) {
  return `¥${Number(value || 0).toFixed(2)}`;
}

/** 将梯度距离格式化为区间文案。 */
export function formatDistanceRange(tier: RadiusTierDto) {
  return `${tier.minDistance} ~ ${tier.maxDistance} km`;
}

/** 生成梯度 ID，便于前端新增记录标识。 */
export function createTierId() {
  return `tier-${Date.now()}-${Math.floor(Math.random() * 1000)}`;
}

/** 生成区域 ID，便于前端新增记录标识。 */
export function createZoneId() {
  return `zone-${Date.now()}-${Math.floor(Math.random() * 1000)}`;
}

/** 根据序号获取梯度颜色，超出时循环取值。 */
export function getTierColorByIndex(index: number) {
  if (TIER_COLOR_PALETTE.length === 0) return '#1677ff';
  return TIER_COLOR_PALETTE[index % TIER_COLOR_PALETTE.length] || '#1677ff';
}
