// SPDX-FileCopyrightText: 2025 Jonas Smedegaard <dr@jones.dk>
// SPDX-License-Identifier: GPL-3.0-or-later

package dk.biks.bachelorizer;

import java.lang.UnsupportedOperationException;
import java.util.Arrays;

/// Bachelorizer - bachelor programme registrar
///
/// Tool for registering students
/// for activities in their bachelor programme.
///
/// Runner class spawning an interactive or non-interactive application
/// based on passed arguments
///
/// Multi-framework MVC structure inspired by project Криптоанализатор
/// written by Александр Хмелев <akhmelev@gmail.com>.
///
/// * v0.0.1-draft
///   * initial release, as part of delivery "Portfolio 1"
///
/// @version 0.0.1-draft
/// @see <https://moodle.ruc.dk/mod/assign/view.php?id=523186>
/// @see <https://github.com/demologin/CryptoAnalyzerLed>
public class Main {

	/// Default constructor
	///
	/// @param args  command-line arguments or default demo data
	public Main(final String[] args) {

		switch (uiFromArgs(args)) {
			case "gui" -> { Window.main(args); }
// TODO			case "tui" -> { Screen.main(args); }
// TODO			case "cli" -> { Prompt.main(args); }
			default -> {
				throw new UnsupportedOperationException(
					"Not yet implemented.");
			}
		}
	}

	/// JVM entry point
	///
	/// @param args  command-line arguments
	public static void main(String[] args) {

		// inject initial sample data unless passed as arguments
		if ((args.length == 0)
			|| (!Arrays.stream(args).anyMatch(
				s -> s != null && !s.startsWith("-")))
		) {
			args = new String[] {
				"Jonas Smedegaard",
				"CS-SMC2",
				"CS-SMC3",
			};
		}

		new Main(args);
	}

	/// minimal argument parser to detect explicit UI choice
	///
	/// @param args  command-line arguments
	/// @return      choice of UI as String
	public static String uiFromArgs(String[] args) {
		// TODO: make "cli" the default when implemented
		String defaultUI = "gui";

		for (String arg : args) {
			if (arg.matches("--(gui|tui|cli)")) {
				return (arg.length() == 2)
					? defaultUI
					: arg.substring(2);
			}
		}

		return defaultUI;
	}
}