/**
 * 'mijn_stadsrechten' / index.
 *
 * Gemeenten/plaatsen/provincies waarvoor de ingelogde gebruiker
 * redactierechten heeft (field_town_access op het gebruikersaccount).
 * PUUR INFORMATIEF -- dit endpoint is GEEN toegangscontrole,
 * stadsactiviteiten/create hieronder blijft bewust voor iedereen open.
 *
 * field_town_access mag een term op ELK van de drie niveaus van de
 * town-vocabulary bevatten: provincie (niveau 1), gemeente (2) of plaats (3).
 * De app kan een provincie- of plaats-tid niet rechtstreeks in
 * plaatsen_bij_gemeente stoppen (geeft dan []), daarom krijgt elk recht hier
 * de volledig uitgeklapte keten mee. Zelfde 'keten'-formaat als
 * _custom_aanm_keten() in custom.mijn_aanmeldingen.inc.
 *
 * tid/titel/parent_tid/parent_titel blijven ongewijzigd (bestaande
 * consumenten merken niets); nieuw zijn niveau, provincie_tid/_titel,
 * gemeente_tid/_titel, plaats_tid/_titel, keten en label.
 *
 * @return array
 *   Lijst van rechten, hierarchisch gesorteerd (provincie, gemeente, plaats).
 */
function _custom_mijn_stadsrechten_service() {
  global $user;

  if (empty($user->uid)) {
    return services_error('Niet ingelogd', 401);
  }

  $account = user_load($user->uid);
  if (empty($account->field_town_access[LANGUAGE_NONE])) {
    return array();
  }

  $result = array();
  foreach ($account->field_town_access[LANGUAGE_NONE] as $item) {
    if (empty($item['tid'])) {
      continue;
    }
    $term = taxonomy_term_load($item['tid']);
    if (!$term) {
      continue;
    }

    // Kind -> ... -> wortel; omdraaien naar provincie, gemeente, plaats.
    $pad = array_reverse(taxonomy_get_parents_all($term->tid));
    $niveau = count($pad);
    $provincie = isset($pad[0]) ? $pad[0] : NULL;
    $gemeente  = isset($pad[1]) ? $pad[1] : NULL;
    $plaats    = isset($pad[2]) ? $pad[2] : NULL;

    $parents = taxonomy_get_parents($term->tid);
    $parent = $parents ? reset($parents) : NULL;

    // Sommige termen heten al "X (gemeente)"; dan geen tweede toevoeging.
    $label = $term->name;
    if ($niveau === 1 && stripos($label, 'provincie') === FALSE) {
      $label .= ' (hele provincie)';
    }
    elseif ($niveau === 2 && stripos($label, 'gemeente') === FALSE) {
      $label .= ' (hele gemeente)';
    }

    $result[] = array(
      'tid' => (string) $term->tid,
      'titel' => $term->name,
      'parent_tid' => $parent ? (string) $parent->tid : '',
      'parent_titel' => $parent ? $parent->name : '',
      'niveau' => $niveau,
      'provincie_tid' => $provincie ? (string) $provincie->tid : '',
      'provincie_titel' => $provincie ? $provincie->name : '',
      'gemeente_tid' => $gemeente ? (string) $gemeente->tid : '',
      'gemeente_titel' => $gemeente ? $gemeente->name : '',
      'plaats_tid' => $plaats ? (string) $plaats->tid : '',
      'plaats_titel' => $plaats ? $plaats->name : '',
      'keten' => implode('|', array(
        $provincie ? (string) $provincie->tid : '',
        $gemeente ? (string) $gemeente->tid : '',
        $plaats ? (string) $plaats->tid : '',
      )),
      'label' => $label,
    );
  }

  // Hierarchisch: eerst op provincienaam, dan gemeente, dan plaats.
  usort($result, function ($a, $b) {
    $c = strcasecmp($a['provincie_titel'], $b['provincie_titel']);
    if ($c !== 0) {
      return $c;
    }
    $c = strcasecmp($a['gemeente_titel'], $b['gemeente_titel']);
    if ($c !== 0) {
      return $c;
    }
    return strcasecmp($a['plaats_titel'], $b['plaats_titel']);
  });

  return $result;
}
