/**
 * Status Configuration Utility
 *
 * 상태 관련 설정(OPTIONS, LABELS, STYLES)을 단일 설정에서 생성하는 유틸리티
 *
 * 사용 예시:
 * ```ts
 * const { STATUS_OPTIONS, STATUS_LABELS, STATUS_STYLES, getStatusLabel, getStatusStyle } =
 *   createStatusConfig({
 *     pending: { label: '대기', style: 'warning' },
 *     completed: { label: '완료', style: 'success' },
 *     rejected: { label: '반려', style: 'destructive' },
 *   }, { includeAll: true, allLabel: '전체' });
 * ```
 */

// 프리셋 스타일 정의
export type StatusStylePreset =
  | 'default'
  | 'success'
  | 'warning'
  | 'destructive'
  | 'info'
  | 'muted'
  | 'orange'
  | 'purple';

// 프리셋 스타일 맵 (Badge 스타일 - 배경 + 텍스트)
export const BADGE_STYLE_PRESETS: Record<StatusStylePreset, string> = {
  default: 'bg-gray-100 text-gray-800',
  success: 'bg-green-100 text-green-800',
  warning: 'bg-yellow-100 text-yellow-800',
  destructive: 'bg-red-100 text-red-800',
  info: 'bg-blue-100 text-blue-800',
  muted: 'bg-gray-100 text-gray-500',
  orange: 'bg-orange-100 text-orange-800',
  purple: 'bg-purple-100 text-purple-800',
};

// 프리셋 스타일 맵 (Text 스타일 - 텍스트만)
export const TEXT_STYLE_PRESETS: Record<StatusStylePreset, string> = {
  default: 'text-gray-600 font-medium',
  success: 'text-green-600 font-medium',
  warning: 'text-yellow-600 font-medium',
  destructive: 'text-red-500 font-medium',
  info: 'text-blue-500 font-medium',
  muted: 'text-gray-400 font-medium',
  orange: 'text-orange-500 font-medium',
  purple: 'text-purple-500 font-medium',
};

// 단일 상태 설정 타입
export interface StatusItemConfig {
  /** 표시 라벨 */
  label: string;
  /** 프리셋 스타일 또는 커스텀 클래스 */
  style: StatusStylePreset | string;
}

// createStatusConfig 옵션
export interface CreateStatusConfigOptions {
  /** '전체' 옵션 포함 여부 (기본값: false) */
  includeAll?: boolean;
  /** '전체' 옵션 라벨 (기본값: '전체') */
  allLabel?: string;
  /** 스타일 모드: 'badge' (배경+텍스트) 또는 'text' (텍스트만) */
  styleMode?: 'badge' | 'text';
}

// 반환 타입
export interface StatusConfig<T extends string> {
  /** Select 컴포넌트용 옵션 배열 */
  STATUS_OPTIONS: ReadonlyArray<{ value: T | 'all'; label: string }>;
  /** 상태별 라벨 맵 */
  STATUS_LABELS: Record<T, string>;
  /** 상태별 스타일 맵 */
  STATUS_STYLES: Record<T, string>;
  /** 상태값으로 라벨 가져오기 */
  getStatusLabel: (status: T) => string;
  /** 상태값으로 스타일 가져오기 */
  getStatusStyle: (status: T) => string;
}

/**
 * 상태 설정 생성 유틸리티
 *
 * @param config - 상태별 설정 객체
 * @param options - 추가 옵션
 * @returns STATUS_OPTIONS, STATUS_LABELS, STATUS_STYLES 및 헬퍼 함수
 */
export function createStatusConfig<T extends string>(
  config: Record<T, StatusItemConfig>,
  options: CreateStatusConfigOptions = {}
): StatusConfig<T> {
  const { includeAll = false, allLabel = '전체', styleMode = 'badge' } = options;

  const stylePresets = styleMode === 'badge' ? BADGE_STYLE_PRESETS : TEXT_STYLE_PRESETS;

  // STATUS_LABELS 생성
  const STATUS_LABELS = Object.entries(config).reduce(
    (acc, [key, value]) => {
      acc[key as T] = (value as StatusItemConfig).label;
      return acc;
    },
    {} as Record<T, string>
  );

  // STATUS_STYLES 생성
  const STATUS_STYLES = Object.entries(config).reduce(
    (acc, [key, value]) => {
      const { style } = value as StatusItemConfig;
      // 프리셋 스타일이면 변환, 아니면 커스텀 클래스 그대로 사용
      acc[key as T] =
        style in stylePresets ? stylePresets[style as StatusStylePreset] : style;
      return acc;
    },
    {} as Record<T, string>
  );

  // STATUS_OPTIONS 생성
  const statusOptions = Object.entries(config).map(([key, value]) => ({
    value: key as T,
    label: (value as StatusItemConfig).label,
  }));

  const STATUS_OPTIONS = includeAll
    ? [{ value: 'all' as const, label: allLabel }, ...statusOptions]
    : statusOptions;

  // 헬퍼 함수
  const getStatusLabel = (status: T): string => STATUS_LABELS[status] || status;
  const getStatusStyle = (status: T): string => STATUS_STYLES[status] || '';

  return {
    STATUS_OPTIONS: STATUS_OPTIONS as ReadonlyArray<{ value: T | 'all'; label: string }>,
    STATUS_LABELS,
    STATUS_STYLES,
    getStatusLabel,
    getStatusStyle,
  };
}

/**
 * 프리셋 스타일을 CSS 클래스로 변환하는 헬퍼
 */
export function getPresetStyle(
  preset: StatusStylePreset,
  mode: 'badge' | 'text' = 'badge'
): string {
  const presets = mode === 'badge' ? BADGE_STYLE_PRESETS : TEXT_STYLE_PRESETS;
  return presets[preset] || presets.default;
}

// ============================================================
// 공통 우선순위 설정
// ============================================================

/**
 * 우선순위 타입
 */
export type PriorityType = 'urgent' | 'priority' | 'normal';

/**
 * 우선순위 라벨
 */
export const PRIORITY_LABELS: Record<PriorityType, string> = {
  urgent: '긴급',
  priority: '우선',
  normal: '일반',
};

/**
 * 우선순위 Badge 스타일
 */
export const PRIORITY_BADGE_STYLES: Record<PriorityType, string> = {
  urgent: 'bg-red-100 text-red-700 border-red-200',
  priority: 'bg-orange-100 text-orange-700 border-orange-200',
  normal: 'bg-gray-100 text-gray-700 border-gray-200',
};

/**
 * 한글 우선순위 라벨 → 영문 키 매핑
 */
const PRIORITY_LABEL_TO_KEY: Record<string, PriorityType> = {
  '긴급': 'urgent',
  '우선': 'priority',
  '일반': 'normal',
};

/**
 * 우선순위 라벨 가져오기
 * @param priority - 영문 키('urgent') 또는 한글 라벨('긴급')
 */
export function getPriorityLabel(priority: string): string {
  // 이미 한글이면 그대로 반환
  if (PRIORITY_LABEL_TO_KEY[priority]) {
    return priority;
  }
  return PRIORITY_LABELS[priority as PriorityType] || priority;
}

/**
 * 우선순위 스타일 가져오기
 * @param priority - 영문 키('urgent') 또는 한글 라벨('긴급')
 */
export function getPriorityStyle(priority: string): string {
  // 한글 라벨이면 영문 키로 변환
  const key = PRIORITY_LABEL_TO_KEY[priority] || (priority as PriorityType);
  return PRIORITY_BADGE_STYLES[key] || PRIORITY_BADGE_STYLES.normal;
}

// ============================================================
// 공통 품목 유형 설정
// ============================================================

/**
 * 품목 유형 타입
 */
export type ItemType = 'FG' | 'PT' | 'SM' | 'RM' | 'CS';

/**
 * 품목 유형 라벨
 */
export const ITEM_TYPE_LABELS: Record<ItemType, string> = {
  FG: '제품',
  PT: '부품',
  SM: '부자재',
  RM: '원자재',
  CS: '소모품',
};

/**
 * 품목 유형 Badge 스타일
 */
export const ITEM_TYPE_BADGE_STYLES: Record<ItemType, string> = {
  FG: 'bg-purple-100 text-purple-700 border-purple-200',
  PT: 'bg-orange-100 text-orange-700 border-orange-200',
  SM: 'bg-green-100 text-green-700 border-green-200',
  RM: 'bg-blue-100 text-blue-700 border-blue-200',
  CS: 'bg-gray-100 text-gray-700 border-gray-200',
};

/**
 * 품목 유형 라벨 가져오기
 */
export function getItemTypeLabel(itemType: string): string {
  return ITEM_TYPE_LABELS[itemType as ItemType] || itemType;
}

/**
 * 품목 유형 스타일 가져오기
 */
export function getItemTypeStyle(itemType: string): string {
  return ITEM_TYPE_BADGE_STYLES[itemType as ItemType] || ITEM_TYPE_BADGE_STYLES.CS;
}

// ============================================================
// 공통 상태 설정 (미리 생성된 설정)
// ============================================================

/**
 * 기본 상태 설정 (대기/진행/완료)
 */
export const COMMON_STATUS_CONFIG = createStatusConfig({
  pending: { label: '대기', style: 'warning' },
  in_progress: { label: '진행중', style: 'info' },
  completed: { label: '완료', style: 'success' },
}, { includeAll: true });

/**
 * 작업 상태 설정 (작업대기/진행중/작업완료)
 */
export const WORK_STATUS_CONFIG = createStatusConfig({
  waiting: { label: '작업대기', style: 'warning' },
  in_progress: { label: '진행중', style: 'info' },
  completed: { label: '작업완료', style: 'success' },
}, { includeAll: true });

/**
 * 승인 상태 설정
 */
export const APPROVAL_STATUS_CONFIG = createStatusConfig({
  pending: { label: '승인대기', style: 'warning' },
  approved: { label: '승인완료', style: 'success' },
  rejected: { label: '반려', style: 'destructive' },
}, { includeAll: true });

/**
 * 활성/비활성 상태 설정
 */
export const ACTIVE_STATUS_CONFIG = createStatusConfig({
  active: { label: '활성', style: 'success' },
  inactive: { label: '비활성', style: 'muted' },
}, { includeAll: true });

/**
 * 출고 상태 설정
 */
export const SHIPMENT_STATUS_CONFIG = createStatusConfig({
  scheduled: { label: '출고예정', style: 'default' },
  ready: { label: '출고대기', style: 'warning' },
  shipping: { label: '출고중', style: 'info' },
  completed: { label: '출고완료', style: 'success' },
}, { includeAll: true });

/**
 * 입고 상태 설정
 */
export const RECEIVING_STATUS_CONFIG = createStatusConfig({
  scheduled: { label: '입고예정', style: 'default' },
  pending: { label: '입고대기', style: 'warning' },
  inspecting: { label: '검사중', style: 'info' },
  completed: { label: '입고완료', style: 'success' },
  rejected: { label: '반품', style: 'destructive' },
}, { includeAll: true });

// ============================================================
// 회계 도메인 상태 설정
// ============================================================

/**
 * 악성채권 추심 상태 (커스텀 border 스타일)
 */
export const BAD_DEBT_COLLECTION_STATUS_CONFIG = createStatusConfig({
  collecting: { label: '추심중', style: 'border-orange-300 text-orange-600 bg-orange-50' },
  legalAction: { label: '법적조치', style: 'border-red-300 text-red-600 bg-red-50' },
  collectionEnd: { label: '추심종료', style: 'border-green-300 text-green-600 bg-green-50' },
}, { includeAll: true });

/**
 * 세금계산서 상태
 */
export const TAX_INVOICE_STATUS_CONFIG = createStatusConfig({
  pending: { label: '미분개', style: 'bg-yellow-100 text-yellow-700' },
  journalized: { label: '분개완료', style: 'bg-green-100 text-green-700' },
  error: { label: '오류', style: 'bg-red-100 text-red-700' },
});

/**
 * 어음 상태 (수취/발행 공통 색상)
 */
export const BILL_STATUS_CONFIG = createStatusConfig({
  stored: { label: '보관중', style: 'info' },
  maturityAlert: { label: '만기입금(7일전)', style: 'warning' },
  maturityResult: { label: '만기결과', style: 'orange' },
  paymentComplete: { label: '결제완료', style: 'success' },
  collectionRequest: { label: '추심의뢰', style: 'purple' },
  collectionComplete: { label: '추심완료', style: 'bg-teal-100 text-teal-800' },
  suing: { label: '추소중', style: 'destructive' },
  dishonored: { label: '부도', style: 'muted' },
});

/**
 * 매출 상태
 */
export const SALES_STATUS_CONFIG = createStatusConfig({
  monthlyClose: { label: '당월마감', style: 'success' },
  lastMonth: { label: '전월', style: 'default' },
  agreed: { label: '합의', style: 'info' },
  outstanding: { label: '미수', style: 'destructive' },
}, { includeAll: true });

/**
 * 입금 상태
 */
export const DEPOSIT_STATUS_CONFIG = createStatusConfig({
  inputWaiting: { label: '입력대기', style: 'warning' },
  requesting: { label: '신청중', style: 'info' },
  rejected: { label: '반려', style: 'destructive' },
  pending: { label: '보류', style: 'default' },
  incomplete: { label: '미완', style: 'orange' },
  error: { label: '오류', style: 'destructive' },
  confirmed: { label: '확정완료', style: 'success' },
});

/**
 * 지급 상태 (지출 예상 내역)
 */
export const PAYMENT_STATUS_CONFIG = createStatusConfig({
  pending: { label: '미지급', style: 'warning' },
  partial: { label: '부분지급', style: 'orange' },
  paid: { label: '지급완료', style: 'success' },
  overdue: { label: '연체', style: 'destructive' },
}, { includeAll: true });

/**
 * 매칭 상태 (일일일보)
 */
export const MATCH_STATUS_CONFIG = createStatusConfig({
  matched: { label: '매칭', style: 'bg-green-100 text-green-700' },
  unmatched: { label: '비매칭', style: 'bg-orange-100 text-orange-700' },
});

export default createStatusConfig;
