/* SPDX-FileCopyrightText: 2026 Project Tick
 * SPDX-FileContributor: Project Tick
 * SPDX-License-Identifier: GPL-3.0-or-later WITH LicenseRef-MeshMC-MMCO-Module-Exception-1.0
 *
 *   MeshMC - A Custom Launcher for Minecraft
 *   Copyright (C) 2026 Project Tick
 *
 *   This program is free software: you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation, either version 3 of the License, or
 *   (at your option) any later version, with the additional permission
 *   described in the MeshMC MMCO Module Exception 1.0.
 *
 *   This program is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *   GNU General Public License for more details.
 *
 *   You should have received a copy of the GNU General Public License
 *   along with this program.  If not, see <https://www.gnu.org/licenses/>.
 *
 *   You should have received a copy of the MeshMC MMCO Module Exception 1.0
 *   along with this program.  If not, see <https://projecttick.org/licenses/>.
 */

#pragma once
#include <QWidget>

#include <java/JavaChecker.h>
#include <BaseVersion.h>
#include <QObjectPtr.h>
#include <QIcon>

class QLineEdit;
class VersionSelectWidget;
class QSpinBox;
class QPushButton;
class QVBoxLayout;
class QHBoxLayout;
class QGroupBox;
class QGridLayout;
class QLabel;
class QToolButton;

/**
 * This is a widget for all the Java settings dialogs and pages.
 */
class JavaSettingsWidget : public QWidget
{
	Q_OBJECT

  public:
	explicit JavaSettingsWidget(QWidget* parent);
	virtual ~JavaSettingsWidget() {};

	enum class JavaStatus {
		NotSet,
		Pending,
		Good,
		DoesNotExist,
		DoesNotStart,
		ReturnedInvalidData
	} javaStatus = JavaStatus::NotSet;

	enum class ValidationStatus { Bad, JavaBad, AllOK };

	void refresh();
	void initialize();
	ValidationStatus validate();
	void retranslate();

	bool permGenEnabled() const;
	int permGenSize() const;
	int minHeapSize() const;
	int maxHeapSize() const;
	QString javaPath() const;

  protected slots:
	void memoryValueChanged(int);
	void javaPathEdited(const QString& path);
	void javaVersionSelected(BaseVersionPtr version);
	void on_javaBrowseBtn_clicked();
	void on_javaStatusBtn_clicked();
	void checkFinished(JavaCheckResult result);

  protected: /* methods */
	void checkJavaPathOnEdit(const QString& path);
	void checkJavaPath(const QString& path);
	void setJavaStatus(JavaStatus status);
	void setupUi();

  private: /* data */
	VersionSelectWidget* m_versionWidget = nullptr;
	QVBoxLayout* m_verticalLayout = nullptr;

	QLineEdit* m_javaPathTextBox = nullptr;
	QPushButton* m_javaBrowseBtn = nullptr;
	QToolButton* m_javaStatusBtn = nullptr;
	QHBoxLayout* m_horizontalLayout = nullptr;

	QGroupBox* m_memoryGroupBox = nullptr;
	QGridLayout* m_gridLayout_2 = nullptr;
	QSpinBox* m_maxMemSpinBox = nullptr;
	QLabel* m_labelMinMem = nullptr;
	QLabel* m_labelMaxMem = nullptr;
	QSpinBox* m_minMemSpinBox = nullptr;
	QLabel* m_labelPermGen = nullptr;
	QSpinBox* m_permGenSpinBox = nullptr;
	QIcon goodIcon;
	QIcon yellowIcon;
	QIcon badIcon;

	int observedMinMemory = 0;
	int observedMaxMemory = 0;
	int observedPermGenMemory = 0;
	QString queuedCheck;
	uint64_t m_availableMemory = 0ull;
	shared_qobject_ptr<JavaChecker> m_checker;
	JavaCheckResult m_result;
};
