import {
  Treatment,
  basicTreatList,
  detailTreatList,
  prescribeDrugList,
} from '@lib/codef/src/codef.dto';

/**
 * 쿠콘 '내진료정보열람' 응답(Result) → 내부 Treatment 계약 변환.
 *
 * 쿠콘 Result 구조:
 *   { 개인진료정보요약[], 기본진료내역[], 세부진료정보[], 처방조제정보[] }
 * 내부 계약(CODEF와 동일):
 *   Treatment { resBasicTreatList[], resDetailTreatList[], resPrescribeDrugList[] }
 *
 * 필드 매핑은 codef-used.xlsx(실제 저장 필드)와 1:1.
 * 단, resHospitalCode는 쿠콘 미제공 → undefined.
 */
export function mapCooconMedicalToTreatment(result: any): Treatment {
  const t = new Treatment();
  t.resBasicTreatList = mapBasic(result?.['기본진료내역']);
  t.resDetailTreatList = mapDetail(result?.['세부진료정보']);
  t.resPrescribeDrugList = mapPrescribe(result?.['처방조제정보']);
  return t;
}

/**
 * 쿠콘 '내진료정보열람(보험종별=2)' 자동차보험 응답 → Treatment(자동차 전용 필드 포함).
 * createCarTreat→자동차 분석은 진료일수/의료비를 **자동차 전용 필드**(resTreatDate/resMedicalFee)에서 읽는다.
 *   - resTreatDate(진료일수)            ← 내원일수
 *   - resTotalAmount(청구진료비 총금액)  ← 총진료비 (건강 매퍼가 이미 채움)
 *   - resMedicalFee(자동차보험 총진료비) ← 혜택받은금액(보험부담분)
 * ⚠️ 쿠콘 자동차 응답은 건강과 동일 한글키 구조라 '자동차보험 총진료비' 전용 필드가 없다.
 *    혜택받은금액(보험부담)으로 근사한다(octover와 동일). 쿠콘 자동차 실응답으로 검증 후 보정 필요.
 *    (자동차는 처방 없음 → resPrescribeDrugList 는 건강 매퍼 결과상 빈 배열)
 */
export function mapCooconCarToTreatment(result: any): Treatment {
  const t = mapCooconMedicalToTreatment(result); //* 건강 공통 필드 재사용
  const basics = asArray(result?.['기본진료내역']);
  (t.resBasicTreatList ?? []).forEach((o, i) => {
    const r = basics[i];
    if (!r) return;
    o.resTreatDate = r?.['내원일수'] ?? ''; //* 진료일수
    o.resMedicalFee = r?.['혜택받은금액'] ?? ''; //* 자동차보험 총진료비(근사: 보험부담) — 실응답 검증 필요
  });
  return t;
}

function asArray(v: any): any[] {
  if (!v) return [];
  return Array.isArray(v) ? v : [v];
}

function mapBasic(list: any): basicTreatList[] {
  return asArray(list).map((r) => {
    const o = new basicTreatList();
    o.resTreatStartDate = r?.['진료시작일'] ?? '';
    o.resHospitalName = r?.['병의원약국'] ?? '';
    o.resDepartment = r?.['진단과'] ?? '';
    o.resTreatType = r?.['입원_외래'] ?? '';
    o.resDiseaseCode = r?.['주상병코드'] ?? '';
    o.resDiseaseName = r?.['주상병명'] ?? '';
    o.resVisitDays = r?.['내원일수'] ?? '';
    o.resTotalAmount = r?.['총진료비'] ?? '';
    o.resPublicCharge = r?.['혜택받은금액'] ?? '';
    o.resDeductibleAmt = r?.['내가낸의료비'] ?? '';
    //* 쿠콘 미제공 — CODEF의 resHospitalCode 대응값 없음
    o.resHospitalCode = undefined;
    return o;
  });
}

function mapDetail(list: any): detailTreatList[] {
  return asArray(list).map((r) => {
    const o = new detailTreatList();
    o.resTreatStartDate = r?.['진료시작일'] ?? '';
    o.resHospitalName = r?.['병의원약국'] ?? '';
    o.resTreatType = r?.['진료내역'] ?? '';
    o.resCodeName = r?.['코드명'] ?? '';
    o.resOneDose = r?.['1회투약량'] ?? '';
    o.resDailyDosesNumber = r?.['1회투여횟수'] ?? '';
    o.resTotalDosingdays = r?.['총투약일수'] ?? '';
    return o;
  });
}

function mapPrescribe(list: any): prescribeDrugList[] {
  return asArray(list).map((r) => {
    const o = new prescribeDrugList();
    o.resTreatStartDate = r?.['진료시작일'] ?? '';
    o.resHospitalName = r?.['병의원약국'] ?? '';
    o.resTreatType = r?.['처방_조제'] ?? '';
    o.resDrugName = r?.['약품명'] ?? '';
    o.resIngredients = r?.['성분명'] ?? '';
    o.resOneDose = r?.['1회투약량'] ?? '';
    o.resDailyDosesNumber = r?.['1회투여횟수'] ?? '';
    o.resTotalDosingdays = r?.['총투약일수'] ?? '';
    return o;
  });
}
