/**
   * Invoked by the AutoCompleteTextView field to get completions for the current input.
   *
   * <p>NOTE: If this method either throws an exception or returns null, the Filter class that
   * invokes it will log an error with the traceback, but otherwise ignore the problem. No choice
   * list will be displayed. Watch those error logs!
   *
   * @param constraint The input entered thus far. The resulting query will search for Items whose
   *     description begins with this string.
   * @return A Cursor that is positioned to the first row (if one exists) and managed by the
   *     activity.
   */
  @Override
  public Cursor runQueryOnBackgroundThread(CharSequence constraint) {
    Cursor currentCursor = null;

    if (getFilterQueryProvider() != null) {
      return getFilterQueryProvider().runQuery(constraint);
    }

    String args = "";

    if (constraint != null) {
      args = constraint.toString();
    }

    EmpresaSqliteDao empresaDao = new EmpresaSqliteDao();
    currentCursor = empresaDao.listarNombresEmpresas(contexto, args);

    return currentCursor;
  }
  /**
   * Se implementa este metodo para actualizar el valor del id de la empresa del campo oculto cuando
   * la persona no selecciona ninguna opcion de la lista sino que escribe completamente el contenido
   * del campo autocomplete.
   */
  @Override
  public void afterTextChanged(Editable s) {

    String nombreEmpresa = acNombreEmpresa.getText().toString();

    EmpresaSqliteDao empresaDao = new EmpresaSqliteDao();
    Cursor cursor = empresaDao.buscarEmpresaPorNombre(contexto, nombreEmpresa);

    if (cursor.getCount() != 0) {

      // Obtenemos el id de la empresa
      String idEmpresa = cursor.getString(0);

      // Update the parent class's TextView
      etIdEmpresa.setText(idEmpresa);
    } else {
      etIdEmpresa.setText("");
    }
  }
  @Override
  public View onCreateView(
      LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    final View view = inflater.inflate(R.layout.activity_clientes, container, false);
    permisos = SesionUsuario.getPermisos(getActivity());

    if (savedInstanceState == null) {
      // Nos aseguramos que no importa desde donde nos llamen, el indicador del
      // tab es el correspondiente.
      AplicacionActivity.mTabsWidget.setCurrentTab(AplicacionActivity.posicionTagFragmentClientes);

      EmpresaSqliteDao empresaDao = new EmpresaSqliteDao();
      EmpleadoSqliteDao empleadoDao = new EmpleadoSqliteDao();

      Cursor mCursorEmpresas = empresaDao.buscarEmpresaFilter(getActivity(), null);
      Cursor mCursorEmpleados = empleadoDao.buscarEmpleadoFilter(getActivity(), null);

      // primero listamos a los empleados donde vamos a inicializar el valor de
      // listCursorAdapterEmpleados
      listarEmpleados(view, mCursorEmpleados);

      // por ultimo listamos a las empresas, la cual utiliza la referencia de
      // listCursorAdapterEmpleados dentro
      // del adaptador. OJO con esto.
      listarEmpresas(view, mCursorEmpresas);

      setArrSincronizados(mCursorEmpresas, "empresa");
      setArrSincronizados(mCursorEmpleados, "empleado");
      cambiarColorCuadroNotificacion(view);

      // Registro del evento OnClick del buttonActualizar
      Button bAct = (Button) view.findViewById(R.id.buttonActualizar);
      bAct.setOnClickListener(
          new View.OnClickListener() {

            @Override
            public void onClick(View v) {

              AplicacionActivity.dialog = new ProgressDialog(getActivity());
              AplicacionActivity.onClickSincronizar();

              new SincronizacionAsyncTask(getActivity())
                  .execute(
                      DataBaseHelper.TABLA_ROL,
                      DataBaseHelper.TABLA_USUARIO,
                      DataBaseHelper.TABLA_PERMISO,
                      DataBaseHelper.TABLA_ROL_PERMISO,
                      DataBaseHelper.TABLA_USUARIO_ROL,
                      DataBaseHelper.TABLA_EMPRESA,
                      DataBaseHelper.TABLA_EMPLEADO,
                      DataBaseHelper.TABLA_COTIZACION,
                      DataBaseHelper.TABLA_EMPLEADO_COTIZACION,
                      DataBaseHelper.TABLA_SERVICIO,
                      DataBaseHelper.TABLA_COTIZACION_SERVICIO,
                      DataBaseHelper.TABLA_TAREA,
                      DataBaseHelper.TABLA_CHECKIN,
                      DataBaseHelper.TABLA_HISTORICO);
            }
          });

      // Registro del evento OnClick del buttonEmpresa
      Button bEmp = (Button) view.findViewById(R.id.buttonEmpresa);
      bEmp.setOnClickListener(
          new View.OnClickListener() {

            @Override
            public void onClick(View v) {
              DatosEmpresaActivity fragmentDatosEmpresa = new DatosEmpresaActivity();
              final FragmentTransaction ft = getFragmentManager().beginTransaction();
              // Cambiamos el layout de clientes por datos_empresa e indicamos el tag del frame.
              ft.replace(
                  android.R.id.tabcontent,
                  fragmentDatosEmpresa,
                  AplicacionActivity.tagFragmentDatosEmpresa);
              // preservamos el estado anterior al hacer click en back button
              ft.addToBackStack(AplicacionActivity.tagFragmentDatosEmpresa);
              ft.commit();
            }
          });

      // Registro del evento OnClick del buttonCliente
      Button bClient = (Button) view.findViewById(R.id.buttonCliente);
      bClient.setOnClickListener(
          new View.OnClickListener() {

            @Override
            public void onClick(View v) {
              DatosClienteActivity fragmentDatosClientes = new DatosClienteActivity();
              final FragmentTransaction ft = getFragmentManager().beginTransaction();
              // Cambiamos el layout de clientes por datos_cliente e indicamos el tag del frame.
              ft.replace(
                  android.R.id.tabcontent,
                  fragmentDatosClientes,
                  AplicacionActivity.tagFragmentDatosCliente);
              // preservamos el estado anterior al hacer click en back button
              ft.addToBackStack(AplicacionActivity.tagFragmentDatosCliente);
              ft.commit();
            }
          });

      // Registro del evento addTextChangedListener cuando utilizamos el buscador
      EditText etBuscar = (EditText) view.findViewById(R.id.editTextBuscar);
      etBuscar.addTextChangedListener(
          new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {

              // Este if es para que este metodo no se llame automaticamente
              // al iniciar la actividad
              if (mOnTextChangedBool) {

                if (listCursorAdapterEmpleados != null) {
                  listCursorAdapterEmpleados.getFilter().filter(cs);
                }

                if (listCursorAdapterEmpresas != null) {
                  listCursorAdapterEmpresas.getFilter().filter(cs);
                }
              } else {
                mOnTextChangedBool = true;
              }
            }

            @Override
            public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {}

            @Override
            public void afterTextChanged(Editable arg0) {}
          });
    }

    return view;
  }
  /**
   * Funcion que elimina de la BD y del list view empleados o empresas.
   *
   * @param id Id del empleado o empresa
   * @param tipoCliente Posibles valores: empresa o empleado
   */
  private void borrarCliente(String id, String tipoCliente) {
    final LayoutInflater inflater = LayoutInflater.from(getActivity());
    Boolean eliminado = false;
    Mensaje mToast = null;
    String mensajeError = null;
    String mensajeOk = null;

    if (tipoCliente.equals("empresa")) {
      EmpresaSqliteDao empresaDao = new EmpresaSqliteDao();
      eliminado = empresaDao.eliminarEmpresa(getActivity(), id);
      mensajeOk = "ok_eliminado_empresa";
      mensajeError = "error_eliminado_empresa";
    } else if (tipoCliente.equals("empleado")) {
      EmpleadoSqliteDao empleadoDao = new EmpleadoSqliteDao();
      eliminado = empleadoDao.eliminarEmpleado(getActivity(), id);
      mensajeOk = "ok_eliminado_empleado";
      mensajeError = "error_eliminado_empleado";
    } else {
      Log.e(
          "ListaClientesCursorAdapter",
          "tipoCliente no soportado en funcion borrarCliente: " + tipoCliente);
    }

    if (eliminado) {
      mToast = new Mensaje(inflater, (AplicacionActivity) getActivity(), mensajeOk);

      if (tipoCliente.equals("empresa")) {
        // Actualizamos los valores del cursor de la lista de empresas
        EmpresaSqliteDao empresaDao = new EmpresaSqliteDao();
        listCursorAdapterEmpresas.changeCursor(empresaDao.buscarEmpresaFilter(getActivity(), null));
        // Notificamos que la lista cambio
        listCursorAdapterEmpresas.notifyDataSetChanged();

        // Cuando eliminamos a una empresa, eliminamos tambien a sus empleados
        // Actualizamos los valores del cursor de la lista de empleados
        if (listCursorAdapterEmpleados != null) {
          EmpleadoSqliteDao empleadoDao = new EmpleadoSqliteDao();
          listCursorAdapterEmpleados.changeCursor(
              empleadoDao.buscarEmpleadoFilter(getActivity(), null));
          // Notificamos que la lista cambio
          listCursorAdapterEmpleados.notifyDataSetChanged();
        }

      } else if (tipoCliente.equals("empleado")) {
        // Actualizamos los valores del cursor de la lista de empleados
        EmpleadoSqliteDao empleadoDao = new EmpleadoSqliteDao();
        listCursorAdapterEmpleados.changeCursor(
            empleadoDao.buscarEmpleadoFilter(getActivity(), null));
        // Notificamos que la lista cambio
        listCursorAdapterEmpleados.notifyDataSetChanged();
      }

    } else {
      mToast = new Mensaje(inflater, getActivity(), mensajeError);
    }

    try {
      mToast.controlMensajesToast();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }