import { DATE_FORMAT, DATE_TIME_FORMAT } from '@/lib/constants';
import { Tables } from '@/packages/supabase/src/database.types';
import { format } from 'date-fns';

import PersonalCode from '../utils';

const isProd = process.env.NODE_ENV === 'production';

export const getPais = (
  sender: string,
  recipient: string,
  orderId: number,
  packageName: string,
) => {
  return `<Pais>
    <Pakett versioon="20">${packageName}</Pakett>
    <Saatja>${sender}</Saatja>
    <Saaja>${recipient}</Saaja>
    <Aeg>${format(new Date(), DATE_TIME_FORMAT)}</Aeg>
    <SaadetisId>${orderId}</SaadetisId>
    <Email>info@medreport.ee</Email>
  </Pais>`;
};

export const getClientInstitution = ({ index }: { index?: number } = {}) => {
  return `<Asutus tyyp="TELLIJA" ${index ? ` jarjenumber="${index}"` : ''}>
      <AsutuseId>16381793</AsutuseId>
      <AsutuseNimi>MedReport OÜ</AsutuseNimi>
      <AsutuseKood>MRP</AsutuseKood>
      <Telefon>+37258871517</Telefon>
    </Asutus>`;
};

export const getProviderInstitution = ({ index }: { index?: number } = {}) => {
  return `<Asutus tyyp="TEOSTAJA" ${index ? ` jarjenumber="${index}"` : ''}>
      <AsutuseId>11107913</AsutuseId>
      <AsutuseNimi>Synlab Eesti OÜ</AsutuseNimi>
      <AsutuseKood>HTI</AsutuseKood>
      <AllyksuseNimi>Synlab HTI Tallinn</AllyksuseNimi>
      <Telefon>+37217123</Telefon>
    </Asutus>`;
};

export const getClientPerson = () => {
  return `<Personal tyyp="TELLIJA" jarjenumber="1">
      <PersonalOID>1.3.6.1.4.1.28284.6.2.4.9</PersonalOID>
      <PersonalKood>D07907</PersonalKood>
      <PersonalPerekonnaNimi>Eduard</PersonalPerekonnaNimi>
      <PersonalEesNimi>Tsvetkov</PersonalEesNimi>
      <Telefon>+37258131202</Telefon>
    </Personal>`;
};

export const getOrderEnteredPerson = () => {
  return `<Personal tyyp="SISESTAJA" jarjenumber="2">
      <PersonalOID>1.3.6.1.4.1.28284.6.2.4.9</PersonalOID>
      <PersonalKood>D07907</PersonalKood>
      <PersonalPerekonnaNimi>Eduard</PersonalPerekonnaNimi>
      <PersonalEesNimi>Tsvetkov</PersonalEesNimi>
      <Telefon>+37258131202</Telefon>
    </Personal>`;
};

export const getPatient = ({
  idCode,
  lastName,
  firstName,
}: {
  idCode: string;
  lastName: string;
  firstName: string;
}) => {
  const { dob, gender } = PersonalCode.parsePersonalCode(idCode);
  return `<Patsient>
		<IsikukoodiOID>1.3.6.1.4.1.28284.6.2.2.1</IsikukoodiOID>
		<Isikukood>${idCode}</Isikukood>
		<PerekonnaNimi>${lastName}</PerekonnaNimi>
		<EesNimi>${firstName}</EesNimi>
		<SynniAeg>${format(dob, DATE_FORMAT)}</SynniAeg>
		<SuguOID>1.3.6.1.4.1.28284.6.2.3.16.2</SuguOID>
		<Sugu>${gender.value === 'M' ? 'M' : 'N'}</Sugu>
	</Patsient>`;
};

export const getConfidentiality = () => {
  if (isProd) {
    // return correct data
  }
  return `<Konfidentsiaalsus>
      <PatsiendileOID>2.16.840.1.113883.5.25</PatsiendileOID>
      <Patsiendile>N</Patsiendile>
      <ArstileOID>1.3.6.1.4.1.28284.6.2.2.39.1</ArstileOID>
      <Arstile>N</Arstile>
      <EsindajaleOID>1.3.6.1.4.1.28284.6.2.2.37.1</EsindajaleOID>
      <Esindajale>N</Esindajale>
    </Konfidentsiaalsus>`;
};

// export const getOrderEnteredByPerson = () => {
//   if (isProd) {
//     // return correct data
//   }
//   return `
//   	<Personal tyyp="SISESTAJA" jarjenumber="1">
//       <PersonalOID>1.3.6.1.4.1.28284.6.2.4.9</PersonalOID>
//       <PersonalKood>D07907</PersonalKood>
//       <PersonalPerekonnaNimi>Eduard</PersonalPerekonnaNimi>
//       <PersonalEesNimi>Tsvetkov</PersonalEesNimi>
//       <Telefon>+37258131202</Telefon>
// 	</Personal>`;
// };

export const getSpecimen = (
  materialTypeOid: string,
  materialGroupId: string,
  materialName: string,
  order: number,
  sampleContainerOid?: string,
  sampleContainerId?: string,
) =>
  `
  <Proov>
      ${sampleContainerOid ? `<ProovinouIdOID>${sampleContainerOid}</ProovinouIdOID>` : null}
      ${sampleContainerId ? `<ProovinouId>${sampleContainerId}</ProovinouId>` : null}
      <MaterjaliTyypOID>${materialTypeOid}</MaterjaliTyypOID>
      <MaterjaliTyyp>${materialGroupId}</MaterjaliTyyp>
      <MaterjaliNimi>${materialName}</MaterjaliNimi>
      <Jarjenumber>${order}</Jarjenumber>
    </Proov>`;

export const getAnalysisElement = (
  analysisIdOid: string,
  analysisIdOriginal: string,
  tehikShortLoinc: string,
  tehikLoincName: string,
  analysisElementId: number,
  analysisNameLab?: string | null,
) => {
  return `<UuringuElement>
		<UuringIdOID>${analysisIdOid}</UuringIdOID>
		<UuringId>${analysisIdOriginal}</UuringId>
		<TLyhend>${tehikShortLoinc}</TLyhend>
		<KNimetus>${tehikLoincName}</KNimetus>
		<UuringNimi>${analysisNameLab ?? tehikLoincName}</UuringNimi>
		<TellijaUuringId>${analysisElementId}</TellijaUuringId>
	</UuringuElement>`;
};

export const getAnalysisGroup = (
  analysisGroupOriginalId: string,
  analysisGroupName: string,
  uuringElementInputs: {
    analysisElement: Tables<{ schema: 'medreport' }, 'analysis_elements'>;
    specimenOrderNr: number;
  }[],
) => {
  const uuringElements = uuringElementInputs
    .map(
      ({ analysisElement, specimenOrderNr }) =>
        `<Uuring>
		${getAnalysisElement(analysisElement.analysis_id_oid, analysisElement.analysis_id_original, analysisElement.tehik_short_loinc, analysisElement.tehik_loinc_name, analysisElement.id, analysisElement.analysis_name_lab)}
		<ProoviJarjenumber>${specimenOrderNr}</ProoviJarjenumber>
		</Uuring>`,
    )
    .join('');

  return `<UuringuGrupp>
		<UuringuGruppId>${analysisGroupOriginalId}</UuringuGruppId>
		<UuringuGruppNimi>${analysisGroupName}</UuringuGruppNimi>
		${uuringElements}
	</UuringuGrupp>`;
};
