/**
   * gets patients by checking Type of abnormal datas
   *
   * @param programIdKey
   * @param session
   * @param valueRangeType
   * @return
   */
  public List<Patient> checkTypeController(String programIdKey, String valueRangeType)
      throws Exception {

    // log.info("@@@@@@@@@@@@@@@@@@@@@ programIdKey "+programIdKey);

    List<Patient> patients = new ArrayList<Patient>();
    List<Patient> activePatients = new ArrayList<Patient>();
    List<Patient> patientsInHIVProgram = new ArrayList<Patient>();
    if (programIdKey.equals("PatientsWithNoProgramsEnrollmentDates")) {
      patients = getPatientsWithNoProgramsEnrollmentDates();
      DataqualityFormController.setMsgToDisplay("Patients with no programs enrollment dates");
    } else if (programIdKey.equals("PatientsDrugsWithDiscontinuedDateWithoutStartDate")) {
      patients = getPatientsDrugsWithDiscontinuedDateWithoutStartDate();
      DataqualityFormController.setMsgToDisplay(
          "Patients Drugs with discontinued date without start date");
    } else if (programIdKey.equals("DrugsWithDiscontinuedDateHigherThanDrugStartDate")) {
      patients = getPatientsWithDiscontinuedDateHigherThanDrugStartDate();
      DataqualityFormController.setMsgToDisplay("");
    } else if (programIdKey.equals("DrugsWithoutStartDate")) {
      patients = getPatientsWithoutStartDate();
      DataqualityFormController.setMsgToDisplay("Patients with Drugs without start date");
    } else if (programIdKey.equals("patientrsWithoutNames")) {
      patients = getPatientsWithoutNames();
      DataqualityFormController.setMsgToDisplay("Patientrs without names");
    } else if (programIdKey.equals("patientInAnyHivProgramWithoutAdmitionMode")) {
      // log.info("top  patientInAnyHivProgramWithoutAdmitionMode");
      patientsInHIVProgram = new ArrayList<Patient>();
      List<Patient> patientsWithNoAdmitionMode = new ArrayList<Patient>();
      // getting programs
      ProgramWorkflowService programService = Context.getProgramWorkflowService();
      Program hivProgram = programService.getProgram(getGlobalProperty("HIVProgramId"));
      patientsInHIVProgram = getPatientsCurrentlyInHIVProgram(hivProgram);
      patientsWithNoAdmitionMode =
          getPatientWithoutAdmitionModeConcept(
              getConcept(getGlobalProperty("concept.methodOfEnrollement")));
      for (Patient patient : patientsWithNoAdmitionMode) {
        if (patientsInHIVProgram.contains(patient)) {
          patients.add(patient);
        }
      }
      DataqualityFormController.setMsgToDisplay(
          "tracdataquality.indicator.patientInAnyHivProgramWithoutAdmitionMode");
      log.info("bottom  patientInAnyHivProgramWithoutAdmitionMode");
    } else if (programIdKey.equals("patientsWithoutProgram")) {
      log.info("top  patientsWithoutProgram");
      patients = getPatientWithoutProgram();
      DataqualityFormController.setMsgToDisplay("tracdataquality.indicator.patientsWithoutProgram");
      log.info("bottom  patientsWithoutProgram");
    } else if (programIdKey.equals("patientsWithnoWeight")) {
      log.info("top  patientsWithnoWeight");
      Concept concept = getConcept(getGlobalProperty("concept.weight"));
      patients = getPatientWithoutAgivenConcept(concept);
      DataqualityFormController.setMsgToDisplay("tracdataquality.indicator.patientsWithnoWeight");
      log.info("bottom  patientsWithnoWeight");
    } else if (programIdKey.equals("patientsWithNoHeight")) {
      log.info("top  patientsWithNoHeight");
      Concept concept = getConcept(getGlobalProperty("concept.height"));
      patients = getPatientWithoutAgivenConcept(concept);
      DataqualityFormController.setMsgToDisplay("tracdataquality.indicator.patientsWithNoHeight");
      log.info("bottom  patientsWithNoHeight");
    } else if (programIdKey.equals("patientWithNoHIVViralLoad")) {
      log.info("top  patientWithNoHIVViralLoad");
      List<Patient> patientsWithNoViralLoad = new ArrayList<Patient>();
      Concept viralLoadConcept = getConcept(getGlobalProperty("concept.viralLoad"));

      ProgramWorkflowService programService = Context.getProgramWorkflowService();
      Program hivProgram = programService.getProgram(getGlobalProperty("HIVProgramId"));
      patientsWithNoViralLoad = getPatientWithoutAgivenConcept(viralLoadConcept);

      patientsInHIVProgram = getPatientsCurrentlyInHIVProgram(hivProgram);
      for (Patient patient : patientsInHIVProgram) {
        if (patientsWithNoViralLoad.contains(patient)) {
          patients.add(patient);
        }
      }
      DataqualityFormController.setMsgToDisplay(
          "tracdataquality.indicator.patientWithNoHIVViralLoad");
      log.info("bottom  patientWithNoHIVViralLoad");
    } else if (programIdKey.equals("patientWithHIVPositiveAndNoCD4")) {
      log.info("top  patientWithHIVPositiveAndNoCD4");
      List<Patient> patientsWithNoCD4 = new ArrayList<Patient>();
      patientsInHIVProgram = new ArrayList<Patient>();
      Concept cd4 = getConcept(getGlobalProperty("concept.cd4_count"));
      ProgramWorkflowService programService = Context.getProgramWorkflowService();
      Program hivProgram = programService.getProgram(getGlobalProperty("HIVProgramId"));

      patientsWithNoCD4 = getPatientWithoutAgivenConcept(cd4);

      patientsInHIVProgram = getPatientsCurrentlyInHIVProgram(hivProgram);

      for (Patient patient : patientsInHIVProgram) {
        if (patientsWithNoCD4.contains(patient)) {
          patients.add(patient);
        }
      }
      DataqualityFormController.setMsgToDisplay(
          "tracdataquality.indicator.patientWithHIVPositiveAndNoCD4");
      log.info("bottom  patientWithHIVPositiveAndNoCD4");
    } else if (programIdKey.equals("patientWithNoWhoStage")) {
      log.info("top  patientWithNoWhoStage");
      Concept concept = getConcept(getGlobalProperty("concept.whoStage"));
      patients = getPatientWithoutAgivenConcept(concept);
      DataqualityFormController.setMsgToDisplay("tracdataquality.indicator.patientWithNoWhoStage");
      log.info("bottom  patientWithNoWhoStage");
    } else if (programIdKey.equals("patientWithMoreKgs")) {
      log.info("top  patientWithMoreKgs");
      // log.info("!!!!!!!!!!!!!!!!!!!!!!!! am getting in if statment");
      Concept concept = getConcept(getGlobalProperty("concept.weight"));
      // log.info("  !!!@@@@###$$%%^^&&**(())__++++++++++++++++  "+concept);
      double valueRange = Double.parseDouble(valueRangeType);
      // log.info("!!!!!!!!!!!!!!!!!!!!!!!  !!!@@@@###$$%%^^&&**(())__++++++++++++++++
      // "+valueRange);
      patients = getPatientsWithMoreValueOnConcept(concept, valueRange);
      DataqualityFormController.setMsgToDisplay(
          "Patients with more than " + valueRange + "   Weight");
      log.info("bottom  patientWithMoreKgs");
    } else if (programIdKey.equals("patientsWithMoreHeight")) {
      log.info("top  patientsWithMoreHeight");

      Concept concept = getConcept(getGlobalProperty("concept.height"));
      double valueRange = Double.parseDouble(valueRangeType);
      patients = getPatientsWithMoreValueOnConcept(concept, valueRange);
      DataqualityFormController.setMsgToDisplay(
          "Patients with more than " + valueRange + "   height");
      log.info("bottom  patientsWithMoreHeight");
    } else if (programIdKey.equals("patientsWithMoreBMI")) {
      log.info("top  patientsWithMoreBMI");
      Concept concept = getConcept(getGlobalProperty("concept.BMI"));
      double valueRange = Double.parseDouble(valueRangeType);
      patients = getPatientsWithMoreValueOnConcept(concept, valueRange);
      DataqualityFormController.setMsgToDisplay(
          "Patients with more than  " + valueRange + "   BMI");
      log.info("bottom  patientsWithMoreBMI");
    } else if (programIdKey.equals("patientsWithMoreBLOODOXYGENSATURATION")) {
      log.info("top  patientsWithMoreBLOODOXYGENSATURATION");
      double valueRange = Double.parseDouble(valueRangeType);
      patients =
          getPatientsWithMoreValueOnConcept(
              getConcept(getGlobalProperty("concept.bloodOxygenSaturation")), valueRange);
      DataqualityFormController.setMsgToDisplay(
          "Patients with more than " + valueRange + "  BLOODOXYGENSATURATION");
      log.info("bottom  patientsWithMoreBLOODOXYGENSATURATION");
    } else if (programIdKey.equals("patientsWithMoreDIASTOLICBLOODPRESSURE")) {
      log.info("top  patientsWithMoreDIASTOLICBLOODPRESSURE");
      double valueRange = Double.parseDouble(valueRangeType);
      patients =
          getPatientsWithMoreValueOnConcept(
              getConcept(getGlobalProperty("concept.diastolicBloodPressure")), valueRange);
      DataqualityFormController.setMsgToDisplay(
          "Patients with more than " + valueRange + "  of DIASTOLICBLOODPRESSURE");
      log.info("bottom  patientsWithMoreDIASTOLICBLOODPRESSURE");
    } else if (programIdKey.equals("patientsWithMoreHEADCIRCUMFERENCE")) {
      log.info("top  patientsWithMoreHEADCIRCUMFERENCE");
      double valueRange = Double.parseDouble(valueRangeType);
      patients =
          getPatientsWithMoreValueOnConcept(
              getConcept(getGlobalProperty("concept.headCircumference")), valueRange);
      DataqualityFormController.setMsgToDisplay(
          "Patients with more than " + valueRange + "   HEADCIRCUMFERENCE");
      log.info("bottom patientsWithMoreHEADCIRCUMFERENCE");
    } else if (programIdKey.equals("patientsWithMoreKARNOFSKYPERFORMANCESCORE")) {
      log.info("top  patientsWithMoreKARNOFSKYPERFORMANCESCORE");
      double valueRange = Double.parseDouble(valueRangeType);
      patients =
          getPatientsWithMoreValueOnConcept(
              getConcept(getGlobalProperty("concept.karnofskyPerformanceScore")), valueRange);
      DataqualityFormController.setMsgToDisplay(
          "Patients with more than " + valueRange + "  of KARNOFSKYPERFORMANCESCORE");
      log.info("bottom  patientsWithMoreKARNOFSKYPERFORMANCESCORE");
    } else if (programIdKey.equals("patientsWithMorePULSE")) {
      log.info("top  patientsWithMorePULSE");
      double valueRange = Double.parseDouble(valueRangeType);
      patients =
          getPatientsWithMoreValueOnConcept(
              getConcept(getGlobalProperty("concept.pulse")), valueRange);
      DataqualityFormController.setMsgToDisplay(
          "Patients with more than " + valueRange + "   PULSE");
      log.info("bottom  patientsWithMorePULSE");
    } else if (programIdKey.equals("patientsWithMoreRESPIRATORYRATE")) {
      log.info("top  patientsWithMoreRESPIRATORYRATE");
      double valueRange = Double.parseDouble(valueRangeType);
      patients =
          getPatientsWithMoreValueOnConcept(
              getConcept(getGlobalProperty("concept.respiratoryRate")), valueRange);
      DataqualityFormController.setMsgToDisplay(
          "Patients with more than " + valueRange + "   RESPIRATORYRATE");
      log.info("bottom  patientsWithMoreRESPIRATORYRATE");
    } else if (programIdKey.equals("patientsWithMoreSYSTOLICBLOODPRESSURE")) {
      log.info("top  patientsWithMoreSYSTOLICBLOODPRESSURE");
      double valueRange = Double.parseDouble(valueRangeType);
      patients =
          getPatientsWithMoreValueOnConcept(
              getConcept(getGlobalProperty("concept.systolicBloodPressure")), valueRange);
      DataqualityFormController.setMsgToDisplay(
          "Patients with more than " + valueRange + "   SYSTOLICBLOODPRESSURE");
      log.info("bottom  patientsWithMoreSYSTOLICBLOODPRESSURE");
    } else if (programIdKey.equals("patientsWithMoreTEMPERATURE")) {
      log.info("top  patientsWithMoreTEMPERATURE");
      double valueRange = Double.parseDouble(valueRangeType);
      patients =
          getPatientsWithMoreValueOnConcept(
              getConcept(getGlobalProperty("concept.temperature")), valueRange);
      DataqualityFormController.setMsgToDisplay(
          "Patients.With.More.Than" + valueRange + "  TEMPERATURE");
      log.info("bottom patientsWithMoreTEMPERATURE");
    } else if (programIdKey.equals("patientWithNoContactInformation")) {
      log.info("top  patientWithNoContactInformation");
      List<Patient> patientsWithoutPhoneNumber = new ArrayList<Patient>();
      List<Patient> patientsWithoutAlternativePhoneNumber = new ArrayList<Patient>();
      patientsWithoutPhoneNumber =
          getPatientWithoutAgivenConcept(
              getConcept(getGlobalProperty("concept.contactPhoneNumber")));
      patientsWithoutAlternativePhoneNumber =
          getPatientWithoutAgivenConcept(getConcept(getGlobalProperty("concept.phoneNumber")));
      for (Patient patient : patientsWithoutPhoneNumber) {
        if (patientsWithoutAlternativePhoneNumber.contains(patient)) {
          patients.add(patient);
        }
      }
      DataqualityFormController.setMsgToDisplay(
          "tracdataquality.indicator.patientWithNoContactInformation");
      log.info("bottom patientWithNoContactInformation");
    } else if (programIdKey.equals("patientWithNoTRACnet")) {
      log.info("top  patientWithNoTRACnet");
      // log.info("$$$$$$$$$$$$$$$$$$$$$$$$$ this is the tracnet
      // type"+getGlobalProperty("patientIdentifierType.TRACnetID"));
      patients =
          getPatientWithNoGivenIdentifier(getGlobalProperty("patientIdentifierType.TRACnetID"));
      DataqualityFormController.setMsgToDisplay(
          "tracdataquality.indicator.PatientsWithoutTRACnetID");
      log.info("bottom  patientWithNoTRACnet");
    } else if (programIdKey.equals("patientWithNoNID")) {
      log.info("top  patientWithNoNID");
      patients = getPatientWithNoGivenIdentifier(getGlobalProperty("patientIdentifierType.NID"));
      DataqualityFormController.setMsgToDisplay("tracdataquality.indicator.PatientsWithoutNID");
      log.info("bottom  patientWithNoNID");
    } else if (programIdKey.equals("exitedPatientWithProgram")) {
      log.info("top  exitedPatientWithProgram");
      List<Patient> patientsExitedFromCare = new ArrayList<Patient>();
      List<Patient> patientWithoutProgram = new ArrayList<Patient>();
      patientsExitedFromCare =
          getPatientWithAgivenConcept(getConcept(getGlobalProperty("concept.reasonExitedCare")));
      patientWithoutProgram = getPatientWithoutProgram();

      for (Patient patient : patientsExitedFromCare) {
        if (!patientWithoutProgram.contains(patient)) {
          patients.add(patient);
        }
      }
      DataqualityFormController.setMsgToDisplay(
          "tracdataquality.indicator.exitedPatientWithProgram");
      log.info("bottom  exitedPatientWithProgram");
    } else if (programIdKey.equals("patientInAnyHIVProgramWithNoHIVTestDate")) {
      log.info("top  patientInAnyHIVProgramWithNoHIVTestDate");
      //			List<Patient> patientsHIVProgram = new ArrayList<Patient>();
      List<Patient> patientsWithoutHIVTestDate = new ArrayList<Patient>();
      //			ProgramWorkflowService programService = Context.getProgramWorkflowService();
      patientsWithoutHIVTestDate =
          getPatientWithoutAdmitionModeConcept(
              getConcept(getGlobalProperty("concept.HIVTestDate")));
      log.info("number of patients with no hiv test date : " + patientsWithoutHIVTestDate.size());
      patients.addAll(patientsWithoutHIVTestDate);
      DataqualityFormController.setMsgToDisplay(
          "tracdataquality.indicator.patientInAnyHIVProgramWithNoHIVTestDate");
      log.info("bottom  patientInAnyHIVProgramWithNoHIVTestDate");
    } else if (programIdKey.equals("PatientsWhoStoppedRegimenAndReasonIsNotRecorded")) {
      log.info("top  PatientsWhoStoppedRegimenAndReasonIsNotRecorded");
      List<Integer> patientIds = new ArrayList<Integer>();

      DataQualityService serviceQualityCheck =
          ((DataQualityService) Context.getService(DataQualityService.class));
      patientIds = serviceQualityCheck.getPatientsWhoStoppedDrugWithoutDiscontinuedReason();

      for (Integer integer : patientIds) {
        Patient patient = getPatientById(integer);
        patients.add(patient);
      }
      DataqualityFormController.setMsgToDisplay(
          "tracdataquality.indicator.PatientsWhoStoppedRegimenAndReasonIsNotRecorded");
      log.info("bottom  PatientsWhoStoppedRegimenAndReasonIsNotRecorded");
    } else if (programIdKey.equals("PatientsPediatricsWhoHaveAdultWhoStage")) {
      log.info("top  PatientsPediatricsWhoHaveAdultWhoStage");
      patients = getPatientsPediatricsWhoHaveAdultWhoStage();
      DataqualityFormController.setMsgToDisplay(
          "tracdataquality.indicator.PatientsPediatricWhoHaveAdultWhoStage");
      /*log.info("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@bottom PatientsPediatricsWhoHaveAdultWhoStage"
      + patients);*/
    } else if (programIdKey.equals("PatientsAdultWhoHaveChildWhoStage")) {
      log.info("top  PatientsAdultWhoHaveChildWhoStage");
      patients = getPatientsAdultWhoHavePedsWhoStage();
      DataqualityFormController.setMsgToDisplay(
          "tracdataquality.indicator.PatientsAdultWhoHaveChildWhoStage");
      log.info("bottom  PatientsAdultWhoHaveChildWhoStage");
    } else if (programIdKey.equals("PatientsWhoAreInPMTCTWithNoCPNId")) {
      log.info("top  PatientsWhoAreInPMTCTWithNoCPNId");
      patients = getPatientsWhoAreInPMTCTWithNoCPNId();
      DataqualityFormController.setMsgToDisplay(
          "tracdataquality.indicator.PatientsInPMTCTWithNoCPNid");
      log.info("bottom  PatientsWhoAreInPMTCTWithNoCPNId");
    } else if (programIdKey.equals("PatientsWithNoReturnVisitDate")) {
      log.info("top  PatientsWithNoReturnVisitDate");
      patients =
          getPatientWithoutAgivenConcept(getConcept(getGlobalProperty("concept.returnVisitDate")));
      DataqualityFormController.setMsgToDisplay(
          "tracdataquality.indicator.PatientsWithNoReturnVisitDate");
      log.info("bottom  PatientsWithNoReturnVisitDate");
    }
    DataQualityService serviceQualityCheck =
        ((DataQualityService) Context.getService(DataQualityService.class));
    List<Integer> exitedPatient = serviceQualityCheck.getPatientsExitedFromCare();
    // log.info("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"+exitedPatient);
    // List<Integer> patientsExited = getPatientsExitedFromCare();
    for (Patient patient : patients) {
      // && !patientsExited.contains(patient.getPatientId())

      // = getPatientsExitedFromCare();
      if (!patient.isVoided() && !exitedPatient.contains(patient.getPatientId())) {

        activePatients.add(patient);
      }
    }

    Collections.sort(activePatients, new PatientSortByName());
    return activePatients;
  }