export default (command: string, options: any = null) => {
	options = options || {};
	if (!('handleEscape' in options)) {
		options.handleEscape = true;
	}

	const args = [];
	let state = 'start';
	let current = '';
	let quote = '"';
	let escapeNext = false;
	for (let i = 0; i < command.length; i++) {
		const c = command[i];

		if (state === 'quotes') {
			if (c !== quote) {
				current += c;
			} else {
				args.push(current);
				current = '';
				state = 'start';
			}
			continue;
		}

		if (escapeNext) {
			current += c;
			escapeNext = false;
			continue;
		}

		if (c === '\\' && options.handleEscape) {
			escapeNext = true;
			continue;
		}

		if (c === '"' || c === '\'') {
			state = 'quotes';
			quote = c;
			continue;
		}

		if (state === 'arg') {
			if (c === ' ' || c === '\t') {
				args.push(current);
				current = '';
				state = 'start';
			} else {
				current += c;
			}
			continue;
		}

		if (c !== ' ' && c !== '\t') {
			state = 'arg';
			current += c;
		}
	}

	if (state === 'quotes') {
		throw new Error(`Unclosed quote in command line: ${command}`);
	}

	if (current !== '') {
		args.push(current);
	}

	if (args.length <= 0) {
		throw new Error('Empty command line');
	}

	return args;
};