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

/**
 * 옥토버 AB001 응답(data) → 내부 Treatment 계약(CODEF/쿠콘과 동일 res* 필드).
 * 매핑 근거: 레퍼런스 octover-hira-mapping.md(실호출 검증).
 *  - basicArray → resBasicTreatList (discountCharge=공단부담, selfCharge=본인부담)
 *  - detailArray → resDetailTreatList (diagnosisData=진료내역, oneDoseCount=1회투여횟수)
 *  - pharmacyArray → resPrescribeDrugList (IngredientName=성분명)
 */
export function mapOctoverToTreatment(data: AB001Data): Treatment {
  const t = new Treatment();
  t.resBasicTreatList = (data?.basicArray ?? []).map((r) => {
    const o = new basicTreatList();
    o.resTreatStartDate = r.diagnosisStartDate ?? '';
    o.resHospitalName = r.hospitalName ?? '';
    o.resDepartment = r.department ?? '';
    o.resTreatType = r.type ?? '';
    //* '$'/'해당없음' → 빈값 정규화
    o.resDiseaseCode = r.mainDiseaseCode && r.mainDiseaseCode !== '$' ? r.mainDiseaseCode : '';
    o.resDiseaseName =
      r.mainDiseaseName && r.mainDiseaseName !== '해당없음' ? r.mainDiseaseName : '';
    o.resVisitDays = r.visitDateCount ?? '';
    o.resTotalAmount = r.totalCharge ?? '';
    o.resPublicCharge = r.discountCharge ?? '';
    o.resDeductibleAmt = r.selfCharge ?? '';
    o.resHospitalCode = r.hospitalCode ?? '';
    return o;
  });
  t.resDetailTreatList = (data?.detailArray ?? []).map((r) => {
    const o = new detailTreatList();
    o.resTreatStartDate = r.diagnosisStartDate ?? '';
    o.resHospitalName = r.hospitalName ?? '';
    o.resTreatType = r.diagnosisData ?? '';
    o.resCodeName = r.codeName ?? '';
    o.resOneDose = r.oneDose ?? '';
    o.resDailyDosesNumber = r.oneDoseCount ?? '';
    o.resTotalDosingdays = r.totalDosingdays ?? '';
    return o;
  });
  t.resPrescribeDrugList = (data?.pharmacyArray ?? []).map((r) => {
    const o = new prescribeDrugList();
    o.resTreatStartDate = r.diagnosisStartDate ?? '';
    o.resHospitalName = r.hospitalName ?? '';
    o.resTreatType = r.diagnosisData ?? '';
    o.resDrugName = r.drugName ?? '';
    o.resIngredients = r.IngredientName ?? '';
    o.resOneDose = r.oneDose ?? '';
    o.resDailyDosesNumber = r.oneDoseCount ?? '';
    o.resTotalDosingdays = r.totalDosingdays ?? '';
    return o;
  });
  return t;
}

/**
 * 옥토버 자동차보험 AB001 응답(insureType=1) → 내부 Treatment(자동차 전용 필드 포함).
 * createCarTreat→자동차 분석은 진료일수/의료비를 **자동차 전용 필드**(resTreatDate/resMedicalFee)에서 읽는다.
 *   - resTreatDate(진료일수)  ← visitDateCount(내원일수)
 *   - resTotalAmount(청구진료비 총금액) ← totalCharge (건강 매퍼가 이미 채움)
 *   - resMedicalFee(자동차보험 총진료비) ← discountCharge(혜택받은금액=보험부담분)
 * ⚠️ 옥토버 자동차 응답은 건강과 동일 basicArray 구조라 '자동차보험 총진료비' 전용 필드가 없다.
 *    discountCharge(보험부담) 로 근사한다. 옥토버 자동차 실응답으로 의미 검증 후 보정 필요.
 *    (자동차는 처방 없음 → resPrescribeDrugList 는 건강 매퍼 결과상 빈 배열)
 */
export function mapOctoverCarToTreatment(data: AB001Data): Treatment {
  const t = mapOctoverToTreatment(data); //* 건강 공통 필드(상병/병원/총액/세부) 재사용
  (t.resBasicTreatList ?? []).forEach((o, i) => {
    const r = data?.basicArray?.[i];
    if (!r) return;
    o.resTreatDate = r.visitDateCount ?? ''; //* 진료일수
    o.resMedicalFee = r.discountCharge ?? ''; //* 자동차보험 총진료비(근사: 보험부담) — 실응답 검증 필요
  });
  return t;
}
