'use strict';

const https = require('node:https');
const http = require('node:http');

const { WritableBuffer } = require('./writable-buffer');


const protocols = { http, https };


const downloadRecursive = async (url, count = 1) => {
	url = url.toLowerCase();
	
	const stream = new WritableBuffer();
	const proto = protocols[url.match(/^https?/)[0]];
	
	const response = await new Promise((res, rej) => {
		const request = proto.get(url, (response) => res(response));
		request.on('error', (err) => rej(err));
	});
	
	// Handle redirects
	if ([301, 302, 303, 307].includes(response.statusCode)) {
		if (count < 5) {
			return downloadRecursive(response.headers.location, count + 1);
		}
		console.log(url);
		throw new Error('Error: Too many redirects.');
	}
	
	// Handle bad status
	if (response.statusCode !== 200) {
		console.log(url);
		throw new Error(`Response status was ${response.statusCode}`);
	}
	
	response.pipe(stream);
	
	return new Promise((res, rej) => {
		response.on('error', (err) => rej(err));
		response.on('end', () => res(stream.get()));
	});
};

const download = (url) => downloadRecursive(url);

module.exports = { download };