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

package com.example.portfolio2;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Label;
import javafx.scene.control.TextArea;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

import java.io.IOException;
import java.util.List;

public class HelloApplication extends Application {
	// Initializing model, controller and database objects
	private Model model = new Model();
	private Controller con = new Controller(model,this);
	MyDB myDB = new MyDB();

	/* Below is the original implementation of the UI elements with
	accompanying, individual calls to setOnAction to specify functionality.
	Before changing to a list format,
	we made sure methods in controller and model
	were generalized to allow for the new structure seamlessly.
	private ComboBox<String> programCombo = new ComboBox<>();
	private ComboBox<String> subject1Combo = new ComboBox<>();
	private ComboBox<String> subject2Combo = new ComboBox<>();
	private ComboBox<String> electiveCombo = new ComboBox<>();

	private ComboBox<String> programSelect = new ComboBox<>();
	private ComboBox<String> subject1Select = new ComboBox<>();
	private ComboBox<String> subject2Select = new ComboBox<>();
	private ComboBox<String> electiveSelect = new ComboBox<>();

	private TextArea programArea = new TextArea();
	private TextArea subject1Area = new TextArea();
	private TextArea subject2Area = new TextArea();
	private TextArea electiveArea = new TextArea();

	private Label programEcts = new Label();
	private Label subject1Ects = new Label();
	private Label subject2Ects = new Label();
	private Label electiveEcts = new Label();

	private VBox program = new VBox(new Label("Program"), programCombo, programSelect, programArea, programEcts);
	private VBox subject1 = new VBox(new Label("Subject 1"), subject1Combo, subject1Select, subject1Area, subject1Ects);
	private VBox subject2 = new VBox(new Label("Subject 2"), subject2Combo, subject2Select, subject2Area, subject2Ects);
	private VBox elective = new VBox(new Label("Elective"), electiveCombo, electiveSelect, electiveArea, electiveEcts);
	*/

	@Override
	public void start(Stage stage) throws IOException {
		// Clears old insertions into the participation table
		con.initialize();

		// Defines a list of columns based on their names.
		List<ActivityColumn> columns = List.of(
			new ActivityColumn("Program"),
			new ActivityColumn("Subject 1"),
			new ActivityColumn("Subject 2"),
			new ActivityColumn("Elective")
		);

		// Defines a list of subject modules
		List<String> subjectModules = List.of("Computer Science", "Informatik", "Astrology");

		// Loop for defining button funtionality for each activity column
		for (ActivityColumn col : columns) {
			col.nameLabel.setStyle("-fx-font-size: 18px; -fx-padding: 10px;"); // Styling
			col.ectsLabel.setStyle("-fx-font-size: 18px; -fx-padding: 10px");
			col.categoryCombo.setPrefSize(250, 35);
			col.activitySelect.setPrefSize(250, 35);
			col.area.setPrefWidth(250);

			// All boxes share the same activity logic
			col.activitySelect.setOnAction(event -> {
				con.onActivitySelected(col.categoryCombo, col.activitySelect, col.area);
				con.updateEcts(col.ectsLabel, col.categoryCombo);
			});

			switch (col.name) { // Switch statement handles different category boxes
			  case "Program" -> {
				col.categoryCombo.getItems().addAll("HumTek", "NatBach");
				col.categoryCombo.setOnAction(event -> {
					con.onComboSelected(col.categoryCombo, col.activitySelect, col.area);
				});
			}
			  case "Subject 1" -> { // We considered using the list for filling the box but couldn't figure it out
				col.categoryCombo.getItems().addAll("Computer Science", "Informatik", "Astrology");
				col.categoryCombo.setOnAction(event -> {
					con.onSubjectModuleSelected(col.categoryCombo, columns.get(2).categoryCombo, subjectModules);
					con.onComboSelected(col.categoryCombo, col.activitySelect, col.area);
				});
			}
			  case "Subject 2" -> {
				col.categoryCombo.getItems().addAll("Computer Science", "Informatik", "Astrology");
				col.categoryCombo.setOnAction(event -> { // We figured we have to specify
					// the second column like this but reckon there's a better way.
					con.onSubjectModuleSelected(col.categoryCombo, columns.get(1).categoryCombo, subjectModules);
					con.onComboSelected(col.categoryCombo, col.activitySelect, col.area);
				});
			}
			  case "Elective" -> {
				col.categoryCombo.setVisible(false); // Hide useless box
				con.fillElective(col.activitySelect);
			}
			}
		}

		// Define an HBox based on the columns and define the scene based on it.
		HBox root = new HBox(columns.get(0).asVBox(), columns.get(1).asVBox(), columns.get(2).asVBox(), columns.get(3).asVBox());
		Scene scene = new Scene(root, 1000, 500);
		stage.setTitle("Course Selector RUC: Ultimate Deluxe Edition");
		stage.setScene(scene);
		stage.show();
	}

	public static void main(String[] args) {
		launch();
	}

	// Class for each column of activities
	private class ActivityColumn {
		// Each column contains these elements
		String name;
		Label nameLabel;
		ComboBox<String> categoryCombo;
		ComboBox<String> activitySelect;
		TextArea area;
		Label ectsLabel;

		ActivityColumn(String name) {
			this.name = name;
			nameLabel = new Label(name);
			categoryCombo = new ComboBox<>();
			activitySelect = new ComboBox<>();
			area = new TextArea();
			ectsLabel = new Label();
			// new column, "this.name" to define and saved in the text felt,
			// new "nameLabel" to show visual text.
			// CategoryCombo creat a dropdown list
			// activitySelect creat one more dropdown list with Combobox, possible to choose activity.
			// area = new TextArea helps create a text felt to describe the chosen activity
			// ectsLabel = new Label shows text for ects points

		}

		VBox asVBox() {
			return new VBox(nameLabel, categoryCombo, activitySelect, area, ectsLabel);
		}
	}
}