/**
 * 현황판 (StatusBoard) + 오늘의 이슈 (TodayIssue) 변환
 */

import type { StatusBoardApiResponse, TodayIssueApiResponse } from '../types';
import type {
  TodayIssueItem,
  TodayIssueListItem,
  TodayIssueListBadgeType,
  TodayIssueNotificationType,
} from '@/components/business/CEODashboard/types';
import { normalizePath } from './common';

// ============================================
// 현황판 (StatusBoard)
// ============================================
//
// [대시보드 vs 원본 페이지 쿼리 조건 차이 — 건수 불일치는 버그 아님]
//
// | 항목           | 대시보드 조건                                      | 원본 페이지                              |
// |----------------|---------------------------------------------------|------------------------------------------|
// | 수주 현황      | 오늘 날짜 + status=confirmed만                     | /sales/order-management-sales (전체 기간) |
// | 채권 추심      | status=collecting + is_active=true만               | /accounting/bad-debt-collection (전체)    |
// | 안전 재고      | safety_stock>0 && stock_qty<safety_stock (날짜무관) | /material/stock-status (날짜 필터 적용)   |
// | 세금 신고      | 가장 가까운 tax 일정 D-day                          | /accounting/tax-invoices                  |
// | 신규 업체      | 최근 7일 이내 등록된 거래처만                        | /accounting/vendors (전체 목록)            |
// | 연차 현황      | 오늘 기준 approved 휴가만                           | /hr/vacation-management (전체 기간)       |
// | 발주 현황      | status=draft(임시저장)만                            | /construction/order (전체 상태)            |
// | 결재 요청      | 현재 로그인 사용자의 pending 결재만                  | /approval/inbox (필터 조건 다름)           |
//

/**
 * 현황판 subLabel: 백엔드 sub_label 필드 직접 사용
 */
function buildStatusSubLabel(item: { sub_label?: string }): string | undefined {
  return item.sub_label || undefined;
}

/**
 * 프론트 path 오버라이드: 백엔드 path가 잘못되거나 링크 불필요한 항목
 * - 값이 빈 문자열: 클릭 비활성화 (일정 표시 등 링크 불필요)
 * - 값이 경로 문자열: 백엔드 path 대신 사용
 */
const STATUS_BOARD_PATH_OVERRIDE: Record<string, string> = {
  tax_deadline: '/accounting/tax-invoices',  // 백엔드 /accounting/tax → 실제 페이지
  // purchases: '/accounting/purchase',      // [2026-03-03] 비활성화 — purchases 항목 자체를 숨김 (N4 참조)
};

/**
 * [2026-03-03] 비활성화 항목: 백엔드 이슈 해결 전까지 현황판에서 숨김
 * - purchases: path 오류(건설경로 하드코딩) + 데이터 정합성 미확인 (API-SPEC N4 참조)
 */
const STATUS_BOARD_HIDDEN_ITEMS = new Set(['purchases']);

/**
 * StatusBoard API 응답 → Frontend 타입 변환
 * API 응답 형식이 TodayIssueItem과 거의 동일하므로 단순 매핑
 */
export function transformStatusBoardResponse(api: StatusBoardApiResponse): TodayIssueItem[] {
  return api.items.filter((item) => !STATUS_BOARD_HIDDEN_ITEMS.has(item.id)).map((item) => {
    const overridePath = STATUS_BOARD_PATH_OVERRIDE[item.id];
    const path = overridePath !== undefined
      ? overridePath
      : normalizePath(item.path, { addViewMode: true });

    return {
      id: item.id,
      label: item.label,
      count: item.count,
      subLabel: buildStatusSubLabel(item),
      path,
      isHighlighted: item.isHighlighted,
    };
  });
}

// ============================================
// 오늘의 이슈 (TodayIssue)
// ============================================

/** 유효한 notification_type 목록 (API TodayIssue 모델과 동기화) */
const VALID_NOTIFICATION_TYPES: TodayIssueNotificationType[] = [
  'sales_order',
  'bad_debt',
  'safety_stock',
  'expected_expense',
  'vat_report',
  'approval_request',
  'new_vendor',
  'deposit',
  'withdrawal',
  'other',
];

/** notification_type → 한글 badge 변환 매핑
 * 백엔드 TodayIssue.php BADGE 상수와 동기화!
 */
const NOTIFICATION_TYPE_TO_BADGE: Record<TodayIssueNotificationType, TodayIssueListBadgeType> = {
  sales_order: '수주등록',
  bad_debt: '추심이슈',
  safety_stock: '안전재고',
  expected_expense: '지출 승인대기',
  vat_report: '세금 신고',
  approval_request: '결재 요청',
  new_vendor: '신규거래처',
  deposit: '입금',
  withdrawal: '출금',
  other: '기타',
};

/** 한글 badge → notification_type 추론 매핑 (fallback용)
 * 백엔드 TodayIssue.php BADGE 상수와 동기화 필수!
 */
const BADGE_TO_NOTIFICATION_TYPE: Record<string, TodayIssueNotificationType> = {
  // === 백엔드 실제 값 (TodayIssue.php 상수) ===
  '수주등록': 'sales_order',
  '추심이슈': 'bad_debt',
  '안전재고': 'safety_stock',
  '지출 승인대기': 'expected_expense',
  '세금 신고': 'vat_report',
  '결재 요청': 'approval_request',
  '신규거래처': 'new_vendor',
  '신규업체': 'new_vendor',  // 변형
  '입금': 'deposit',
  '출금': 'withdrawal',
  // === 혹시 모를 변형 (안전장치) ===
  '수주 등록': 'sales_order',
  '추심 이슈': 'bad_debt',
  '안전 재고': 'safety_stock',
  '지출승인대기': 'expected_expense',
  '세금신고': 'vat_report',
  '결재요청': 'approval_request',
};

/**
 * API notification_type → Frontend notificationType 변환
 * notification_type이 없으면 badge에서 추론
 */
function validateNotificationType(notificationType: string | null, badge?: string): TodayIssueNotificationType {
  // 1. notification_type이 유효하면 그대로 사용
  if (notificationType && VALID_NOTIFICATION_TYPES.includes(notificationType as TodayIssueNotificationType)) {
    return notificationType as TodayIssueNotificationType;
  }
  // 2. notification_type이 없으면 badge에서 추론
  if (badge && BADGE_TO_NOTIFICATION_TYPE[badge]) {
    return BADGE_TO_NOTIFICATION_TYPE[badge];
  }
  return 'other';
}

/**
 * TodayIssue API 응답 → Frontend 타입 변환
 * 오늘의 이슈 리스트 데이터 변환
 * notification_type 코드값 기반으로 색상 매핑 지원
 */
export function transformTodayIssueResponse(api: TodayIssueApiResponse): {
  items: TodayIssueListItem[];
  totalCount: number;
} {
  return {
    items: api.items.map((item) => {
      // notification_type이 없으면 badge에서 추론
      const notificationType = validateNotificationType(item.notification_type, item.badge);
      // badge는 API 응답 그대로 사용하되, 없으면 notification_type에서 변환
      const badge = item.badge || NOTIFICATION_TYPE_TO_BADGE[notificationType];

      return {
        id: item.id,
        badge: badge as TodayIssueListBadgeType,
        notificationType,
        content: item.content,
        time: item.time,
        date: item.date,
        needsApproval: item.needsApproval ?? false,
        path: normalizePath(item.path, { addViewMode: true }),
      };
    }),
    totalCount: api.total_count,
  };
}
