/**
 * 검토 적체 모니터링 순수 로직
 *
 * Firebase 의존 없음 → 단위 테스트 용이
 */

export type SLALevel = 'WARNING' | 'CRITICAL' | 'ESCALATION';

export interface BacklogStats {
  pendingCount: number;
  oldestPendingAgeHours: number;
}

export interface SLAAssessment {
  level: SLALevel;
  pendingCount: number;
  oldestPendingAgeHours: number;
  message: string;
}

/**
 * SLA 등급 판정
 *
 * 우선순위: ESCALATION > CRITICAL > WARNING
 * - ESCALATION: 가장 오래된 대기 건이 168시간(7일) 초과
 * - CRITICAL: pendingCount >= 20 OR 가장 오래된 대기 건이 96시간 초과
 * - WARNING: pendingCount >= 10 OR 가장 오래된 대기 건이 48시간 초과
 * - 해당 없으면 null
 */
export function assessSLALevel(stats: BacklogStats): SLAAssessment | null {
  const { pendingCount, oldestPendingAgeHours } = stats;

  let level: SLALevel | null = null;

  if (oldestPendingAgeHours > 168) {
    level = 'ESCALATION';
  } else if (pendingCount >= 20 || oldestPendingAgeHours > 96) {
    level = 'CRITICAL';
  } else if (pendingCount >= 10 || oldestPendingAgeHours > 48) {
    level = 'WARNING';
  }

  if (level === null) return null;

  return {
    level,
    pendingCount,
    oldestPendingAgeHours,
    message: `검토 대기 ${pendingCount}건, 최장 대기 ${oldestPendingAgeHours}시간 (SLA ${level})`,
  };
}

/**
 * FCM 페이로드 생성
 */
export function buildFCMPayload(assessment: SLAAssessment): {
  notification: { title: string; body: string };
  data: Record<string, string>;
} {
  return {
    notification: {
      title: `[InsuWiki] 검토 적체 ${assessment.level}`,
      body: assessment.message,
    },
    data: {
      level: assessment.level,
      pendingCount: String(assessment.pendingCount),
      oldestPendingAgeHours: String(assessment.oldestPendingAgeHours),
    },
  };
}
