'use client';

/**
 * Card Management Modal Config Transformers
 *
 * API 응답 데이터를 DetailModalConfig로 변환하는 함수들
 *
 * cm1: CardDashboardDetailApiResponse → DetailModalConfig
 * cm2: LoanDashboardApiResponse → DetailModalConfig
 * cm3: TaxSimulationApiResponse → DetailModalConfig (법인세)
 * cm4: TaxSimulationApiResponse → DetailModalConfig (종합소득세)
 */

import type { DetailModalConfig } from '../types';
import type {
  CardDashboardDetailApiResponse,
  LoanDashboardApiResponse,
  TaxSimulationApiResponse,
} from '@/lib/api/dashboard/types';
import { formatNumber } from '@/lib/utils/amount';

// ============================================
// 유틸리티 함수
// ============================================

/**
 * 숫자를 한국식 단위로 포맷팅 (억, 만)
 */
function formatKoreanCurrency(value: number): string {
  if (value >= 100000000) {
    const billions = value / 100000000;
    return `${billions.toFixed(1)}억원`;
  }
  if (value >= 10000) {
    const thousands = value / 10000;
    return `${thousands.toFixed(0)}만원`;
  }
  return `${formatNumber(value)}원`;
}

/**
 * 전월 대비 증감률 계산
 */
function calculateChangeRate(current: number, previous: number): number {
  if (previous === 0) return current > 0 ? 100 : 0;
  return ((current - previous) / previous) * 100;
}

/**
 * 퍼센트 값을 포맷팅
 */
function formatPercentage(value: number, showSign = true): string {
  const sign = showSign && value > 0 ? '+' : '';
  return `${sign}${value.toFixed(1)}%`;
}

// ============================================
// cm1: 카드 사용 상세 모달 변환기
// ============================================

/**
 * 카드 대시보드 API 응답을 cm1 모달 설정으로 변환
 */
export function transformCm1ModalConfig(
  data: CardDashboardDetailApiResponse
): DetailModalConfig {
  const { summary, monthly_trend = [], by_user = [], items = [] } = data;

  // 전월 대비 증감률 계산
  const changeRate = calculateChangeRate(
    summary.current_month_total,
    summary.previous_month_total
  );

  // 미정리 건수 계산 (usage_type이 '미설정'인 항목)
  const unprocessedCount = (items || []).filter(
    (item) => item.usage_type === '미설정' || !item.usage_type
  ).length;

  // 사용자별 비율 계산
  const safeByUser = by_user || [];
  const totalAmount = safeByUser.reduce((sum, user) => sum + user.amount, 0);
  const pieChartData = safeByUser.map((user) => ({
    name: user.user_name,
    value: user.amount,
    percentage: totalAmount > 0 ? Math.round((user.amount / totalAmount) * 100) : 0,
    color: user.color,
  }));

  // 사용자 필터 옵션 동적 생성
  const userFilterOptions = [
    { value: 'all', label: '전체' },
    ...safeByUser.map((user) => ({
      value: user.user_name,
      label: user.user_name,
    })),
  ];

  // 테이블 데이터 매핑
  const tableData = (items || []).map((item) => ({
    cardName: item.card_name,
    user: item.user_name,
    date: item.transaction_date,
    store: item.merchant_name,
    amount: item.amount,
    usageType: item.usage_type || '미설정',
  }));

  return {
    title: '카드 사용 상세',
    summaryCards: [
      { label: '당월 카드 사용', value: summary.current_month_total, unit: '원' },
      {
        label: '전월 대비',
        value: formatPercentage(changeRate),
        isComparison: true,
        isPositive: changeRate >= 0,
      },
      { label: '미정리 건수', value: `${unprocessedCount}건` },
    ],
    barChart: {
      title: '월별 카드 사용 추이',
      data: (monthly_trend || []).map((trend) => ({
        name: trend.label,
        value: trend.amount,
      })),
      dataKey: 'value',
      xAxisKey: 'name',
      color: '#60A5FA',
    },
    pieChart: {
      title: '사용자별 카드 사용 비율',
      data: pieChartData,
    },
    table: {
      title: '카드 사용 내역',
      columns: [
        { key: 'no', label: 'No.', align: 'center' },
        { key: 'cardName', label: '카드명', align: 'left' },
        { key: 'user', label: '사용자', align: 'center' },
        { key: 'date', label: '사용일시', align: 'center', format: 'date' },
        { key: 'store', label: '가맹점명', align: 'left' },
        { key: 'amount', label: '사용금액', align: 'right', format: 'currency' },
        { key: 'usageType', label: '사용유형', align: 'center', highlightValue: '미설정' },
      ],
      data: tableData,
      filters: [
        {
          key: 'user',
          options: userFilterOptions,
          defaultValue: 'all',
        },
        {
          key: 'usageType',
          options: [
            { value: 'all', label: '전체' },
            { value: '미설정', label: '미설정' },
            { value: '복리후생비', label: '복리후생비' },
            { value: '접대비', label: '접대비' },
            { value: '소모품비', label: '소모품비' },
            { value: '교통비', label: '교통비' },
          ],
          defaultValue: 'all',
        },
      ],
      showTotal: true,
      totalLabel: '합계',
      totalValue: summary.current_month_total,
      totalColumnKey: 'amount',
    },
  };
}

// ============================================
// cm2: 가지급금 상세 모달 변환기
// ============================================

/** 카테고리 키 → 한글 라벨 매핑
 * - category_breakdown 키: 영문 (card, congratulatory, ...)
 * - loans[].category: 한글 (카드, 경조사, ...) — 백엔드 category_label accessor
 * 양쪽 모두 대응
 */
const CATEGORY_LABELS: Record<string, string> = {
  // 영문 키 (category_breakdown용)
  card: '카드',
  congratulatory: '경조사',
  gift_certificate: '상품권',
  entertainment: '접대비',
  // 한글 값 (loans[].category가 이미 한글인 경우 — 그대로 통과)
  '카드': '카드',
  '경조사': '경조사',
  '상품권': '상품권',
  '접대비': '접대비',
};

/**
 * 가지급금 대시보드 API 응답을 cm2 모달 설정으로 변환
 */
export function transformCm2ModalConfig(
  data: LoanDashboardApiResponse
): DetailModalConfig {
  const { summary, category_breakdown, loans = [] } = data;

  // 테이블 데이터 매핑 (백엔드 필드명 기준, 영문 키 → 한글 변환)
  const tableData = (loans || []).map((item) => ({
    id: item.id,
    date: item.loan_date,
    classification: CATEGORY_LABELS[item.category] || item.category || '카드',
    category: item.status_label || '-',
    amount: item.amount,
    response: item.content,
  }));

  // 분류 필터 옵션 동적 생성
  const uniqueClassifications = [...new Set(tableData.map((item) => item.classification))];
  const classificationFilterOptions = [
    { value: 'all', label: '전체' },
    ...uniqueClassifications.map((cls) => ({
      value: cls,
      label: cls,
    })),
  ];

  // reviewCards: category_breakdown에서 4개 카테고리 카드 생성
  const reviewCards = category_breakdown
    ? {
        title: '가지급금 검토 필요',
        cards: Object.entries(category_breakdown).map(([key, breakdown]) => ({
          label: CATEGORY_LABELS[key] || key,
          amount: breakdown.outstanding_amount,
          subLabel: breakdown.unverified_count > 0
            ? `미증빙 ${breakdown.unverified_count}건`
            : `${breakdown.total_count}건`,
        })),
      }
    : undefined;

  return {
    title: '가지급금 상세',
    dateFilter: {
      enabled: true,
      defaultPreset: '당월',
      showSearch: true,
    },
    summaryCards: [
      { label: '가지급금 합계', value: formatKoreanCurrency(summary.total_outstanding) },
      { label: '인정비율 4.6%', value: summary.recognized_interest, unit: '원' },
      { label: '건수', value: `${summary.outstanding_count ?? 0}건` },
    ],
    reviewCards,
    table: {
      title: '가지급금 내역',
      columns: [
        { key: 'no', label: 'No.', align: 'center' },
        { key: 'date', label: '발생일', align: 'center' },
        { key: 'classification', label: '분류', align: 'center' },
        { key: 'category', label: '구분', align: 'center' },
        { key: 'amount', label: '금액', align: 'right', format: 'currency' },
        { key: 'response', label: '대응', align: 'left' },
      ],
      data: tableData,
      filters: [
        {
          key: 'classification',
          options: classificationFilterOptions,
          defaultValue: 'all',
        },
        {
          key: 'sortOrder',
          options: [
            { value: 'all', label: '정렬' },
            { value: 'amountDesc', label: '금액 높은순' },
            { value: 'amountAsc', label: '금액 낮은순' },
            { value: 'latest', label: '최신순' },
          ],
          defaultValue: 'all',
        },
      ],
      showTotal: true,
      totalLabel: '합계',
      totalValue: summary.total_outstanding,
      totalColumnKey: 'amount',
    },
  };
}

// ============================================
// cm3: 법인세 예상 가중 상세 모달 변환기
// ============================================

/**
 * 세금 시뮬레이션 API 응답을 cm3 (법인세) 모달 설정으로 변환
 */
export function transformCm3ModalConfig(
  data: TaxSimulationApiResponse
): DetailModalConfig {
  const { loan_summary, corporate_tax } = data;

  return {
    title: '법인세 예상 가중 상세',
    summaryCards: [
      { label: '법인세 예상 증가', value: corporate_tax.difference, unit: '원' },
      { label: '인정 이자', value: loan_summary.recognized_interest, unit: '원' },
      { label: '가지급금', value: formatKoreanCurrency(loan_summary.total_outstanding) },
      {
        label: `인정이자 ${(loan_summary.interest_rate * 100).toFixed(1)}%`,
        value: loan_summary.recognized_interest,
        unit: '원',
      },
    ],
    comparisonSection: {
      leftBox: {
        title: '없을때 법인세',
        items: [
          {
            label: '과세표준',
            value: formatKoreanCurrency(corporate_tax.without_loan.taxable_income),
          },
          { label: '법인세', value: corporate_tax.without_loan.tax_amount, unit: '원' },
        ],
        borderColor: 'orange',
      },
      rightBox: {
        title: '있을때 법인세',
        items: [
          {
            label: '과세표준',
            value: formatKoreanCurrency(corporate_tax.with_loan.taxable_income),
          },
          { label: '법인세', value: corporate_tax.with_loan.tax_amount, unit: '원' },
        ],
        borderColor: 'blue',
      },
      vsLabel: '법인세 예상 증가',
      vsValue: corporate_tax.difference,
      vsSubLabel: corporate_tax.rate_info,
    },
    referenceTable: {
      title: '법인세 과세표준 (2024년 기준)',
      columns: [
        { key: 'bracket', label: '과세표준', align: 'left' },
        { key: 'rate', label: '세율', align: 'center' },
        { key: 'formula', label: '계산식', align: 'left' },
      ],
      data: [
        { bracket: '2억원 이하', rate: '9%', formula: '과세표준 × 9%' },
        {
          bracket: '2억원 초과 ~ 200억원 이하',
          rate: '19%',
          formula: '1,800만원 + (2억원 초과분 × 19%)',
        },
        {
          bracket: '200억원 초과 ~ 3,000억원 이하',
          rate: '21%',
          formula: '37.62억원 + (200억원 초과분 × 21%)',
        },
        {
          bracket: '3,000억원 초과',
          rate: '24%',
          formula: '625.62억원 + (3,000억원 초과분 × 24%)',
        },
      ],
    },
  };
}

// ============================================
// cm4: 대표자 종합소득세 예상 가중 상세 모달 변환기
// ============================================

/**
 * 세금 시뮬레이션 API 응답을 cm4 (종합소득세) 모달 설정으로 변환
 */
export function transformCm4ModalConfig(
  data: TaxSimulationApiResponse
): DetailModalConfig {
  const { loan_summary, income_tax } = data;

  // 세금 증가율 계산
  const taxIncreaseRate =
    income_tax.without_loan.tax_amount > 0
      ? ((income_tax.difference / income_tax.without_loan.tax_amount) * 100).toFixed(1)
      : '0';

  return {
    title: '대표자 종합소득세 예상 가중 상세',
    summaryCards: [
      { label: '대표자 종합세 예상 가중', value: income_tax.difference, unit: '원' },
      {
        label: '추가 세금',
        value: `+${taxIncreaseRate}%`,
        isComparison: true,
        isPositive: false,
      },
      { label: '가지급금', value: formatKoreanCurrency(loan_summary.total_outstanding) },
      {
        label: `인정이자 ${(loan_summary.interest_rate * 100).toFixed(1)}%`,
        value: loan_summary.recognized_interest,
        unit: '원',
      },
    ],
    comparisonSection: {
      leftBox: {
        title: '가지급금 인정이자가 반영된 종합소득세',
        items: [
          {
            label: '현재 예상 과세표준 (근로소득+상여)',
            value: income_tax.with_loan.taxable_income,
            unit: '원',
          },
          { label: '현재 적용 세율', value: income_tax.with_loan.tax_rate },
          { label: '현재 예상 세액', value: income_tax.with_loan.tax_amount, unit: '원' },
        ],
        borderColor: 'orange',
      },
      rightBox: {
        title: '가지급금 인정이자가 정리된 종합소득세',
        items: [
          {
            label: '가지급금 정리 시 예상 과세표준 (근로소득+상여)',
            value: income_tax.without_loan.taxable_income,
            unit: '원',
          },
          { label: '가지급금 정리 시 적용 세율', value: income_tax.without_loan.tax_rate },
          {
            label: '가지급금 정리 시 예상 세액',
            value: income_tax.without_loan.tax_amount,
            unit: '원',
          },
        ],
        borderColor: 'blue',
      },
      vsLabel: '종합소득세 예상 절감',
      vsValue: income_tax.difference,
      vsSubLabel: `감소 세금 -${taxIncreaseRate}%`,
      vsBreakdown: [
        { label: '종합소득세', value: -income_tax.breakdown.income_tax, unit: '원' },
        { label: '지방소득세', value: -income_tax.breakdown.local_tax, unit: '원' },
        { label: '4대 보험', value: -income_tax.breakdown.insurance, unit: '원' },
      ],
    },
    referenceTable: {
      title: '종합소득세 과세표준 (2024년 기준)',
      columns: [
        { key: 'bracket', label: '과세표준', align: 'left' },
        { key: 'rate', label: '세율', align: 'center' },
        { key: 'deduction', label: '누진공제', align: 'right' },
        { key: 'formula', label: '계산식', align: 'left' },
      ],
      data: [
        { bracket: '1,400만원 이하', rate: '6%', deduction: '-', formula: '과세표준 × 6%' },
        {
          bracket: '1,400만원 초과 ~ 5,000만원 이하',
          rate: '15%',
          deduction: '126만원',
          formula: '과세표준 × 15% - 126만원',
        },
        {
          bracket: '5,000만원 초과 ~ 8,800만원 이하',
          rate: '24%',
          deduction: '576만원',
          formula: '과세표준 × 24% - 576만원',
        },
        {
          bracket: '8,800만원 초과 ~ 1.5억원 이하',
          rate: '35%',
          deduction: '1,544만원',
          formula: '과세표준 × 35% - 1,544만원',
        },
        {
          bracket: '1.5억원 초과 ~ 3억원 이하',
          rate: '38%',
          deduction: '1,994만원',
          formula: '과세표준 × 38% - 1,994만원',
        },
        {
          bracket: '3억원 초과 ~ 5억원 이하',
          rate: '40%',
          deduction: '2,594만원',
          formula: '과세표준 × 40% - 2,594만원',
        },
        {
          bracket: '5억원 초과 ~ 10억원 이하',
          rate: '42%',
          deduction: '3,594만원',
          formula: '과세표준 × 42% - 3,594만원',
        },
        {
          bracket: '10억원 초과',
          rate: '45%',
          deduction: '6,594만원',
          formula: '과세표준 × 45% - 6,594만원',
        },
      ],
    },
  };
}
