/**
   * Actualiza la posición del surfero. En caso de que el surfero entre o salga de una playa se
   * actualizara el estado de estas playas.
   *
   * @param surfer
   * @param latitude
   * @param longitude
   */
  public static Session updateSurferLocation(Surfer surfer, double latitude, double longitude) {
    EntityManager em = entityManager();
    Session session = null;

    if (!em.contains(surfer)) {
      throw new IllegalStateException("El surfero debe ser una untidad gestionada");
      // Si no es gestionada no se reflejan los cambios!, asi que gestionala!
      // TODO esto podria cambiarse por un assert, improved production performance
    }

    // Location as a Point
    Point location = new Point(latitude, longitude);

    // Generate Geocells
    List<String> cells = GeocellManager.generateGeoCell(location);

    // Save instance
    surfer.setLatitude(latitude);
    surfer.setLongitude(longitude);
    surfer.setGeoCellsData(cells);

    // Se busca si la posicion forma parte de una playa
    Spot spot = SpotService.findSpotByLocation(latitude, longitude);
    Session actual = findActiveSession(surfer);

    // Esta el surfer en una playa?
    if (SessionService.hasActiveSession(surfer)) {
      // Ha salido o cambiado de playa el surfer?
      if (spot == null || spot.getId() != actual.getSpotId()) {
        SessionService.endSession(surfer);
      }
    }

    // Ha cambiado o entrado en una nueva playa?
    if (spot != null && (actual == null || spot.getId() != actual.getSpotId())) {
      session = SessionService.beginSession(surfer, spot);
    }

    return session;
  }
 public static void remove(Surfer instance) {
   EntityManager em = entityManager();
   Surfer attached = em.find(Surfer.class, instance.getId());
   em.remove(attached);
 }