/**
   * Verwijdert polygonen lokaal als ze niet meer op de server staan. Naam van deze methode (C)
   * Joost Maar de inhoud van deze methode wel (C) Mathijs
   *
   * @param polygonIds een lijstje met polygonid's die op de server voorkomen (in deze groep)
   * @throws SyncException
   */
  private void removeDeletedPolygons(int group) throws SyncException {
    Cursor c = db.getAllPolygons(group);
    if (!c.moveToFirst()) {
      return; // Lokale db is al leeg
    }

    // Lijstje maken met alle id's op de server
    ArrayList<Integer> polygonIds = new ArrayList<Integer>();

    HttpGet httpg = new HttpGet(serverUrl + "polygons/group_id/" + group + "/since/1");
    UsernamePasswordCredentials creds = new UsernamePasswordCredentials(mappUser, mappPass);

    try {
      httpg.addHeader(new BasicScheme().authenticate(creds, httpg));
    } catch (AuthenticationException e1) {
      Log.e(Mapp.TAG, e1.getMessage());
      throw new SyncException("Authentication failed");
    }

    HttpResponse response;

    try {
      response = httpclient.execute(httpg);

      // Lees het resultaat van de actie in
      InputStream is = response.getEntity().getContent();
      BufferedReader r = new BufferedReader(new InputStreamReader(is));
      StringBuilder total = new StringBuilder();
      String line;
      while ((line = r.readLine()) != null) {
        total.append(line);
      }

      if (response.getStatusLine().getStatusCode() == 418) {
        throw new SyncException("Unable to synchronize because the server is a teapot.");
      } else if (response.getStatusLine().getStatusCode() == 401) {
        throw new SyncException("Not authorized");
      } else if (response.getStatusLine().getStatusCode() == 404) {
        // Geen polygonen hier
        do {
          if (!(c.getInt(3) == 1)) {
            db.removePolygon(c.getInt(0), false);
          }
        } while (c.moveToNext());
        return;
      } else if (response.getStatusLine().getStatusCode() != 200) {
        // Er is iets mis gegaan.
        JSONObject result = new JSONObject(total.toString());
        Log.e(Mapp.TAG, "Sync error: " + result.getString("message"));
        throw new SyncException(result.getString("message"));
      } else {
        // Alles is blijkbaar goed gegaan
        JSONArray result = new JSONArray(total.toString());

        // Loop over de polygonen heen
        for (int i = 0; i < result.length(); i++) {
          JSONObject polygon = result.getJSONObject(i);
          polygonIds.add(polygon.getInt("id"));
        }
      }
    } catch (ClientProtocolException e) {
      Log.e(Mapp.TAG, e.getMessage());
      throw new SyncException("Epic HTTP failure");
    } catch (IOException e) {
      Log.e(Mapp.TAG, e.getMessage());
      throw new SyncException("Exception during server synchronisation");
    } catch (JSONException e) {
      Log.e(Mapp.TAG, "Sync failed. Response is no valid JSON or expected variable not found.");
      throw new SyncException("Invalid server response");
    }

    // Nu we eindelijk alle id's hebben, kijken of er in de lokale db id's voorkomen die niet in
    // onze nieuwe lijst zitten
    do {
      if (!polygonIds.contains(c.getInt(0)) && c.getInt(3) != 1) {
        db.removePolygon(c.getInt(0), false);
      }
    } while (c.moveToNext());
  }
  /**
   * Synchroniseert gewijzigde polygonen met de server
   *
   * @param group het id van de groep waaruit polygonen gesynct moeten worden
   * @throws SyncException
   */
  private void postPolygons(int group) throws SyncException {
    Cursor c = db.getChangedPolygons(group);
    int polygonid = 0;
    String name = "";
    String color = "";
    String desc = "";

    if (!c.moveToFirst()) {
      return; // Niks te syncen, dus gelijk klaar!
    }

    do {
      HttpPost httpp = new HttpPost(serverUrl + "polygon");
      UsernamePasswordCredentials creds = new UsernamePasswordCredentials(mappUser, mappPass);

      polygonid = c.getInt(0);
      name = c.getString(2);
      color = c.getString(1);
      desc = c.getString(3);

      List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
      nameValuePairs.add(new BasicNameValuePair("id", polygonid + ""));
      nameValuePairs.add(new BasicNameValuePair("name", name));
      nameValuePairs.add(new BasicNameValuePair("group_id", group + ""));
      nameValuePairs.add(new BasicNameValuePair("color", color));
      nameValuePairs.add(new BasicNameValuePair("description", desc));

      // Nu de punten van de polygoon ophalen en die bijvoegen
      Cursor points = db.getAllPolygonPoints(polygonid);
      if (!points.moveToFirst()) {
        // Hier klopt iets niet, de polygoon heeft geen punten!
        db.removePolygon(polygonid, true);
        return;
      }

      do {
        nameValuePairs.add(
            new BasicNameValuePair(
                "points[]",
                points.getString(0) + "," + points.getString(1) + "," + points.getString(2)));
      } while (points.moveToNext());

      try {
        httpp.addHeader(new BasicScheme().authenticate(creds, httpp));
        httpp.setEntity(new UrlEncodedFormEntity(nameValuePairs));
      } catch (AuthenticationException e1) {
        Log.e(Mapp.TAG, e1.getMessage());
        throw new SyncException("Authentication failed");
      } catch (UnsupportedEncodingException e) {
        Log.e(Mapp.TAG, e.getMessage());
        throw new SyncException("Failed to encode data");
      }

      HttpResponse response;

      try {
        response = httpclient.execute(httpp);

        if (response.getStatusLine().getStatusCode() == 418) {
          throw new SyncException("Unable to synchronize because the server is a teapot.");
        } else if (response.getStatusLine().getStatusCode() == 401) {
          throw new SyncException("Not authorized");
        } else if (response.getStatusLine().getStatusCode() != 200) {
          // Er is iets mis gegaan.

          // Lees het resultaat van de actie in
          JSONObject result = null;
          InputStream is = response.getEntity().getContent();
          BufferedReader r = new BufferedReader(new InputStreamReader(is));
          StringBuilder total = new StringBuilder();
          String line;
          while ((line = r.readLine()) != null) {
            total.append(line);
          }

          result = new JSONObject(total.toString());

          Log.e(Mapp.TAG, "Sync error: " + result.getString("message"));
          throw new SyncException(result.getString("message"));
        } else {
          db.setPolygonIsSynced(polygonid);
        }
      } catch (ClientProtocolException e) {
        Log.e(Mapp.TAG, e.getMessage());
        throw new SyncException("Epic HTTP failure");
      } catch (IOException e) {
        Log.e(Mapp.TAG, e.getMessage());
        throw new SyncException("Exception during server synchronisation");
      } catch (JSONException e) {
        Log.e(Mapp.TAG, "Sync failed. Response is no valid JSON or expected variable not found.");
        throw new SyncException("Invalid server response");
      }
    } while (c.moveToNext());
  }