/*
   * saleVehiculo desocupa una plaza del array con un coche
   * y registra el movimiento.
   */
  public boolean saleVehiculo(String matricula) {

    boolean salir = true;
    Vehiculo v = new Vehiculo(matricula);

    // Bucle para ver la primera posicion libre del vector plazas
    for (int i = 0; i < plazas.size() && salir; i++) {

      if (plazas.get(i).equals(v)) {
        v = plazas.get(i).obtenerVehiculo();
        /*Hay sacar el vehiculo de la plaza para poder modificarlo
         * y usar su metodo desocupar.*/
        if (v.haPagado()) {
          plazas.get(i).desocupar();

          Salida nuevaSalida = new Salida(v, i);
          nuevaSalida.registrar();
        } else {
          System.out.println("No ha podido salir " + "porque el vehiculo todavia no ha pagado.");
        }
        salir = false;
      } else {
        System.out.println("El vehiculo no esta en el parking.");
      }
    }

    /*
     * retornara true siempre haya entrado un vehiculo porque cuando salir
     * es falso, si no ha podido entrar el vehiculo salir seguira a true
     * entonces la comparación dara false
     */
    return salir == false;
  }
 /**
  * Retorna la nueva revisión mecánica
  *
  * @param idVehiculo
  * @param tipoVehiculo
  * @return
  */
 @BodyParser.Of(BodyParser.Json.class)
 public Result agregarRevision(Long idVehiculo, int tipoVehiculo) {
   Result rta;
   Vehiculo vehiculoEncontrado =
       tipoVehiculo == Vehiculo.TRANVIA
           ? (Vehiculo) TranviaVehiculo.finder.byId(idVehiculo)
           : tipoVehiculo == Vehiculo.MOVIBUS
               ? (Vehiculo) MoviBusVehiculo.finder.byId(idVehiculo)
               : (Vehiculo) Vcub.finder.byId(idVehiculo);
   if (vehiculoEncontrado != null) {
     JsonNode json = Controller.request().body().asJson();
     RevisionMecanica revision = RevisionMecanica.bind(json);
     if (revision != null) {
       revision.setIdVehiculo(idVehiculo);
       vehiculoEncontrado.setUltimaRevision(revision);
       vehiculoEncontrado.save();
       revision.save();
       rta = ok(Json.toJson(revision));
     } else {
       rta = badRequest();
     }
   } else {
     rta = notFound();
   }
   return rta;
 }
 @Override
 public boolean[][] move(boolean[][] mapaPos, Direccion dir) {
   boolean[][] mapaPosiciones = mapaPos;
   int posX = super.getX();
   int posY = super.getY();
   if (canMove(mapaPosiciones, dir)) {
     switch (dir) {
       case DERECHA:
         {
           super.setY(posY + 1);
           inicializar(mapaPosiciones);
           //			mapaPosiciones[posX][super.getY()]=true;
           mapaPosiciones[posX][posY - 1] = false;
         }
         break;
       case IZQUIERDA:
         {
           super.setY(posY - 1);
           inicializar(mapaPosiciones);
           //			mapaPosiciones[posX][super.getY()]=true;
           mapaPosiciones[posX][posY] = false;
         }
         break;
       default:; // no hace nada;
     }
   }
   return mapaPosiciones;
   // Si no, no se puede mover y no hace nada
 }
  /**
   * Finaliza el ultimo Trayecto que se ha iniciado
   *
   * @param idVehiculo
   * @param idTrayecto
   * @param tipoVehiculo
   * @return ok con el Json del Trayecto que se finalizo,
   * @return badReques si no se está intentando finalizar el ultimo trayecto iniciado
   * @return notFound si no se encuentra alguno de los datos necesarios
   */
  @BodyParser.Of(BodyParser.Json.class)
  public Result finalizarUltimoTrayecto(Long idVehiculo, Long idTrayecto, int tipoVehiculo) {
    Vehiculo vehiculoEncontrado =
        tipoVehiculo == Vehiculo.TRANVIA
            ? (Vehiculo) TranviaVehiculo.finder.byId(idVehiculo)
            : (Vehiculo) MoviBusVehiculo.finder.byId(idVehiculo);
    // Trayecto trayecoEncontrado = vehiculoEncontrado.getUltimoTrayecto();
    Trayecto trayecoEncontrado = (Trayecto) Trayecto.finder.byId(idTrayecto);
    Trayecto ultimoTrayectoVeh =
        vehiculoEncontrado != null ? vehiculoEncontrado.getUltimoTrayecto() : null;
    if (trayecoEncontrado != null && vehiculoEncontrado != null) {
      if (ultimoTrayectoVeh != null && ultimoTrayectoVeh.getIdTrayecto() == idTrayecto) {
        JsonNode json = Controller.request().body().asJson();
        Trayecto trayectoRecibido = Trayecto.bind(json);
        if (trayectoRecibido != null) {
          TrayectoController.finalizarTrayecto(
              trayecoEncontrado.getIdTrayecto(),
              trayectoRecibido.getHoraFin(),
              trayectoRecibido.getIncidentes());
        }
        vehiculoEncontrado.setEstado(Vehiculo.DISPONIBLE);
        vehiculoEncontrado.save();
        trayecoEncontrado = (Trayecto) Trayecto.finder.byId(idTrayecto);
        //                trayectoRecibido.delete();
        return ok(Json.toJson(trayecoEncontrado));
      } else {
        return badRequest();
      }
    }

    return notFound();
  }
  private void imei() {
    final User sesion = (User) getIntent().getExtras().getSerializable("sesion");
    final Vehiculo vehiculo = (Vehiculo) getIntent().getExtras().getSerializable("vehiculo");

    imei = (TextView) findViewById(R.id.TV_DetalleVehiculo_imei);
    imei2 = (TextView) findViewById(R.id.TV_DetalleVehiculo_imei2);
    imagenImei = (ImageView) findViewById(R.id.IV_DetalleVehiculo_imei);
    if (!sesion.isEnrolador()) {
      imei.setVisibility(View.GONE);
      imei2.setVisibility(View.GONE);
      imagenImei.setVisibility(View.GONE);
    } else {
      imei.setText(vehiculo.getImei());
    }
  }
  /**
   * Retorna el Json del trayecto que se acaba de crear
   *
   * @param id_vehiculo
   * @param tipo_vehiculo
   * @return
   */
  @BodyParser.Of(BodyParser.Json.class)
  public Result agregarTrayecto(Long id_vehiculo, int tipo_vehiculo) {
    JsonNode json = Controller.request().body().asJson();
    Vehiculo vehiculoEncontrado =
        tipo_vehiculo == Vehiculo.TRANVIA
            ? (Vehiculo) TranviaVehiculo.finder.byId(id_vehiculo)
            : (Vehiculo) MoviBusVehiculo.finder.byId(id_vehiculo);
    Trayecto trayectoRecibido = Trayecto.bind(json);
    Driver conductorEncontrado =
        (Driver) new Model.Finder(Driver.class).byId(trayectoRecibido.getIdConductor());
    if (vehiculoEncontrado != null && conductorEncontrado != null) {
      if (vehiculoEncontrado.getUltimoTrayecto() == null
          || vehiculoEncontrado.getUltimoTrayecto().getEstado() == Trayecto.FINALIZADO) {
        trayectoRecibido.setIdVehiculo(vehiculoEncontrado.getIdVehiculo());
        trayectoRecibido.setIdConductor(conductorEncontrado.getIdConductor());
        conductorEncontrado.setUltimoTrayecto(trayectoRecibido);
        vehiculoEncontrado.setUltimoTrayecto(trayectoRecibido);
        vehiculoEncontrado.setEstado(Vehiculo.EN_MARCHA);
        trayectoRecibido.save();
        vehiculoEncontrado.save();
        conductorEncontrado.save();
        return ok(Json.toJson(trayectoRecibido));
      } else {
        return badRequest("No se puede iniciar un nuevo trayecto antes de finalizar el anterior");
      }

    } else {
      return notFound();
    }
  }
 private void btnGuardarActionPerformed(
     java.awt.event.ActionEvent evt) { // GEN-FIRST:event_btnGuardarActionPerformed
   gestorBitacora gestorB = new gestorBitacora();
   Iterator ite = gestorH.listarClase(Viaje.class).iterator();
   while (ite.hasNext()) {
     Viaje viaje = (Viaje) ite.next();
     if (viaje.getIdViaje() == Long.parseLong(txtNumViaje.getText())) {
       Iterator ite1 = gestorH.listarClase(Vehiculo.class).iterator();
       while (ite1.hasNext()) {
         Vehiculo vehiculo = (Vehiculo) ite1.next();
         if (vehiculo.getDominio().equalsIgnoreCase(txtDominio.getText())) {
           viaje.setVehiculo(vehiculo);
           viaje.setEstado("Con vehiculo asignado");
           gestorH.actualizarObjeto(viaje);
           vehiculo.setEstado("Asignado");
           gestorH.actualizarObjeto(vehiculo);
           gestorB.cargarBitacora(
               String.valueOf(viaje.getIdViaje()),
               txtFecha.getText(),
               3,
               labelusuario.getText(),
               "");
         }
       }
     }
   }
   DefaultTableModel modeloT = (DefaultTableModel) tblViaje.getModel();
   modeloT.setRowCount(0);
   gestorA.RellenarTablaViajes(tblViaje);
   txtNumeroSolicitud.setText("");
   txtDestino.setText("");
   txtCereal.setText("");
   txtFechaRealizacion.setText("");
   txtTipoViaje.setText("");
   txtNumViaje.setText("");
   txtProductor.setText("");
   DefaultTableModel modelo = (DefaultTableModel) tblVehiculo.getModel();
   modelo.setRowCount(0);
   txtVehiculo.setText("");
   txtTara.setText("");
   txtTipoVehiculo.setText("");
   txtTransportista.setText("");
   txtDominio.setText("");
   JOptionPane.showMessageDialog(null, "Se asigno correctamente el vehiculo");
 } // GEN-LAST:event_btnGuardarActionPerformed
  /*
   * cobrar se ocupa de usar el cajero para cobrar.
   */
  public boolean cobrar(String matricula) {

    boolean salir = true;
    /*Se crea un nuevo vehiculo con la matricula y la
    fecha se pone en el constructor de vehiculo*/
    Vehiculo v = new Vehiculo(matricula);

    for (int i = 0; i < plazas.size() && salir; i++) {

      if (plazas.get(i).equals(v)) {
        plazas.get(i).obtenerVehiculo().asignarFechaSalida();

        System.out.println("Cobrando al vehiculo matricula: " + v.getMatricula());
        cajero.cobrar(numeroTicket, plazas.get(i).obtenerVehiculo());

        numeroTicket++;
        salir = false;
      } else {
        System.out.println("El vehiculo no esta en el parking.");
      }
    }
    return salir == false;
  }
  /**
   * NO SE USAN/FUNCIONAN PORQUE VEHICULO NO ES ENTITY @BodyParser.Of(BodyParser.Json.class) public
   * Result create(){ JsonNode j = Controller.request().body().asJson(); Vehiculo vehiculoN =
   * Vehiculo.bind(j); vehiculoN.save(); return ok(Json.toJson(vehiculoN)); }
   *
   * <p>public Result readAll() { List<Vehiculo> vehiculos = Vehiculo.darVehiculos(); return
   * ok(Json.toJson(vehiculos)); }
   *
   * <p>public Result readVehiculoID(String id) { Vehiculo vehiculoEncontrado = (Vehiculo)
   * Vehiculo.finder.byId(id); if(vehiculoEncontrado != null) { return
   * ok(Json.toJson(vehiculoEncontrado)); } return notFound(); }
   */
  @BodyParser.Of(BodyParser.Json.class)
  public Result agregarDatos(Long id_vehiculo, int tipo_vehiculo) {
    String mensaje;
    JsonNode j = Controller.request().body().asJson();
    Vehiculo vehiculoEncontrado =
        tipo_vehiculo == Vehiculo.TRANVIA
            ? (Vehiculo) TranviaVehiculo.finder.byId(id_vehiculo)
            : (Vehiculo) MoviBusVehiculo.finder.byId(id_vehiculo);

    if (vehiculoEncontrado != null) {
      Datos datosRecibidos = Datos.bind(j);
      datosRecibidos.setIdVehiculo(vehiculoEncontrado.getIdVehiculo());
      datosRecibidos.save();
      vehiculoEncontrado.setUltimosDatos(datosRecibidos);
      vehiculoEncontrado.save();
      if (vehiculoEncontrado.getEstado() != Vehiculo.ACCIDENTE
          && (datosRecibidos.isSensorChoque()
              || datosRecibidos.isBotonPanico()
              || datosRecibidos.getSensorTermico() > 38)) {
        // Crear  emergencia
        vehiculoEncontrado.setEstado(Vehiculo.ACCIDENTE);
        Datos ultimosDatos = vehiculoEncontrado.getUltimosDatos();
        Emergencia em =
            new Emergencia(
                0,
                ultimosDatos.getHoraMedicion(),
                "Comentarios",
                "Altitud:"
                    + ultimosDatos.getGpsAltitud()
                    + "-Latitud:"
                    + ultimosDatos.getGpsLatitud(),
                "Niv Indef/moment");
        vehiculoEncontrado.setUltimaEmergencia(em);
        vehiculoEncontrado.save();
        em.save();
      }

      return ok(Json.toJson(datosRecibidos));
    } else {
      return notFound();
    }
  }
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_detalle_vehiculo);
    final User sesion = (User) getIntent().getExtras().getSerializable("sesion");
    final Vehiculo vehiculo = (Vehiculo) getIntent().getExtras().getSerializable("vehiculo");
    Toolbar toolbar = (Toolbar) findViewById(R.id.mitoolbar);
    setSupportActionBar(toolbar);
    assert vehiculo != null;
    getSupportActionBar().setTitle(vehiculo.getPatente());
    getSupportActionBar().setSubtitle("Patente");
    // boton volver
    toolbar.setNavigationIcon(
        ContextCompat.getDrawable(this, R.drawable.abc_ic_ab_back_mtrl_am_alpha));
    toolbar.setNavigationOnClickListener(
        new View.OnClickListener() {
          @Override
          public void onClick(View v) {
            Intent intent = new Intent(DetalleVehiculoActivity.this, PanelActivity.class);
            intent.putExtra("sesion", sesion);
            intent.putExtra("vehiculo", vehiculo);
            startActivity(intent);
          }
        });
    marca = (TextView) findViewById(R.id.TV_DetalleVehiculo_Marca);
    modelo = (TextView) findViewById(R.id.TV_DetalleVehiculo_Modelo);
    año = (TextView) findViewById(R.id.TV_DetalleVehiculo_año);
    marca = (TextView) findViewById(R.id.TV_DetalleVehiculo_Marca);
    modelo = (TextView) findViewById(R.id.TV_DetalleVehiculo_Modelo);
    año = (TextView) findViewById(R.id.TV_DetalleVehiculo_año);

    imei();
    marca.setText(vehiculo.getMarca());
    modelo.setText(vehiculo.getModelo());
    año.setText(String.valueOf(vehiculo.getAño()));
  }
 private void btnAceptarVehiculoActionPerformed(
     java.awt.event.ActionEvent evt) { // GEN-FIRST:event_btnAceptarVehiculoActionPerformed
   DefaultTableModel modeloTabla = (DefaultTableModel) tblVehiculo.getModel();
   GestorHibernate gestorH = new GestorHibernate();
   int fila = tblVehiculo.getSelectedRow();
   Iterator ite = gestorH.listarClase(Vehiculo.class).iterator();
   while (ite.hasNext()) {
     Vehiculo vehiculo = (Vehiculo) ite.next();
     if (vehiculo.getDominio().equals(modeloTabla.getValueAt(fila, 0))) {
       txtVehiculo.setText(vehiculo.getModelo().toString());
       txtDominio.setText(vehiculo.getDominio());
       txtTransportista.setText(vehiculo.getTransportista().toString());
       txtTara.setText(String.valueOf(vehiculo.getTara()));
       txtTipoVehiculo.setText(vehiculo.getTipoVehiculo().toString());
     }
   }
 } // GEN-LAST:event_btnAceptarVehiculoActionPerformed
  public void grabar() {
    vistaVehiculo vista = new vistaVehiculo(this);
    vista = (vistaVehiculo) this.getSession().getVista();
    Vehiculo dto = new Vehiculo();
    dto.setHash(vista.getDto(dto));

    if (dto.getLngid() == 0) {
      dto.setStrip_creacion(this.obtenerIpHost());
      dto.setStrhost_creacion(this.obtenerNombreHost());
      dto.setDtmfecha_creacion(new Date());
      dto.setDtmvalido_hasta(this.sumarAnios(5));
      dto.setBolactivo(true);
    } else {
      dto.setStrip_modificacion(this.obtenerIpHost());
      dto.setStrhost_modificacion(this.obtenerNombreHost());
      dto.setDtmfecha_modificacion(new Date());
    }

    vista.limpiarError();

    List<String> lsError = this.testValidacion(dto);
    if (lsError.isEmpty() && dto.getFlocapacidad() > 0) {
      modeloVehiculo modelo = new modeloVehiculo();
      modelo.grabar(dto);
    } else {
      vista.mensageDialogo(
          "error",
          "Por favor verifíque los datos. Debe ingresarlos correctamente!",
          "Error en datos");
      vista.marcarError(lsError);
    }
  }