// SPDX-FileCopyrightText: 2025 <Alexander Marthin Klemensen stud-marthin@ruc.dk>
// SPDX-FileCopyrightText: 2025 <Ian Valentin Christensen stud-ianc@ruc.dk>
// SPDX-FileCopyrightText: 2025 Jonas Smedegaard <dr@jones.dk>
// SPDX-FileCopyrightText: 2025 <Zahed Noos zahed@ruc.dk>
// SPDX-License-Identifier: GPL-3.0-or-later

package dk.biks.bachelorizer;

import java.util.List;

import javafx.scene.control.ComboBox;
import javafx.scene.control.Label;
import javafx.scene.control.TextArea;

/// Bachelorizer - Controller
class Controller {

	/// Storage model
	private Storage store;

	/// UI model
	private UI ui;

	/// Application view
	private Window view;

	/// Parameters passed on command-line and in JNLP file
	private List<String> parameters;

	/// clear the participation choices at program launch
	void initialize() {
		store.initialize();
	}

	/// default constructor
	///
	/// @param store  Storage model
	/// @param ui     UI model
	/// @param view   Application view
	Controller(
		final Storage store, final UI ui, final Window view
	) {
		this.store = store;
		this.ui = ui;
		this.view = view;
	}

	/// parse application parameters
	///
	/// Parse parameters as GNU-style options and arguments,
	/// i.e. treat dash-prefixed words as options
	/// until an optional first bare "--",
	/// taking first non-option argument as name of student
	/// and remaining ones as activity selections.
	///
	/// @param parameters  Application parameters
	public final void setParameters(final List<String> parameters) {
		boolean optionsDone = false;
		boolean studentAssigned = false;
/* TODO
		for (String item: parameters) {
			if (!optionsDone && item.matches("--")) {
				optionsDone = true;
			} else if (!item.startsWith("-")) {
				if (!studentAssigned) {
					store.addStudent(item);
					studentAssigned = true;
// TODO					ui.showStudent(
//						model.getStudentName());
				} else {
					store.addParticipation(
					  store.getActivityIndeks(item));
// TODO					ui.showActivities();
				}
			}
		}
*/
	}

	/// callback when category has been selected
	///
	/// @param section   section the category is tied to
	/// @param category  selected category
	// TODO: require a UI instead
	void onCategorySelected(
		final GUI.Section section,
		final String category
	) {
		view.clearSelections(section);
		view.setOptions(section, store.selectProgram(category));
	}

	/// callback when activity has been selected
	///
	/// @param combo  involved activity box
	/// @param item   selected activity
	/// @param area   whole text area
	void onActivitySelected(
		final ComboBox<String> combo,
		final String item,
		final TextArea area
	) {

		// pass the value chosen in the box
		store.addParticipation(store.getActivityIndeks(item));

		// update text area based on category choice
		//
		// Users can choose from the ComboBox,
		// and string (activity) and the area will then update.
		updateArea(combo, area);
	}

	/// callback when subject module has been selected
	///
	/// @param subject1  involved 1st column subject module box
	/// @param subject2  involved 2nd column subject module box
	void onSubjectModuleSelected(
		final ComboBox<String> subject1,
		final ComboBox<String> subject2
	) {

		// remove chosen option from opposite subject module box
		for (String sub: store.getAllSubjects()) {
			if (sub.equals(subject1.getValue())) {
				subject2.getItems().remove(
					subject1.getValue());
			} else if (
				!sub.equals(subject1.getValue())
				&& !subject2.getItems().contains(sub)
			) {
				subject2.getItems().add(sub);
			}
		}
	}

	/// update text area for an activity box
	///
	/// Clears the text area
	/// and adds all activity names from activities in participation.
	///
	/// @param combo     involved activity box
	/// @param textArea  whole text area
	void updateArea(
		final ComboBox<String> combo, final TextArea textArea
	) {
		textArea.clear();
		for (String s: store.getParticipation(combo.getValue())
		) {
			textArea.appendText(s + "\n");
		}
	}

	/// update label with current ECTS of program type
	/// @param ectslabel  text display area for ECTS points
	/// @param comboBox   involved activity box
	void updateEcts(
		final Label ectslabel, final ComboBox<String> comboBox
	) {
		ectslabel.setText("ECTS: "
			+ store.getSumEcts(comboBox.getValue()));
	}

	void fillElective(final ComboBox<String> electiveBox) {
		electiveBox.getItems().addAll(store.getAllActivities());
	}
}