import { injectEvent } from "../../core/injector";
import {
  AppointmentProperties,
  EncounterProperties,
  HcwCatalogModel,
  PatientCatalogModel,
  PatientProperties,
  PatientMgmtCatalogType,
  PatientMgmtEventType,
  DiagnosisProperties,
} from "./typings";
import {
  validateAppointmentEvent,
  validateDiagnosisEvent,
  validateEncounterEvent,
  validatePatientEvent,
} from "./validators";
import {
  validateAndSaveHCWCatalog,
  validateAndSavePatientCatalog,
} from "./validators/PatientMgmtCatalogValidator";

/**
 * logPatientModuleEvent is to log the selection of the module selected by the user in the app.
 */
const logIngestEvent = async (
  eventType: PatientMgmtEventType,
  properties: PatientProperties | EncounterProperties | AppointmentProperties,
  sendNow = false,
  eventTime?: string
) => {
  let checkProps:
    | PatientProperties
    | EncounterProperties
    | AppointmentProperties
    | null = null;

  switch (eventType) {
    case PatientMgmtEventType.Patient:
      checkProps = validatePatientEvent(properties as PatientProperties);
      break;
    case PatientMgmtEventType.Encounter:
      checkProps = validateEncounterEvent(properties as EncounterProperties);
      break;
    case PatientMgmtEventType.Appointment:
      checkProps = validateAppointmentEvent(
        properties as AppointmentProperties
      );
      break;
    case PatientMgmtEventType.Diagnosis:
      checkProps = validateDiagnosisEvent(properties as DiagnosisProperties);
      break;
    default:
      return; // Exit early if eventType is unrecognized
  }

  if (!checkProps) {
    return; // Exit if the properties validation failed
  }

  injectEvent(eventType, properties.action, properties, sendNow, "", eventTime);
};

const logCatalogEvent = (
  subjectId: string,
  catalogType: PatientMgmtCatalogType,
  catalogModel: HcwCatalogModel | PatientCatalogModel
) => {
  switch (catalogType) {
    case PatientMgmtCatalogType.UserHcw:
      validateAndSaveHCWCatalog(subjectId, catalogModel as HcwCatalogModel);
      break;
    case PatientMgmtCatalogType.Patient:
      validateAndSavePatientCatalog(
        subjectId,
        catalogModel as PatientCatalogModel
      );
      break;
  }
};

export default {
  logIngestEvent,
  logCatalogEvent,
};
