var params = JSON.parse(value),
    request = new HttpRequest(),
    data = [],
    error_msg = [],
    measurement,
    temp_unit,
    wind_unit,
    errors_only = [],
    error_locations = [],
    unique_errors,
    new_error_msg;
  
function getHttpData(query) {
    url = params.api_endpoint + query + '&appid=' + params.apikey + '&units=' + params.units + '&lang=' + params.lang;
    response = request.get(url);
    Zabbix.log(4, '[ Openweathermap ] [ ' + url + ' ] Received response with status code ' + request.getStatus() + ': ' + response);
  
    if (response !== null) {
        try {
            response = JSON.parse(response);
        }
        catch (error) {
            throw 'Failed to parse response.';
        }
    }
  
    if (request.getStatus() !== 200) {
        if (response.error && response.error.message) {
            throw response.error.message;
        } 
        else {
            throw 'Failed to receive data. Invalid response status code: ' + request.getStatus();
        }
    }
    return response;
}
  
switch (params.units) {
    case 'metric':
        measurement = 'metric';
        temp_unit = 'C';
        wind_unit = 'meter/sec';
        break;
    case 'imperial':
        measurement = 'imperial';
        temp_unit = 'F';
        wind_unit = 'miles/hour';
        break;
    default:
        measurement = 'standard';
        temp_unit = 'K';
        wind_unit = 'meter/sec';
}
  
locations = params.location.split('|');
for (var i in locations) {
    try {
        if (/^[0-9]+$/g.test(locations[i])) {
            result = getHttpData('id=' + locations[i]);
        } 
        else if (/^.*,[\w]+$/g.test(locations[i])) {
            result = getHttpData('zip=' + locations[i]);
        }
        else if (/^[0-9]{1,2}(\.[0-9]+)?,[0-9]{1,2}(\.[0-9]+)?/g.test(locations[i])) {
            coordinates = locations[i].split(',');
            result = getHttpData('lat=' + coordinates[0] + '&lon=' + coordinates[1]);
        }
        else {
            result = getHttpData('q=' + encodeURIComponent(locations[i]));
        }
        if (!data.filter(function (location) { return location.id === result.id; }).length) {
            result.measurement = measurement;
            result.temp_unit = temp_unit;
            result.wind_unit = wind_unit;
            data.push(result);
        }
    } catch (error) {
        errors = {};
        errors.location = locations[i];
        errors.error = error.toString();
        error_msg.push(errors);
        errors_only.push(error.toString());
    }
}

if (error_msg.length === 0) {
    return JSON.stringify({
        'data': data,
        'errors': error_msg.toString()
    });
} else {
    unique_errors = errors_only.filter(function (value, index, self) { 
        return self.indexOf(value) == index; 
    });
  
    if (unique_errors.length === 1) {
        for (var j in error_msg) {
            error_locations.push(error_msg[j].location);
        }
        new_error_msg = 'Failed to retrieve data for the following locations: ' + error_locations + '. ' + unique_errors[0];
      
        return JSON.stringify({
            'data': data,
            'errors': new_error_msg
        });
    } else {
        return JSON.stringify({
            'data': data,
            'errors': error_msg
        });
    }
}