'use strict';

const _ = require('lodash');

const PARENT_PROPS = require('../helper/placeTypes');

const ADDRESS_PROPS = [
  { name: 'number', newName: 'housenumber' },
  { name: 'zip',    newName: 'postalcode', transform: (value) => { return [value]; } },
  { name: 'street', newName: 'street' }
];


function setup() {
  return renamePlacenames;
}

function renamePlacenames(req, res, next) {
  // do nothing if no result data set
  if (!res || !res.data) {
    return next();
  }

  res.data = res.data.map(renameOneRecord);

  next();
}

/*
 * Rename the fields in one record
 */
function renameOneRecord(place) {

  // merge the parent block into the top level object to flatten the structure
  // only copy the properties if they have values
  if (place.parent) {
    PARENT_PROPS.forEach( (prop) => {
      place[prop] = place.parent[prop];
      place[prop + '_a'] = place.parent[prop + '_a'];
      place[prop + '_gid'] = place.parent[prop + '_id'];
    });
  }

  // copy the address parts after parent hierarchy in order to prefer
  // the postalcode specified by the original source data
  if (place.address_parts) {
    ADDRESS_PROPS.forEach( (prop) => {
      renameAddressProperty(place, prop);
    });
  }

  return place;
}

function renameAddressProperty(place, prop) {
  if (!place.address_parts.hasOwnProperty(prop.name)) {
    return;
  }

  if (prop.hasOwnProperty('transform')) {
    place[prop.newName] = prop.transform(place.address_parts[prop.name]);
  }
  else {
    place[prop.newName] = place.address_parts[prop.name];
  }
}

module.exports = setup;