`use strict`

const http = require('http');
const https = require('https');
const url = require('url');

function getProtocol(path) {
	return url.parse(path).protocol === "http:" ? http : https;
}

/**
 * Send a get request
 * @param path is the url endpoint
 * @param headers of the request
 * @param callback contains (error, body, status, headers)
 */
 function get(path, headers, callback) {
 	request(path, "GET", null, headers, callback);
 }

/**
 * Send a post request
 * @param path is the url endpoint
 * @param headers of the request
 * @param callback contains (error, body, status, headers)
 * @param data a JSON Object or a string
 */
 function post(path, data, headers, callback) {
 	request(path, "POST", data, headers, callback);
 }

/**
 * Send a custom request
 * @param path is the url endpoint
 * @param headers of the request
 * @param callback contains (error, statusCode, data)
 * @param data a JSON Object or a string
 * @param method is the protocol used like POST GET DELETE PUT etc...
 */
 function request(path, method, data, headers = '', callback) {
 	if (typeof data === 'function') {
 		callback = data;
 		data = '';
 	} else if (typeof headers === 'function') {
 		callback = headers;
 		headers = {};
 	} 
 	const postData = typeof data === "object" ? JSON.stringify(data) : data;
 	const parsedUrl = url.parse(path);
 	const options = {
 		hostname: parsedUrl.hostname,
 		port: parsedUrl.port,
 		path: parsedUrl.pathname +  (!!parsedUrl.search ? parsedUrl.search : ''),
  		method: method,
 		headers: headers
 	};
 	const req = getProtocol(path).request(options, function (response) {
 		handleResponse(response, callback);
 	});
 	req.on('error', function (error) {
 		callback(error);
 		console.error(error);
 	});
	// Write data to request body
	if (method !== "GET")
		req.write(postData);
	req.end();
}

function handleResponse(response, callback) {
	let body = '';
	const status = response.statusCode;
	const hasError = status >= 300;
	response.setEncoding('utf8');
	response.on('data', function (data) {
		body += data;
	});
	response.on('end', function () {
		callback(hasError ? body : null, hasError ? null : body, response.statusCode, response.headers);
	});
}

module.exports = {
	get,
	request,
	post
};