using System.Collections.Immutable;

namespace Phantom.Server.Minecraft;

public static class JvmArgumentsHelper {
	public static ImmutableArray<string> Split(string arguments) {
		return arguments.Split('\n', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries).ToImmutableArray();
	}

	public static string Join(ImmutableArray<string> arguments) {
		return string.Join('\n', arguments);
	}

	public static ValidationError? Validate(string arguments) {
		return Validate(Split(arguments));
	}

	private static ValidationError? Validate(ImmutableArray<string> arguments) {
		if (!arguments.All(static argument => argument.StartsWith('-'))) {
			return ValidationError.InvalidFormat;
		}

		// TODO not perfect, but good enough
		if (arguments.Any(static argument => argument.Contains("-Xmx"))) {
			return ValidationError.XmxNotAllowed;
		}
		
		if (arguments.Any(static argument => argument.Contains("-Xms"))) {
			return ValidationError.XmsNotAllowed;
		}
		
		return null;
	}

	public enum ValidationError {
		InvalidFormat,
		XmxNotAllowed,
		XmsNotAllowed
	}

	public static string ToSentence(this ValidationError? result) {
		return result switch {
			ValidationError.InvalidFormat => "Invalid format.",
			ValidationError.XmxNotAllowed => "The -Xmx argument must not be specified manually.",
			ValidationError.XmsNotAllowed => "The -Xms argument must not be specified manually.",
			_                             => throw new ArgumentOutOfRangeException(nameof(result), result, null)
		};
	}
}