/*
   * Metodo que imprime directamente en una impresra byte
   */
  public void printExtra(CexAgenda turno) throws IOException {
    // FileInputStream inputStream = null;
    InputStream tex = null;
    SimpleDateFormat sf = new SimpleDateFormat("dd/MM/yyyy");
    String fecha = sf.format(turno.getCagFecha());
    SimpleDateFormat sfHora = new SimpleDateFormat("HH:mm");
    String hora = "";
    String te2;
    if (turno.getCagHora() != null) {
      hora = sfHora.format(turno.getCagHora());
    }
    String impresora = "SIN IMPRESORA";
    PrintService impresora11 = null;
    try {
      // inputStream = new FileInputStream("e:/archivo.txt");

      String cadena =
          "************************************* \n\n"
                      + "RESPONSABLE: "
                      + turno.getCagNombreUsuario()
                      + " \n"
                      + "FECHA: "
                      + fecha
                      + " \n"
                      + turno.getCagNombreInstitucion()
                      + "\n"
                      + turno
                          .getCexHorariosDia()
                          .getCexHorario()
                          .getCexEspecialidadMedico()
                          .getCexEspecialidad()
                          .getCesNombre()
                      + "\n"
                      + "NÚMERO CARPETA: "
                      + turno.getHosReferencia()
                  != null
              ? turno.getHosReferencia().getCexHistoriaInstitucion().getCicNumeroCarpeta()
              : turno.getCexHistoriaInstitucion().getCicNumeroCarpeta()
                          + "\n"
                          + "CÉDULA: "
                          + turno.getHosReferencia()
                      != null
                  ? turno
                      .getHosReferencia()
                      .getCexHistoriaInstitucion()
                      .getCexHistoriaClinica()
                      .getChcCedula()
                  : turno.getCexHistoriaInstitucion().getCexHistoriaClinica().getChcCedula()
                              + "\n"
                              + "TURNO: "
                              + turno.getCagSecuencia()
                              + "\t HORA: "
                              + hora
                              + " \n"
                              + "MEDICO: "
                              + turno
                                  .getCexHorariosDia()
                                  .getCexHorario()
                                  .getCexEspecialidadMedico()
                                  .getAdmMedico()
                                  .getAmeNombreFull()
                              + "\n"
                              + "PACIENTE: "
                              + turno.getHosReferencia()
                          != null
                      ? turno
                          .getHosReferencia()
                          .getCexHistoriaInstitucion()
                          .getCexHistoriaClinica()
                          .getChcNombreFull()
                      : turno.getCexHistoriaInstitucion().getCexHistoriaClinica().getChcNombreFull()
                          + "\n"
                          + "*******   TURNO        EXTRA    ********\n"
                          + "\n"
                          + "\n"
                          + "SE RECOMIENDA ESTAR 30 MIN ANTES\n"
                          + " DE LA HORA ESPECIFICADA\n"
                          + "\n";
      te2 = converteCaracter(cadena);
      tex = new ByteArrayInputStream(te2.getBytes("UTF-8"));

    } catch (UnsupportedEncodingException e) {
      log.error("printExtra() {} ", e.getMessage());
    }
    if (tex == null) {
      return;
    }

    DocFlavor docFormat = DocFlavor.INPUT_STREAM.AUTOSENSE;
    Doc document = new SimpleDoc(tex, docFormat, null);

    PrintRequestAttributeSet attributeSet = new HashPrintRequestAttributeSet();

    for (AdmDatosGlobales datoGlobal : listaImpresorasturnos) {
      if (user.getIp().equals(datoGlobal.getClave())) {
        impresora = datoGlobal.getValor();
        break;
      }
    }
    // PrintService impresora11 = PrintServiceLookup.lookupDefaultPrintService();
    PrintService[] printService = PrintServiceLookup.lookupPrintServices(null, null);
    for (PrintService printService1 : printService) {
      if (printService1.getName().equals(impresora)) {
        impresora11 = printService1;
      }
    }

    if (impresora11 != null) {
      DocPrintJob printJob = impresora11.createPrintJob();
      try {
        printJob.print(document, attributeSet);
      } catch (PrintException e) {
        log.error("printExtra() {} ", e.getMessage());
      }
    } else {
      log.error("No existen impresoras instaladas");
    }

    tex.close();
  }
  /**
   * Metodo que busca una historia clinica
   *
   * @author David Carranza
   */
  public void buscarHistorial() {
    String nombreMetodo = Thread.currentThread().getStackTrace()[1].getMethodName() + "()";
    FacesContext context = FacesContext.getCurrentInstance();
    try {
      lista.clear();
      parametroBusqueda = parametroBusqueda.trim();
      CexHistoriaInstitucion cexHistoriaClinica = new CexHistoriaInstitucion();
      if (parametroBusqueda.equals("")) {
        FacesContext.getCurrentInstance()
            .addMessage(
                findComponent(context.getViewRoot(), "valorBusqueda").getClientId(),
                new FacesMessage(
                    FacesMessage.SEVERITY_ERROR,
                    "Valor nullo no permitido",
                    "Ingrese parametro de busqueda"));
      } else {
        if (tipoBusqueda == 1) {
          // Buscar Historia Clinica
          cexHistoriaClinica =
              (CexHistoriaInstitucion)
                  adminObject.buscar(
                      CexHistoriaInstitucion.class,
                      "admInstitucion",
                      user.getUser().getAdmInstitucion(),
                      "cicNumeroCarpeta",
                      parametroBusqueda);
        } else if (tipoBusqueda == 2) {
          cexHistoriaClinica =
              (CexHistoriaInstitucion)
                  adminObject.buscar(
                      CexHistoriaInstitucion.class,
                      "admInstitucion",
                      user.getUser().getAdmInstitucion(),
                      "cexHistoriaClinica.chcCedula",
                      parametroBusqueda);
        }

        // Buscar pedidos por consulta sin  referencia
        if (cexHistoriaClinica != null) {
          // recorre las agendas solo que tenga preparacion y consulta
          if (cexHistoriaClinica.getCexAgendaList() != null) {
            for (CexAgenda objAge : cexHistoriaClinica.getCexAgendaList()) {
              // Verifica que tengan preparacion
              if (objAge.getCagEstado() > 1) {
                if (objAge.getCexPreparacionList() != null) {
                  for (CexPreparacion objPreparacion : objAge.getCexPreparacionList()) {
                    // Recorrer Consulta
                    if (objPreparacion.getCexConsultaList() != null) {
                      for (CexConsulta objConsulta : objPreparacion.getCexConsultaList()) {
                        // Recorrer pedido de laboratorio
                        if (objConsulta.getCexPedidoLaboratorioList() != null) {
                          for (CexPedidoLaboratorio objLaboratorio :
                              objConsulta.getCexPedidoLaboratorioList()) {
                            // añadir pedidos de laboratorio a lista general
                            lista.add(objLaboratorio);
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }

        // Buscar pedidos por consulta con referencia
        if (cexHistoriaClinica != null) {
          // recorre las referencias que esten asignadas a la historia a consultar
          if (cexHistoriaClinica.getHosReferenciaList() != null) {
            for (HosReferencia objRef : cexHistoriaClinica.getHosReferenciaList()) {
              // recorre las agendas solo que tenga preparacion y consulta
              if (objRef.getCexAgendaList() != null) {
                for (CexAgenda objAge : objRef.getCexAgendaList()) {
                  // Verifica que tengan preparacion
                  if (objAge.getCagEstado() > 1) {
                    if (objAge.getCexPreparacionList() != null) {
                      for (CexPreparacion objPreparacion : objAge.getCexPreparacionList()) {
                        // Recorrer Consulta
                        if (objPreparacion.getCexConsultaList() != null) {
                          for (CexConsulta objConsulta : objPreparacion.getCexConsultaList()) {
                            // Recorrer pedido de laboratorio
                            if (objConsulta.getCexPedidoLaboratorioList() != null) {
                              for (CexPedidoLaboratorio objLaboratorio :
                                  objConsulta.getCexPedidoLaboratorioList()) {
                                // añadir pedidos de laboratorio a lista general
                                lista.add(objLaboratorio);
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }

        // Buscar por internacion que tengan referencia
        if (cexHistoriaClinica != null) {
          // recorre las referencias que esten asignadas a la historia a consultar
          if (cexHistoriaClinica.getHosReferenciaList() != null) {
            for (HosReferencia objRef : cexHistoriaClinica.getHosReferenciaList()) {
              // recorre los ingresos pertenecients a la referncia creada
              if (objRef.getHosRegistroDetalleList() != null) {
                for (HosRegistroDetalle objReg : objRef.getHosRegistroDetalleList()) {
                  // recorre las internaciones de cada ingreso hospitalario
                  if (objReg.getHosInternacionList() != null) {
                    for (HosInternacion objInternacion : objReg.getHosInternacionList()) {
                      // Recorrer los pedidos de laboratio asignado a cada internacion
                      if (objInternacion.getCexPedidoLaboratorioList() != null) {
                        for (CexPedidoLaboratorio objLaboratorio :
                            objInternacion.getCexPedidoLaboratorioList()) {
                          // añadir pedidos de laboratorio a lista general
                          lista.add(objLaboratorio);
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }

        // Buscar por internacion que tengan solicitud de internacion sin referencia
        if (cexHistoriaClinica != null) {
          // recorre las agendas solo que tenga preparacion y consulta
          if (cexHistoriaClinica.getCexAgendaList() != null) {
            for (CexAgenda objAge : cexHistoriaClinica.getCexAgendaList()) {
              // recorre las preparaciones
              if (objAge.getCexPreparacionList() != null) {
                for (CexPreparacion objPre : objAge.getCexPreparacionList()) {
                  // recorre consultas
                  if (objPre.getCexConsultaList() != null) {
                    for (CexConsulta objCexCon : objPre.getCexConsultaList()) {
                      // recorre las solicitudes de internaciones por cada consulta
                      if (objCexCon.getHosSolicitudInternacionList() != null) {
                        for (HosSolicitudInternacion objSol :
                            objCexCon.getHosSolicitudInternacionList()) {
                          // recorre los ingresos pertenecients a la referncia creada
                          if (objSol.getHosRegistroDetalleList() != null) {
                            for (HosRegistroDetalle objReg : objSol.getHosRegistroDetalleList()) {
                              // recorre las internaciones de cada ingreso hospitalario
                              if (objReg.getHosInternacionList() != null) {
                                for (HosInternacion objInternacion :
                                    objReg.getHosInternacionList()) {
                                  // Recorrer los pedidos de laboratio asignado a cada internacion
                                  if (objInternacion.getCexPedidoLaboratorioList() != null) {
                                    for (CexPedidoLaboratorio objLaboratorio :
                                        objInternacion.getCexPedidoLaboratorioList()) {
                                      // añadir pedidos de laboratorio a lista general
                                      lista.add(objLaboratorio);
                                    }
                                  }
                                }
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }

        // Buscar por internacion que tengan solicitud de internacion con referencia
        if (cexHistoriaClinica != null) {
          // recorre las referencias de acuerdo a la historia clinica requerida
          if (cexHistoriaClinica.getHosReferenciaList() != null) {
            for (HosReferencia objRef : cexHistoriaClinica.getHosReferenciaList()) {
              // recorre las agendas de acuerdo a las refrenciascreadas
              if (objRef.getCexAgendaList() != null) {
                for (CexAgenda objAge : objRef.getCexAgendaList()) {
                  // recorre las preparaciones
                  if (objAge.getCexPreparacionList() != null) {
                    for (CexPreparacion objPre : objAge.getCexPreparacionList()) {
                      // recorre consultas
                      if (objPre.getCexConsultaList() != null) {
                        for (CexConsulta objCexCon : objPre.getCexConsultaList()) {
                          // recorre las solicitudes de internaciones por cada consulta
                          if (objCexCon.getHosSolicitudInternacionList() != null) {
                            for (HosSolicitudInternacion objSol :
                                objCexCon.getHosSolicitudInternacionList()) {
                              // recorre los ingresos pertenecients a la referncia creada
                              if (objSol.getHosRegistroDetalleList() != null) {
                                for (HosRegistroDetalle objReg :
                                    objSol.getHosRegistroDetalleList()) {
                                  // recorre las internaciones de cada ingreso hospitalario
                                  if (objReg.getHosInternacionList() != null) {
                                    for (HosInternacion objInternacion :
                                        objReg.getHosInternacionList()) {
                                      // Recorrer los pedidos de laboratio asignado a cada
                                      // internacion
                                      if (objInternacion.getCexPedidoLaboratorioList() != null) {
                                        for (CexPedidoLaboratorio objLaboratorio :
                                            objInternacion.getCexPedidoLaboratorioList()) {
                                          // añadir pedidos de laboratorio a lista general
                                          lista.add(objLaboratorio);
                                        }
                                      }
                                    }
                                  }
                                }
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }

      if (lista.isEmpty()) {
        FacesContext.getCurrentInstance()
            .addMessage(
                findComponent(context.getViewRoot(), "formDatos").getClientId(),
                new FacesMessage(
                    FacesMessage.SEVERITY_ERROR,
                    "Busqueda sin resultados",
                    "No se encontro pedidos asignados al paciente registrado"));
        parametroBusqueda = "";
      }
    } catch (Exception e) {
      log.error("{}: {} ", nombreMetodo, e);
    }
  }
  /**
   * Metodo que busca segun la especialidad , el Doctor y el horario que tiene asignado cada doctor
   * el turno mas cerca dispible
   *
   * @author David Carranza
   */
  public void buscarTurnoListener() {
    String nombreMetodo = Thread.currentThread().getStackTrace()[1].getMethodName() + "()";
    FacesContext context = FacesContext.getCurrentInstance();
    int contHor = 0;
    listaHorarioDia.clear();
    listaAgenda.clear();
    List<CexAgenda> listTempAgen;
    try {

      // Recupera permiso para saber si se puede agendar en la fecha seleccionada
      List<AdmPermiso> objLicencia =
          (List<AdmPermiso>)
              adminObject.queryEJB(
                  "select p from AdmPermiso p where :var1 between p.apeFechaInicio and p.apeFechaFin and p.admMedico = :var2",
                  fechaAgenda,
                  object.getAdmMedico());
      // List<CexPermiso> objLicencia = adminObject.ejecutarQueryNativoLista("SELECT * FROM
      // cex_Permiso where med_id = " +
      // object.getCexHorario().getCexEspecialidadMedico().getCexMedico().getMedId() + " and date('"
      // + fecha + "') between per_fecha_inicio and per_fecha_fin;", CexPermiso.class);
      // Verifica si tiene permiso
      if (objLicencia.size() < 0 || objLicencia.isEmpty()) {
        // Recuper la lista del horario de acuerdo al dia seleciconado
        for (CexHorario objTemH : object.getCexHorarioList()) {
          // Agregar horario de acuerdo a la fecha
          if ((fechaAgenda.after(objTemH.getChoFechaInicio())
                  || objTemH.getChoFechaInicio().equals(fechaAgenda))
              && (fechaAgenda.before(objTemH.getChoFechaFin())
                  || objTemH.getChoFechaFin().equals(fechaAgenda))) {
            // Verificar los horarios segun el tipo de consulta de la agenda
            if (objTemH.getAdmTipoConsulta().getAtcTipo().equals(1)
                && objTemH.getAdmInstitucion().equals(user.getUser().getAdmInstitucion())) {
              // Recorrer los horarios dias de cada horario
              for (CexHorariosDia objTemHd : objTemH.getCexHorariosDiaList()) {
                if (objTemHd.getCexDia().getCdiId().equals(dia)) {
                  // Añadir solo el horario que tenga asignado hora inicio y hora fin
                  if (objTemHd.getChdHoraInicioAm() != null && objTemHd.getChdHoraFinAm() != null) {
                    listaHorarioDia.add(objTemHd);
                  }
                }
              }
            }
          }
        }

        // Recuperar las agendas de acuerdo al horarioDia y de acuerdo a las fechas
        for (CexHorariosDia objHorDia : listaHorarioDia) {
          // Asignar numero de horario
          objHorDia.setOrdenHorario(contHor);
          listTempAgen =
              adminObject.listarOrdenada(
                  CexAgenda.class,
                  "cagFecha",
                  fechaAgenda,
                  "cexHorariosDia",
                  objHorDia,
                  "cagHora",
                  true);
          for (CexAgenda objA : listTempAgen) {
            objA.setNumeroHorario(contHor);
            listaAgenda.add(objA);
          }
          listTempAgen.clear();
          contHor++;
        }

      } else {
        AdmPermiso permiso = objLicencia.get(0);
        FacesContext.getCurrentInstance()
            .addMessage(
                findComponent(context.getViewRoot(), "formDatos").getClientId(),
                new FacesMessage(
                    FacesMessage.SEVERITY_ERROR,
                    "Agenda no disponible",
                    "Médico no disponible en la fecha ha seleccioanda por motico de "
                        + permiso.getApeMotivo()
                        + ""));
      }

    } catch (Exception e) {
      log.error("{}: {} ", nombreMetodo, e);
    }
  }