/**
 * Dashboard Transformer 공유 헬퍼 함수
 */

import type { HighlightColor } from '@/components/business/CEODashboard/types';
import { formatNumber } from '@/lib/utils/amount';

/**
 * 네비게이션 경로 정규화
 * - /ko prefix 추가 (없는 경우)
 * - 상세 페이지에 ?mode=view 추가 (필요시)
 * @example normalizePath('/accounting/deposits/73') → '/ko/accounting/deposits/73?mode=view'
 */
export function normalizePath(path: string | undefined, options?: { addViewMode?: boolean }): string {
  if (!path) return '';

  let normalizedPath = path;

  // /ko prefix 추가 (없는 경우)
  if (!normalizedPath.startsWith('/ko')) {
    normalizedPath = `/ko${normalizedPath}`;
  }

  // 상세 페이지에 ?mode=view 추가 (숫자 ID가 있고 mode 파라미터가 없는 경우)
  if (options?.addViewMode) {
    const hasIdPattern = /\/\d+($|\?)/.test(normalizedPath);
    const hasMode = /[?&]mode=/.test(normalizedPath);
    const hasModal = /[?&]openModal=/.test(normalizedPath);

    // ID가 있고, mode 파라미터가 없고, openModal도 없는 경우에만 ?mode=view 추가
    if (hasIdPattern && !hasMode && !hasModal) {
      normalizedPath = normalizedPath.includes('?')
        ? `${normalizedPath}&mode=view`
        : `${normalizedPath}?mode=view`;
    }
  }

  return normalizedPath;
}

/**
 * 금액 포맷팅
 * @example formatAmount(3050000000) → "30.5억원"
 */
export function formatAmount(amount: number): string {
  const absAmount = Math.abs(amount);
  if (absAmount >= 100000000) {
    return `${(amount / 100000000).toFixed(1)}억원`;
  } else if (absAmount >= 10000) {
    return `${formatNumber(Math.round(amount / 10000))}만원`;
  }
  return `${formatNumber(amount)}원`;
}

/**
 * 날짜 포맷팅 (API → 한국어 형식)
 * @example formatDate("2026-01-20", "월요일") → "2026년 1월 20일 월요일"
 */
export function formatDate(dateStr: string, dayOfWeek: string): string {
  const date = new Date(dateStr);
  return `${date.getFullYear()}년 ${date.getMonth() + 1}월 ${date.getDate()}일 ${dayOfWeek}`;
}

/**
 * 퍼센트 변화율 계산
 */
export function calculateChangeRate(current: number, previous: number): number {
  if (previous === 0) return current > 0 ? 100 : 0;
  return ((current - previous) / previous) * 100;
}

/**
 * 변동률 → changeRate/changeDirection 변환 헬퍼
 */
export function toChangeFields(rate?: number): { changeRate?: string; changeDirection?: 'up' | 'down' } {
  if (rate === undefined || rate === null) return {};
  const direction = rate >= 0 ? 'up' as const : 'down' as const;
  const sign = rate >= 0 ? '+' : '';
  return {
    changeRate: `${sign}${rate.toFixed(1)}%`,
    changeDirection: direction,
  };
}

/** 유효한 하이라이트 색상 목록 */
const VALID_HIGHLIGHT_COLORS: HighlightColor[] = ['red', 'green', 'blue'];

/**
 * API 색상 문자열 → Frontend 하이라이트 색상 변환
 * 유효하지 않은 색상은 'blue'로 폴백
 */
export function validateHighlightColor(color: string): HighlightColor {
  if (VALID_HIGHLIGHT_COLORS.includes(color as HighlightColor)) {
    return color as HighlightColor;
  }
  return 'blue';
}
