001package org.hl7.fhir.r5.terminologies.utilities;
002
003import org.hl7.fhir.r5.model.Parameters;
004import org.hl7.fhir.r5.model.Parameters.ParametersParameterComponent;
005import org.hl7.fhir.utilities.MarkedToMoveToAdjunctPackage;
006import org.hl7.fhir.utilities.Utilities;
007
008
009@MarkedToMoveToAdjunctPackage
010public class SnomedUtilities {
011
012  public static String getVersionFromParameters(Parameters p, String version) {
013    for (ParametersParameterComponent pp : p.getParameter()) {
014      switch (pp.getName()) {
015      case "system-version" :
016        if (version == null) {
017          return pp.getValue().primitiveValue();
018        }
019      case "force-system-version":
020        return pp.getValue().primitiveValue();
021      }
022    }
023    return version;
024  }
025
026  public static String getEditionFromVersion(String version) {
027    if (version == null) {
028      return null;
029    }
030    if (version.startsWith("http://snomed.info/sct/")) {
031      version = version.substring(23);
032    }
033    if (version.contains("/")) {
034      version = version.substring(0, version.indexOf("/"));
035    }
036    if (Utilities.existsInList(version,
037      "900000000000207008", // International
038      "449081005", // International Spanish
039      "11000221109", // Argentinian
040      "32506021000036107", // Australian (with drug extension)
041      "11000234105", // Austrian
042      "11000172109", // Belgian
043      "20621000087109", // Canadian English
044      "20611000087101", // Canadian Canadian French
045      "21000325107", // Chilean
046      "11000279109", // Czech
047      "554471000005108", //: Danish
048      "11000181102", //: Estonian
049      "11000229106", //: Finnish
050      "11000274103", //: German
051      "1121000189102", //: Indian
052      "11000220105", //: Irish
053      "11000146104", //: Netherlands
054      "21000210109", //: New Zealand
055      "51000202101", //: Norwegian
056      "11000267109", //: Republic of Korea (South Korea)
057      "900000001000122104", //: Spanish National
058      "45991000052106", //: Swedish
059      "2011000195101", //: Swiss
060      "83821000000107", //: UK
061      "999000021000000109", //: UK Clinical
062      "5631000179106", //: Uruguay
063      "731000124108", //: US
064      "5991000124107", //: US (with ICD-10-CM maps)
065      "827022005" //: IPS Terminology
066      )) {
067      return version;
068    } else {
069      return null;
070    }
071  }
072
073  public static String getSctLink(String version, String code, Parameters p) {
074    if (!Utilities.noString(code) && !code.contains(":")) { 
075      version = SnomedUtilities.getVersionFromParameters(p, version);
076      String edId = SnomedUtilities.getEditionFromVersion(version);
077      if (edId != null) {
078        // if there's a version that's an edition, then:
079        // http://snomed.info/sct/11000172109/id//371305003
080        return "http://snomed.info/sct/"+edId+"/id/"+code;
081      } else {
082        // no, version:
083        return "http://snomed.info/id/"+code;
084      }
085    } else { 
086      return "https://browser.ihtsdotools.org/"; 
087    } 
088  }
089}
090
091