import { HttpStatus } from '@nestjs/common';
import { AppException, ErrorCode } from '../../common/errors';
import { normalizeTeeth } from './treatment.utils';

export type LabCaseProsthesisLink = {
  treatmentDetailId: string;
  detail: { id: string; treatmentType: string; teeth: unknown };
};

export type LabCaseToothProsthesisRow = {
  treatmentDetailId: string;
  tooth: string;
  prosthesisTypeCode: string;
};

export function assertCompleteToothProsthesisMap(labCase: {
  details: LabCaseProsthesisLink[];
  toothProsthesis: LabCaseToothProsthesisRow[];
}) {
  const prosthesisByKey = new Set(
    labCase.toothProsthesis.map((tp) => `${tp.treatmentDetailId}:${tp.tooth}`),
  );

  for (const link of labCase.details) {
    if (link.detail.treatmentType !== 'prosthesis') {
      continue;
    }
    const teeth = normalizeTeeth(link.detail.teeth);
    for (const tooth of teeth) {
      const key = `${link.treatmentDetailId}:${tooth}`;
      if (!prosthesisByKey.has(key)) {
        throw new AppException(ErrorCode.TREATMENT_TOOTH_PROSTHESIS_INCOMPLETE, HttpStatus.BAD_REQUEST);
      }
    }
    if (teeth.length === 0) {
      const hasArchJob = labCase.toothProsthesis.some(
        (tp) =>
          tp.treatmentDetailId === link.treatmentDetailId &&
          (tp.tooth === 'UA' || tp.tooth === 'LA') &&
          Boolean(tp.prosthesisTypeCode),
      );
      if (!hasArchJob) {
        throw new AppException(ErrorCode.TREATMENT_TOOTH_PROSTHESIS_INCOMPLETE, HttpStatus.BAD_REQUEST);
      }
    }
  }
}
