var url = require('url');
var math = require('mathjs');
var request = require('request');
var xml = require("xml2js").parseString;
var winston = require('winston');
var logger;
var config;
var callbackReport;
var max_retry = 15;
var sleep_before_retry = 60 * 1000;
process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
function parseSN(message, _config) {
if (!_config) {
_config = config;
}
var sn_regex = new RegExp(_config.h2h_out.sn_pattern);
var sn_match = message.match(sn_regex);
if (sn_match <= 0) {
logger.info('SN Not found: ' + message);
return '';
}
var sn = sn_match[0];
var sn_remove_patterns = _config.h2h_out.sn_remove_patterns.split(_config.h2h_out.sn_remove_patterns_separator);
var count = sn_remove_patterns.length;
for(var i = 0; i < count; i++) {
sn = sn.replace(sn_remove_patterns[i], '');
}
return sn.trim();
}
function topupRequest(task, retry) {
/*
if (config.globals.requests_count == undefined) {
config.globals.requests_count = 1;
} else {
config.globals.requests_count++;
}
if (config.globals.active_requests_count == undefined) {
config.globals.active_requests_count = 1;
} else {
config.globals.active_requests_count++;
}
if (config.globals.max_active_requests_count == undefined) {
config.globals.max_active_requests_count = config.globals.active_requests_count;
} else {
config.globals.max_active_requests_count = math.max(config.globals.max_active_requests_count, config.globals.active_requests_count);
}
*/
if (retry === undefined) {
retry = max_retry;
}
var params = {
userid: config.h2h_out.userid,
pwd: config.h2h_out.password,
memberreff: task['requestId'],
produk: task['remoteProduct'],
tujuan: task['destination']
};
logger.info('Creating http request to gateway', {params: params});
request.post({url: config.h2h_out.partner, form: params}, function(err, httpResponse, httpResponseBody) {
/*
config.globals.active_requests_count--;
*/
if (err) {
logger.warn('HTTP Request Error (' + task['requestId'] + '): ' + err);
callbackReport(task['requestId'], '89', 'Gangguan koneksi ke suplier');
return;
}
logger.info('Got response from gateway ', {response_body: httpResponseBody});
if (httpResponseBody.indexOf('502 Proxy Error') >= 0) {
callbackReport(task['requestId'], '91', '502 Proxy error');
return;
}
xml(httpResponseBody, function(err, result) {
if (err) {
logger.warn('Gagal parsing XML respon server');
//topupRequest(task, retry - 1);
callbackReport(task['requestId'], '40', 'Gagal parsing XML pada respon server');
return;
}
logger.info('Response Data:', {result: result});
var response_code = result.respon.rc[0].replace(/^00/, '');
if (response_code == '54' || response_code == '68') {
if (retry) {
setTimeout(function() {
logger.info('Sending advice', {task: task});
task['remoteProduct'] = 'ADVPLN';
topupRequest(task, retry - 1);
}, sleep_before_retry);
} else {
logger.warn('Max retries exceeded', {task: task});
callbackReport(task['requestId'], '68', message + '. Max retries exceeded');
}
return;
}
var token = '';
if (result.respon.token) {
token = result.respon.token[0];
}
var data_pelanggan = 'NO-DATA';
if (result.respon.data) {
try {
var _data_pelanggan = result.respon.data[0].replace(/ /g, '-');
var fields = _data_pelanggan.split('/');
data_pelanggan = [
fields[0], fields[1], fields[2], fields[3]
].join('/');
}
catch(err) {
logger.warn('Error parsing data pelanggan', {data_pelanggan: _data_pelanggan});
}
}
var message = result.respon.pesan[0].replace(/\n/g, ' ');
if (response_code == '00') {
var sn = "";
if (config.h2h_out.parse_sn == 'YES') {
sn = parseSN(message);
} else if (token && data_pelanggan) {
sn = token + '/' + data_pelanggan;
}
message = 'SN=' + sn + '; ' + message;
}
callbackReport(task['requestId'], response_code, message);
});
});
}
function start(_config, _callbackReport, options) {
config = _config;
callbackReport = _callbackReport
if (options && options.logger) {
logger = options.logger;
} else {
logger = new winston.Logger({
transports: [
new (winston.transports.Console)()
]
});
}
}
function parseResult(message) {
var data;
xml(message, function(err, result) {
data = result;
});
return data;
}
exports.start = start;
exports.topupRequest = topupRequest;
exports.parseResult = parseResult;
exports.parseSN = parseSN;