/**
 * 文件职责：财务概览页面工具方法。
 */
import type {
  FinanceOverviewCompositionViewItem,
  FinanceOverviewFilterState,
} from '../../types';

import type {
  FinanceOverviewDashboardQuery,
  FinanceOverviewKpiCardDto,
} from '#/api/finance/overview';

import {
  COST_COMPOSITION_COLOR_MAP,
  INCOME_COMPOSITION_COLOR_MAP,
} from './constants';

const currencyFormatter = new Intl.NumberFormat('zh-CN', {
  minimumFractionDigits: 0,
  maximumFractionDigits: 2,
});

const percentFormatter = new Intl.NumberFormat('zh-CN', {
  minimumFractionDigits: 0,
  maximumFractionDigits: 2,
});

/** 货币格式化。 */
export function formatCurrency(value: number) {
  return `¥${currencyFormatter.format(value)}`;
}

/** 百分比格式化。 */
export function formatPercent(value: number) {
  return `${percentFormatter.format(value)}%`;
}

/** 变化率格式化（带正负号）。 */
export function formatChangeRate(value: number) {
  const sign = value > 0 ? '+' : '';
  return `${sign}${percentFormatter.format(value)}%`;
}

/** 图表纵轴金额格式化。 */
export function formatAxisAmount(value: number) {
  if (Math.abs(value) >= 10_000) {
    return `${percentFormatter.format(value / 10_000)}万`;
  }
  return currencyFormatter.format(value);
}

/** 生成查询参数。 */
export function buildDashboardQuery(
  filters: FinanceOverviewFilterState,
): FinanceOverviewDashboardQuery {
  if (filters.dimension === 'store') {
    return {
      dimension: filters.dimension,
      storeId: filters.storeId,
    };
  }

  return {
    dimension: filters.dimension,
  };
}

/** 计算 TOP 占比条宽度。 */
export function calcTopProductBarWidth(
  percentage: number,
  maxPercentage: number,
) {
  if (maxPercentage <= 0) return 0;
  return Math.round((percentage / maxPercentage) * 100);
}

/** 收入构成转换为视图结构。 */
export function toIncomeCompositionViewItems(
  items: Array<{
    amount: number;
    channel: string;
    channelText: string;
    percentage: number;
  }>,
): FinanceOverviewCompositionViewItem[] {
  return items.map((item) => ({
    key: item.channel,
    name: item.channelText,
    amount: item.amount,
    percentage: item.percentage,
    color: INCOME_COMPOSITION_COLOR_MAP[item.channel] ?? '#1677ff',
  }));
}

/** 成本构成转换为视图结构。 */
export function toCostCompositionViewItems(
  items: Array<{
    amount: number;
    category: string;
    categoryText: string;
    percentage: number;
  }>,
): FinanceOverviewCompositionViewItem[] {
  return items.map((item) => ({
    key: item.category,
    name: item.categoryText,
    amount: item.amount,
    percentage: item.percentage,
    color: COST_COMPOSITION_COLOR_MAP[item.category] ?? '#94a3b8',
  }));
}

/** 获取 KPI 趋势样式标识。 */
export function resolveKpiTrendClass(card: FinanceOverviewKpiCardDto) {
  if (card.trend === 'up') {
    return 'is-up';
  }

  if (card.trend === 'down') {
    return 'is-down';
  }

  return 'is-flat';
}

/** 获取 KPI 趋势图标。 */
export function resolveKpiTrendIcon(card: FinanceOverviewKpiCardDto) {
  if (card.trend === 'up') {
    return 'lucide:trending-up';
  }

  if (card.trend === 'down') {
    return 'lucide:trending-down';
  }

  return 'lucide:minus';
}
