"use strict";

const { regexp: regexp_, anyCharOf, letter, digit } = require("parjs");
const { many, must, map, or, manySepBy, then, each } = require("parjs/combinators");

let first = map((items) => items[0]);

// TODO:
// label combinator, for error labeling
// named regexes
// named 'must' predicates

function sequence(items) {
	let mappedItems = items.map((item) => {
		if (typeof item === "string") {
			return string(item);
		} else if (item instanceof RegExp) {
			return regexp(item);
		} else {
			return item;
		}
	});
}

function regexp(regex) {
	// The `.call` is a workaround for https://github.com/GregRos/parjs/pull/30
	return regexp_.call({}, regex);
}

let ipv4Digit = regexp(/[0-9]{1,3}/).pipe(first);

let ipv6Address = regexp(/[a-f0-9:.]{2,45}/i).pipe(
	first
);

// FIXME: Find a way to compose `manySepBy` and `exactly`
let ipv4Address = ipv4Digit.pipe(
	manySepBy("."),
	must((results) => results.length === 4),
	map((octets) => octets.join("."))
);

let ipAddress = ipv4Address.pipe(
	or(ipv6Address)
);

// let ipv4Address = regexp.call();

// console.log(ipAddress.parse(process.argv[2]));

function combine([ previous, current ]) {
	return previous.concat([ current ]);
}

let test = letter().pipe(
	then(digit()),
	then(letter()),
	combine,
	// then(combine),
	then(digit()),
	then(combine),
	then(letter())
);

console.log(test.parse(process.argv[2]));
