function Shepherd_getConf(coin) {
	var result = [],
			ajax_data = { 'chain': coin };

	console.log(ajax_data);
	$.ajax({
		async: false,
		type: 'POST',
		data: JSON.stringify(ajax_data),
		url: 'http://127.0.0.1:17777/shepherd/getconf',
		contentType: 'application/json', // send as JSON
		success: function(data, textStatus, jqXHR) {
			var AjaxOutputData = JSON.parse(data);
			console.log(AjaxOutputData.result);
			result.push({ 'path': AjaxOutputData.result });
		},
		error: function(xhr, textStatus, error) {
			//console.log(xhr.statusText);
			//if ( xhr.readyState == 0 ) {
			//}
			//console.log(textStatus);
			//console.log(error);
		}
	});

	return result;
}

function Shepherd_setConf(coin) {
	var result = [],
			ajax_data = { 'chain': coin };

	console.log(ajax_data);
	$.ajax({
		async: false,
		type: 'POST',
		data: JSON.stringify(ajax_data),
		url: 'http://127.0.0.1:17777/shepherd/setconf',
		contentType: 'application/json', // send as JSON
		success: function(data, textStatus, jqXHR) {
			var AjaxOutputData = JSON.parse(data);
			console.log(AjaxOutputData);
			result.push({ 'result': AjaxOutputData.msg });
		},
		error: function(xhr, textStatus, error) {
			//console.log(xhr.statusText);
			//if ( xhr.readyState == 0 ) {
			//}
			//console.log(textStatus);
			//console.log(error);
		}
	});

	return result;
}

function Shepherd_herd(coin,herd_data) {
	var result = [];
			ajax_data = {
				'herd': coin,
				'options': herd_data
			};

	console.log(ajax_data);
	$.ajax({
		async: false,
		type: 'POST',
		data: JSON.stringify(ajax_data),
		url: 'http://127.0.0.1:17777/shepherd/herd',
		contentType: 'application/json', // send as JSON
		success: function(data, textStatus, jqXHR) {
			var AjaxOutputData = JSON.parse(data);
			console.log(AjaxOutputData);
			result.push({ 'result': AjaxOutputData.msg });
		},
		error: function(xhr, textStatus, error) {
			//console.log(xhr.statusText);
			//if ( xhr.readyState == 0 ) {
			//}
			//console.log(textStatus);
			//console.log(error);
		}
	});

	return result;
}

function Shepherd_herdlist(data) {
	return new Promise((resolve) => {
		var ajax_data_1 = { 'herdname': data },
				ajax_call_1 = $.ajax({
					data: JSON.stringify(ajax_data_1),
					url: 'http://127.0.0.1:17777/shepherd/herdlist',
					type: 'POST',
					contentType: 'application/json'
				});

		ajax_call_1.done(function(data) {
			resolve(data);
		});
	});
}

function Shepherd_FetchBasiliskData(req_data) {
	return new Promise((resolve) => {
		var tmpIguanaRPCAuth = 'tmpIgRPCUser@' + sessionStorage.getItem('IguanaRPCAuth'),
				parse_session_data = sessionStorage.getItem('IguanaActiveAccount');

		parse_session_data = JSON.parse(JSON.parse(parse_session_data));

		var session_pubkey = parse_session_data.pubkey,
				ajax_data = {
					'userpass': tmpIguanaRPCAuth,
					'pubkey': session_pubkey
				};

    console.log(req_data);
    if (req_data.allcoins !== false ) {
      var req_url = 'http://127.0.0.1:17777/shepherd/cache-all';
    } else {
      var req_url = 'http://127.0.0.1:17777/shepherd/cache-one';
      ajax_data.coin = req_data.coin;
      ajax_data.calls = req_data.calls;
    }

    console.log(ajax_data);

		$.ajax({
			type: 'GET',
			data: ajax_data,
			url: req_url,
			contentType: 'application/json', // send as JSON
		})
    .done(function(data) {
			resolve(data);
		});
	});
}

function Shepherd_GroomData_Get() {
  return new Promise((resolve) => {
    var parse_session_data = sessionStorage.getItem('IguanaActiveAccount');
    parse_session_data = JSON.parse(JSON.parse(parse_session_data));

    var request_method = '',
    		session_pubkey = parse_session_data.pubkey,
    		ajax_data = { 'filename': session_pubkey },
      	req_url = 'http://127.0.0.1:17777/shepherd/groom';

    console.log(ajax_data);
    $.ajax({
      type: 'GET',
      data: ajax_data,
      url: req_url,
      contentType: 'application/json', // send as JSON
    })
    .done(function(data) {
      var res_data = JSON.parse(data);
      resolve(res_data.result);
    });
  });
}

function Shepherd_GroomData_Post(req_data) {
  return new Promise((resolve) => {
    var parse_session_data = sessionStorage.getItem('IguanaActiveAccount');
    parse_session_data = JSON.parse(JSON.parse(parse_session_data));

    var request_method = '',
    		session_pubkey = parse_session_data.pubkey,
    		ajax_data = {
    			'filename': session_pubkey,
    			'payload': JSON.stringify(req_data)
    		},
    		req_url = 'http://127.0.0.1:17777/shepherd/groom';

    console.log(req_data);
    console.log(ajax_data);

    $.ajax({
      type: 'POST',
      data: ajax_data,
      url: req_url,
      dataType: 'json'
    })
    .done(function(data) {
      var res_data = data;
      resolve(res_data);
    });
  });
}

function Shepherd_GroomData_Delete() {
  return new Promise((resolve) => {
    var parse_session_data = sessionStorage.getItem('IguanaActiveAccount');
    parse_session_data = JSON.parse(JSON.parse(parse_session_data));

    var request_method = '',
        session_pubkey = parse_session_data.pubkey,
        ajax_data = {
          'filename': session_pubkey
        },
        req_url = 'http://127.0.0.1:17777/shepherd/groom';

    $.ajax({
      type: 'DELETE',
      data: ajax_data,
      url: req_url,
      dataType: 'json'
    })
    .done(function(data) {
      resolve(data);
    });
  });
}

function Shepherd_GetBasiliskCache() {
	return new Promise((resolve) => {
		var parse_session_data = sessionStorage.getItem('IguanaActiveAccount');
		parse_session_data = JSON.parse(JSON.parse(parse_session_data));

    var session_pubkey = parse_session_data.pubkey,
				ajax_data = { 'pubkey': session_pubkey };

		$.ajax({
			type: 'GET',
			data: ajax_data,
			url: 'http://127.0.0.1:17777/shepherd/cache',
			contentType: 'application/json' // send as JSON
		})
    .done(function(data) {
      resolve(data);
      data = JSON.parse(data);

      if (data.result === 'JSON parse error') {
        Shepherd_GroomData_Delete()
        .then(function(result) {
          console.log('error reading cache, flushing...');
        });
      }
		});
	});
}

function Shepherd_CheckBasiliskCacheData(coin) {
  return new Promise((resolve) => {
    Shepherd_GetBasiliskCache()
    .then(function(result) {
      var _data = JSON.parse(result),
      		query = _data.result.basilisk,
          coin_exists = true,
          addresses_exists = true,
          getbalance_exists = true,
          listtransactions_exists = true,
          listunspent_exists = true,
          refresh_exists = true;

      if (!query) {
        console.log('data not found.');
        var res_data = {
		        	'coin': false,
		        	'addresses': false,
		        	'getbalance': false,
		        	'listtransactions': false,
		        	'listunspent': false,
		        	'refresh': false
		        };
        resolve(res_data);
      } else if (!query[coin]) {
          console.log(coin + ' not found.');
          coin_exists = false;
          var res_data = {
          			'coin': coin_exists,
          			'addresses': false,
          			'getbalance': false,
          			'listtransactions': false,
          			'listunspent': false,
          			'refresh': false
          		};
          resolve(res_data);
      } else if (!('addresses' in query[coin])) {
          console.log(coin + ' addresses not found.');
          addresses_exists = false;
          res_data = {
          	'coin': coin_exists,
          	'getbalance': false,
          	'listtransactions': false,
          	'listunspent': false,
          	'refresh': false
          };
          resolve(res_data);
      } else {
        Promise.all(query[coin].addresses.map((coinaddr_value,coinaddr_index) => {
          return new Promise((resolve, reject) => {
            var data = query[coin][coinaddr_value].getbalance;

            if (!('getbalance' in query[coin][coinaddr_value])) {
              //console.log(coin + '>>>' + coinaddr_value + ' => getbalance not found.')
              getbalance_exists = false;
            }

            if (!('listtransactions' in query[coin][coinaddr_value])) {
              //console.log(coin + '>>>' + coinaddr_value + ' => listtransactions not found.')
              listtransactions_exists = false;
            }

            if (!('listunspent' in query[coin][coinaddr_value])) {
              //console.log(coin + '>>>' + coinaddr_value + ' => listunspent not found.')
              listunspent_exists = false;
            }

            if (!('refresh' in query[coin][coinaddr_value])) {
              //console.log(coin + '>>>' + coinaddr_value + ' => refresh not found.')
              refresh_exists = false;
            }

            pass_data = {
            	'getbalance': getbalance_exists,
            	'listtransactions': listtransactions_exists,
            	'listunspent': listunspent_exists,
            	'refresh': refresh_exists
            };
            resolve(pass_data);
          });
        }))
        .then(result => {
          var res_data = result[result.length - 1];
          res_data.coin = coin_exists;
          res_data.addresses = addresses_exists;
          resolve(res_data);
        });
      }
    });
  });
}


function Shepherd_SysInfo() {
  return new Promise((resolve) => {
    $.ajax({
      type: 'GET',
      url: 'http://127.0.0.1:17777/shepherd/sysinfo',
      contentType: 'application/json' // send as JSON
    })
    .done(function(data) {
      resolve(data);
    });
  });
}

function Shepherd_SendPendValue() {
  Shepherd_SysInfo().then(function(result){
    var ram_data = formatBytes(result.totalmem_bytes)
    var pend_val = null;
    if (ram_data.size === 'GB') {
      if (ram_data.ramsize >= '63' ) { pend_val = 16; }
      if (ram_data.ramsize >= '31' ) { pend_val = 8; }
      if (ram_data.ramsize >= '15' ) { pend_val = 4; }
      if (ram_data.ramsize <= '15' ) { pend_val = 1; }
    } else { pend_val = 1; }
    sessionStorage.setItem('IguanaPendValue', pend_val);
  })
}