/**
 * backlogMonitoring.ts 단위 테스트
 *
 * 테스트 대상:
 *  - assessSLALevel : SLA 등급 판정
 *  - buildFCMPayload: FCM 페이로드 생성
 */

import { describe, it, expect } from 'vitest';
import { assessSLALevel, buildFCMPayload, SLAAssessment } from '../backlogMonitoring';

describe('assessSLALevel', () => {
  it('임계값 미만 → null', () => {
    expect(assessSLALevel({ pendingCount: 5, oldestPendingAgeHours: 24 })).toBeNull();
  });

  it('pendingCount 10 → WARNING', () => {
    const result = assessSLALevel({ pendingCount: 10, oldestPendingAgeHours: 1 });
    expect(result).not.toBeNull();
    expect(result!.level).toBe('WARNING');
  });

  it('pendingCount 20 → CRITICAL', () => {
    const result = assessSLALevel({ pendingCount: 20, oldestPendingAgeHours: 1 });
    expect(result).not.toBeNull();
    expect(result!.level).toBe('CRITICAL');
  });

  it('최장 대기 49시간 → WARNING', () => {
    const result = assessSLALevel({ pendingCount: 0, oldestPendingAgeHours: 49 });
    expect(result).not.toBeNull();
    expect(result!.level).toBe('WARNING');
  });

  it('최장 대기 97시간 → CRITICAL', () => {
    const result = assessSLALevel({ pendingCount: 0, oldestPendingAgeHours: 97 });
    expect(result).not.toBeNull();
    expect(result!.level).toBe('CRITICAL');
  });

  it('최장 대기 169시간 → ESCALATION', () => {
    const result = assessSLALevel({ pendingCount: 0, oldestPendingAgeHours: 169 });
    expect(result).not.toBeNull();
    expect(result!.level).toBe('ESCALATION');
  });

  it('0건, 0시간 → null', () => {
    expect(assessSLALevel({ pendingCount: 0, oldestPendingAgeHours: 0 })).toBeNull();
  });

  it('ESCALATION이 CRITICAL보다 우선 (pendingCount >= 20 AND 169시간 초과 → ESCALATION)', () => {
    const result = assessSLALevel({ pendingCount: 25, oldestPendingAgeHours: 169 });
    expect(result).not.toBeNull();
    expect(result!.level).toBe('ESCALATION');
  });

  it('CRITICAL이 WARNING보다 우선 (pendingCount >= 10 AND 97시간 초과 → CRITICAL)', () => {
    const result = assessSLALevel({ pendingCount: 10, oldestPendingAgeHours: 97 });
    expect(result).not.toBeNull();
    expect(result!.level).toBe('CRITICAL');
  });

  it('반환된 assessment의 pendingCount, oldestPendingAgeHours 일치', () => {
    const result = assessSLALevel({ pendingCount: 10, oldestPendingAgeHours: 50 });
    expect(result!.pendingCount).toBe(10);
    expect(result!.oldestPendingAgeHours).toBe(50);
  });

  it('message 형식 검증 (한국어 포함)', () => {
    const result = assessSLALevel({ pendingCount: 10, oldestPendingAgeHours: 50 });
    expect(result!.message).toBe('검토 대기 10건, 최장 대기 50시간 (SLA WARNING)');
  });
});

describe('buildFCMPayload', () => {
  const assessment: SLAAssessment = {
    level: 'CRITICAL',
    pendingCount: 25,
    oldestPendingAgeHours: 100,
    message: '검토 대기 25건, 최장 대기 100시간 (SLA CRITICAL)',
  };

  it('notification.title 형식 검증', () => {
    const payload = buildFCMPayload(assessment);
    expect(payload.notification.title).toBe('[InsuWiki] 검토 적체 CRITICAL');
  });

  it('notification.body = assessment.message', () => {
    const payload = buildFCMPayload(assessment);
    expect(payload.notification.body).toBe(assessment.message);
  });

  it('data는 Record<string, string> 구조', () => {
    const payload = buildFCMPayload(assessment);
    expect(typeof payload.data.level).toBe('string');
    expect(typeof payload.data.pendingCount).toBe('string');
    expect(typeof payload.data.oldestPendingAgeHours).toBe('string');
  });

  it('data.level = assessment.level', () => {
    const payload = buildFCMPayload(assessment);
    expect(payload.data.level).toBe('CRITICAL');
  });

  it('data.pendingCount, data.oldestPendingAgeHours 숫자 문자열', () => {
    const payload = buildFCMPayload(assessment);
    expect(payload.data.pendingCount).toBe('25');
    expect(payload.data.oldestPendingAgeHours).toBe('100');
  });
});
