/**
 * 금액 포맷팅 유틸리티
 *
 * 1만원 미만: "1,000원"
 * 1만원 이상: "1,000만원"
 */

/**
 * formatNumber 옵션 (formatters.ts 호환)
 */
export interface FormatNumberOptions {
  useComma?: boolean;
  decimalPlaces?: number;
  suffix?: string;
}

/**
 * 단순 숫자 포맷 (천단위 콤마만, 단위 없음)
 *
 * - 옵션 없이 호출: Intl.NumberFormat 사용, null/NaN → '-'
 * - 옵션과 함께 호출: formatters.ts 호환, NaN → ''
 *
 * @example formatNumber(1234567) // "1,234,567"
 * @example formatNumber(null) // "-"
 * @example formatNumber(1234, { suffix: '원' }) // "1,234원"
 * @example formatNumber('abc', { useComma: true }) // ""
 */
export function formatNumber(
  value: number | string | null | undefined,
  options?: FormatNumberOptions,
): string {
  if (options) {
    const { useComma = true, decimalPlaces, suffix = '' } = options;
    const num = typeof value === 'string' ? parseFloat(value) : (value ?? NaN);
    if (isNaN(num)) return '';

    let formatted: string;
    if (decimalPlaces !== undefined) {
      formatted = num.toFixed(decimalPlaces);
    } else {
      formatted = String(num);
    }

    if (useComma) {
      const parts = formatted.split('.');
      parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ',');
      formatted = parts.join('.');
    }

    return suffix ? `${formatted}${suffix}` : formatted;
  }

  // 옵션 없는 호출: 기존 amount.ts 동작 유지
  if (value == null) return '-';
  const num = typeof value === 'string' ? parseFloat(value) : value;
  if (isNaN(num)) return '-';
  return new Intl.NumberFormat('ko-KR').format(num);
}

export function formatAmount(amount: number): string {
  // NaN, undefined, null 처리
  if (amount == null || isNaN(amount)) {
    return "0원";
  }

  if (amount < 10000) {
    return `${amount.toLocaleString("ko-KR")}원`;
  } else {
    const manwon = Math.round(amount / 10000);
    return `${manwon.toLocaleString("ko-KR")}만원`;
  }
}

/**
 * 금액을 원 단위로 포맷 (항상 "원" 단위)
 */
export function formatAmountWon(amount: number): string {
  // NaN, undefined, null 처리
  if (amount == null || isNaN(amount)) {
    return "0원";
  }
  return `${amount.toLocaleString("ko-KR")}원`;
}

/**
 * 금액을 만원 단위로 포맷 (항상 "만원" 단위)
 */
export function formatAmountManwon(amount: number): string {
  // NaN, undefined, null 처리
  if (amount == null || isNaN(amount)) {
    return "0만원";
  }
  const manwon = Math.round(amount / 10000);
  return `${manwon.toLocaleString("ko-KR")}만원`;
}

/**
 * 차트 축 레이블용 축약 포맷
 *
 * - 1억 이상: "1.5억"
 * - 1만 이상: "5320만"
 * - 1만 미만: "5,000"
 */
export function formatCompactAmount(value: number): string {
  if (value >= 100000000) return `${(value / 100000000).toFixed(1)}억`;
  if (value >= 10000) return `${(value / 10000).toFixed(0)}만`;
  return value.toLocaleString();
}

/**
 * 한국식 금액 축약 포맷
 *
 * - 1만 미만: 원 단위 (예: "5,000원")
 * - 1만 ~ 1억 미만: 만 단위 (예: "5,320만")
 * - 1억 이상: 억 + 만 단위 (예: "1억 5,000만", "12억 3,453만")
 *   - 만원 나머지가 0이면 "10억"
 */
export function formatKoreanAmount(amount: number): string {
  if (amount == null || isNaN(amount)) return "0원";

  const absAmount = Math.abs(amount);
  const sign = amount < 0 ? "-" : "";

  if (absAmount < 10000) {
    // 만원 미만: 원 단위
    return sign + absAmount.toLocaleString("ko-KR") + "원";
  }

  if (absAmount < 100000000) {
    // 만원 ~ 억 미만: 만 단위
    const manwon = Math.round(absAmount / 10000);
    return sign + manwon.toLocaleString("ko-KR") + "만";
  }

  // 억 이상: 억 + 만 단위
  const eok = Math.floor(absAmount / 100000000);
  const remainder = Math.round((absAmount % 100000000) / 10000);

  if (remainder === 0) {
    return sign + eok.toLocaleString("ko-KR") + "억";
  }
  return sign + eok.toLocaleString("ko-KR") + "억 " + remainder.toLocaleString("ko-KR") + "만";
}