@Override
  public void forSave(Encounter encounter, EncounterTransaction encounterTransaction) {
    List<EncounterTransaction.Diagnosis> diagnoses = encounterTransaction.getDiagnoses();
    if (!diagnoses.isEmpty()) {
      Set<Obs> obsAtTopLevel = encounter.getObsAtTopLevel(false);
      Concept bahmniDiagnosisStatusConcept =
          bahmniDiagnosisMetadata.diagnosisSchemaContainsStatus()
              ? bahmniDiagnosisMetadata.getBahmniDiagnosisStatusConcept()
              : null;
      Concept bahmniInitialDiagnosisConcept =
          bahmniDiagnosisMetadata.getBahmniInitialDiagnosisConcept();
      Concept bahmniDiagnosisRevisedConcept =
          bahmniDiagnosisMetadata.getBahmniDiagnosisRevisedConcept();

      for (EncounterTransaction.Diagnosis diagnosis : diagnoses) {
        BahmniDiagnosisRequest bahmniDiagnosisRequest = (BahmniDiagnosisRequest) diagnosis;
        addExtraMetadata(
            obsAtTopLevel,
            bahmniDiagnosisRequest,
            bahmniInitialDiagnosisConcept,
            bahmniDiagnosisStatusConcept,
            bahmniDiagnosisRevisedConcept);
        updateRevisedFlagOfPreviousDiagnosis(bahmniDiagnosisRequest, bahmniDiagnosisRevisedConcept);
      }
    }
  }
  private void addExtraMetadata(
      Set<Obs> obsAtTopLevel,
      BahmniDiagnosisRequest bahmniDiagnosisRequest,
      Concept bahmniInitialDiagnosisConcept,
      Concept bahmniDiagnosisStatusConcept,
      Concept bahmniDiagnosisRevisedConcept) {
    Obs matchingDiagnosisObs =
        bahmniDiagnosisMetadata.findMatchingDiagnosis(obsAtTopLevel, bahmniDiagnosisRequest);

    updateInitialDiagnosis(
        matchingDiagnosisObs, bahmniDiagnosisRequest, bahmniInitialDiagnosisConcept);
    if (bahmniDiagnosisStatusConcept != null) {
      updateDiagnosisStatus(
          matchingDiagnosisObs, bahmniDiagnosisRequest, bahmniDiagnosisStatusConcept);
    }
    updateRevisedFlag(matchingDiagnosisObs, false, bahmniDiagnosisRevisedConcept);
  }