import { toInsightReportV2 } from './insight-report-v2';

/**
 * ddx `insight-v0.9`(고객사 수정요청 2026-10-12) 새 필드의 투영.
 *
 * 합성 report 를 이 파일 안에서 손으로 짓는다 — `insight-report-v2.spec.ts` 의 fixture 는 상위 저장소
 * `.claude/plans` 에 있어 이 저장소만으로는 돌지 않는다. 키 · 형은 ddx `unclaimed.py` · `insight_report.py`
 * (insight-v0.9) 가 내는 모양 그대로다.
 *
 *   - `salesTip.sections[].scripts[].tags` — 카드 상자 태그(조직검사 · 영상검사 · 수술 · 항암 · 투약)
 *   - `coverageFound.items[].rows[].covers` — 행마다 점검 담보
 *   - `coverageFound.items[].rows[].visits[]` — `{recordId, item, itemSource}` 진료별 관련 항목
 *   - `coverageFound.items[].rows[].accidentNo` · `carRecords[].accidentNo` — 자동차 사고 번호(3개월 묶음)
 */

const v09 = {
  salesTip: {
    sections: [
      {
        key: 'sales',
        scripts: [
          { findingId: 'F-1', tags: ['조직검사', '수술'] },
          { findingId: 'F-2' },
        ],
      },
    ],
  },
  coverageFound: {
    items: [
      {
        type: '숨은 보험',
        covers: ['응급실내원비', '간병비'],
        rows: [
          {
            text: '응급실내원비(응급,비응급)',
            tab: '기타',
            recordIds: ['R-1'],
            covers: ['응급실내원비'],
            visits: [
              { recordId: 'R-1', item: '응급의료관리료', itemSource: 'matched' },
            ],
          },
          { text: '통합간병서비스', tab: '기타', recordIds: ['R-2'] },
        ],
      },
      {
        type: '자동차보험',
        covers: ['자부상'],
        accidents: [{ no: 1, recordIds: ['C-1'] }],
        rows: [{ facility: '가병원', recordIds: ['C-1'], accidentNo: 1 }],
      },
    ],
  },
  carRecords: [{ facility: '가병원', recordIds: ['C-1'], accidentNo: 1 }],
};

describe('toInsightReportV2 — insight-v0.9 (수정요청 10.12)', () => {
  it('v0.9 — 새 필드가 값 그대로 선다', () => {
    const out = toInsightReportV2(v09);
    const [t] = out?.salesTip.sections[0].scripts ?? [];
    expect(t.tags).toEqual(['조직검사', '수술']);
    const [hidden, car] = out?.coverageFound.items ?? [];
    expect(hidden.rows[0].covers).toEqual(['응급실내원비']);
    expect(hidden.rows[0].visits).toEqual([
      { recordId: 'R-1', item: '응급의료관리료', itemSource: 'matched' },
    ]);
    expect(car.rows[0].accidentNo).toBe(1);
    expect(out?.carRecords[0].accidentNo).toBe(1);
  });

  it('v0.9 — 원본에 없는 새 키는 빈 배열 · null 로 선다', () => {
    const out = toInsightReportV2(v09);
    expect(out?.salesTip.sections[0].scripts[1].tags).toEqual([]);
    const row = out?.coverageFound.items[0].rows[1];
    expect([row?.covers, row?.visits, row?.accidentNo]).toEqual([[], [], null]);
    //* v0.8 이전 응답(새 키가 하나도 없다)도 같다 — 서버가 화면보다 먼저 나가도 화면은 줄을 세우지 않는다.
    const old = toInsightReportV2({
      salesTip: { sections: [{ key: 'sales', scripts: [{ findingId: 'F' }] }] },
      coverageFound: { items: [{ type: '숨은 보험', rows: [{ text: 'x' }] }] },
      carRecords: [{ facility: '가병원' }],
    });
    expect(old?.salesTip.sections[0].scripts[0].tags).toEqual([]);
    expect(old?.coverageFound.items[0].rows[0].visits).toEqual([]);
    expect(old?.carRecords[0].accidentNo).toBeNull();
  });

  it('v0.9 — 형이 맞지 않는 새 필드는 null · 빈 배열이고 객체가 아닌 진료 원소는 빠진다', () => {
    const out = toInsightReportV2({
      salesTip: { sections: [{ key: 'sales', scripts: [{ tags: '조직검사' }] }] },
      coverageFound: {
        items: [
          {
            rows: [
              {
                covers: '간병비',
                visits: ['R-1', null, { recordId: 7, item: ['배열'], itemSource: 'hint' }],
                accidentNo: '1',
              },
            ],
          },
        ],
      },
      carRecords: [{ accidentNo: '1' }],
    });
    expect(out?.salesTip.sections[0].scripts[0].tags).toEqual([]);
    const row = out?.coverageFound.items[0].rows[0];
    expect(row?.covers).toEqual([]);
    expect(row?.visits).toEqual([{ recordId: null, item: null, itemSource: 'hint' }]);
    expect(row?.accidentNo).toBeNull();
    expect(out?.carRecords[0].accidentNo).toBeNull();
  });

  it('v0.9 — 진료 원소는 이름 붙은 세 키만 옮긴다', () => {
    const out = toInsightReportV2({
      coverageFound: {
        items: [
          {
            rows: [
              {
                visits: [
                  { recordId: 'R-1', item: 'x', itemSource: 'hint', person: '__LEAK__' },
                ],
              },
            ],
          },
        ],
      },
    });
    expect(JSON.stringify(out)).not.toContain('__LEAK__');
    expect(Object.keys(out?.coverageFound.items[0].rows[0].visits[0] ?? {}).sort()).toEqual([
      'item',
      'itemSource',
      'recordId',
    ]);
  });

  it('v0.9 — 자동차 항목 행과 carRecords 는 사고 번호까지 짝이 맞는다', () => {
    //* 화면(`ANS015.insight.ts#sameAsRow`)은 carRecords 원소가 가진 키 전부가 항목 행의 같은 키와 같을 때만 숨긴다.
    //* 한쪽에만 `accidentNo` 를 실으면 같은 병원이 대체 카드로 한 번 더 선다.
    const out = toInsightReportV2(v09);
    const row = out?.coverageFound.items[1].rows[0] as unknown as Record<string, unknown>;
    const car = out?.carRecords[0] as unknown as Record<string, unknown>;
    for (const [k, v] of Object.entries(car))
      expect([k, JSON.stringify(v ?? null)]).toEqual([k, JSON.stringify(row[k] ?? null)]);
  });

  it('v0.9 — 항목 수준 accidents 는 싣지 않는다(화면이 읽지 않는다)', () => {
    const out = toInsightReportV2(v09);
    expect(Object.keys(out?.coverageFound.items[1] ?? {})).not.toContain('accidents');
  });
});
