/**
 * 일일 일보 (DailyReport) 변환
 */

import type { DailyReportApiResponse } from '../types';
import type {
  DailyReportData,
  CheckPoint,
  CheckPointType,
} from '@/components/business/CEODashboard/types';
import { formatAmount, formatDate } from './common';

/**
 * 운영자금 안정성에 따른 색상 반환
 * 참조: AI 리포트 색상 체계 가이드 - 섹션 2.3
 */
function getStabilityColor(stability: string): 'red' | 'green' | 'blue' {
  switch (stability) {
    case 'stable':
      return 'blue';    // 6개월 이상 - 안정적
    case 'caution':
      return 'green';   // 3-6개월 - 주의 (주황 대신 green 사용, 기존 타입 호환)
    case 'warning':
      return 'red';     // 3개월 미만 - 경고
    default:
      return 'blue';
  }
}

/**
 * 운영자금 안정성 메시지 생성
 * - 음수: 현금성 자산 적자 상태
 * - 0~3개월: 자금 부족 우려
 * - 3~6개월: 자금 관리 필요
 * - 6개월 이상: 안정적
 */
function getStabilityMessage(months: number | null, stability: string, cashAsset: number): string {
  if (months === null) {
    return '월 운영비 데이터가 없어 안정성을 판단할 수 없습니다.';
  }

  // 현금성 자산이 음수인 경우 (적자 상태)
  if (cashAsset < 0 || months < 0) {
    return '현금성 자산이 부족한 상태입니다. 긴급 자금 확보가 필요합니다.';
  }

  // 운영 가능 기간이 거의 없는 경우 (1개월 미만)
  if (months < 1) {
    return '운영 자금이 거의 소진된 상태입니다. 즉시 자금 확보가 필요합니다.';
  }

  const monthsText = `${months}개월분`;

  switch (stability) {
    case 'stable':
      return `월 운영비용 대비 ${monthsText}이 확보되어 안정적입니다.`;
    case 'caution':
      return `월 운영비용 대비 ${monthsText}이 확보되어 있습니다. 자금 관리가 필요합니다.`;
    case 'warning':
      return `월 운영비용 대비 ${monthsText}만 확보되어 자금 부족 우려가 있습니다.`;
    default:
      return `월 운영비용 대비 ${monthsText}이 확보되어 있습니다.`;
  }
}

/**
 * 일일 일보 CheckPoints 생성
 * 참조: AI 리포트 색상 체계 가이드 - 섹션 2
 */
function generateDailyReportCheckPoints(api: DailyReportApiResponse): CheckPoint[] {
  const checkPoints: CheckPoint[] = [];

  // 출금 정보
  const withdrawal = api.krw_totals.expense;
  if (withdrawal > 0) {
    checkPoints.push({
      id: 'dr-withdrawal',
      type: 'info' as CheckPointType,
      message: `어제 ${formatAmount(withdrawal)} 출금했습니다.`,
      highlights: [
        { text: formatAmount(withdrawal), color: 'red' as const },
      ],
    });
  }

  // 입금 정보
  const deposit = api.krw_totals.income;
  if (deposit > 0) {
    checkPoints.push({
      id: 'dr-deposit',
      type: 'success' as CheckPointType,
      message: `어제 ${formatAmount(deposit)}이 입금되었습니다.`,
      highlights: [
        { text: formatAmount(deposit), color: 'green' as const },
        { text: '입금', color: 'green' as const },
      ],
    });
  }

  // 현금성 자산 + 운영자금 안정성 현황
  const cashAsset = api.cash_asset_total;
  const operatingMonths = api.operating_months;
  const operatingStability = api.operating_stability;
  const stabilityColor = getStabilityColor(operatingStability);
  const stabilityMessage = getStabilityMessage(operatingMonths, operatingStability, cashAsset);

  // 하이라이트 생성 (음수/적자 상태일 때는 "X개월분" 대신 다른 메시지)
  const isDeficit = cashAsset < 0 || (operatingMonths !== null && operatingMonths < 0);
  const isAlmostEmpty = operatingMonths !== null && operatingMonths >= 0 && operatingMonths < 1;

  const highlights: Array<{ text: string; color: 'red' | 'green' | 'blue' }> = [];

  if (isDeficit) {
    highlights.push({ text: '긴급 자금 확보 필요', color: 'red' });
  } else if (isAlmostEmpty) {
    highlights.push({ text: '즉시 자금 확보 필요', color: 'red' });
  } else if (operatingMonths !== null && operatingMonths >= 1) {
    highlights.push({ text: `${operatingMonths}개월분`, color: stabilityColor });
    if (operatingStability === 'stable') {
      highlights.push({ text: '안정적', color: 'blue' });
    } else if (operatingStability === 'warning') {
      highlights.push({ text: '자금 부족 우려', color: 'red' });
    }
  }

  checkPoints.push({
    id: 'dr-cash-asset',
    type: isDeficit || isAlmostEmpty ? 'warning' as CheckPointType : 'info' as CheckPointType,
    message: `총 현금성 자산이 ${formatAmount(cashAsset)}입니다. ${stabilityMessage}`,
    highlights,
  });

  return checkPoints;
}

/**
 * DailyReport API 응답 → Frontend 타입 변환
 */
export function transformDailyReportResponse(api: DailyReportApiResponse): DailyReportData {
  return {
    date: formatDate(api.date, api.day_of_week),
    cards: [
      {
        id: 'dr1',
        label: '일일일보',
        amount: api.cash_asset_total,
        path: '/ko/accounting/daily-report',
      },
      {
        id: 'dr2',
        label: '미수금 잔액',
        amount: api.receivable_balance ?? 0,
        path: '/ko/accounting/receivables-status',
      },
      {
        id: 'dr3',
        label: '미지급금 잔액',
        amount: api.payable_balance ?? 0,
        // 클릭 이동 없음
      },
      {
        id: 'dr4',
        label: '당월 예상 지출 합계',
        amount: api.monthly_expense_total ?? 0,
        // 클릭 시 당월 예상 지출 상세 팝업 (UI에서 처리)
      },
    ],
    checkPoints: generateDailyReportCheckPoints(api),
  };
}
