/**
 * BetonQuest Editor - advanced quest creating tool for BetonQuest
 * Copyright (C) 2015  Jakub "Co0sh" Sapalski
 * 
 * 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.
 * 
 * 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 <http://www.gnu.org/licenses/>.
 */
package pl.betoncraft.betonquest.editor.controller;

import java.awt.Desktop;
import java.io.File;
import java.io.IOException;
import java.net.URI;

import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.fxml.FXML;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuItem;
import javafx.stage.DirectoryChooser;
import javafx.stage.FileChooser;
import javafx.stage.FileChooser.ExtensionFilter;
import pl.betoncraft.betonquest.editor.BetonQuestEditor;
import pl.betoncraft.betonquest.editor.model.PackageSet;
import pl.betoncraft.betonquest.editor.model.PackageSet.SaveType;
import pl.betoncraft.betonquest.editor.model.QuestPackage;

/**
 * Controls main menu.
 *
 * @author Jakub Sapalski
 */
public class MainMenuController {
	
	private static MainMenuController instance;
	
	@FXML private MenuItem save;
	@FXML private Menu saveAs;
	@FXML private MenuItem export;
	@FXML private MenuItem pack;
	
	public MainMenuController() {
		instance = this;
	}
	
	public static void setSaveEnabled(boolean enabled) {
		instance.save.setDisable(!enabled);
	}
	
	public static void setSaveAsEnabled(boolean enabled) {
		instance.saveAs.setDisable(!enabled);
	}
	
	public static void setExportEnabled(boolean enabled) {
		instance.export.setDisable(!enabled);
	}
	
	public static void setPackEnabled(boolean enabled) {
		instance.pack.setDisable(!enabled);
	}
	
	public static MainMenuController getInstance() {
		return instance;
	}

	@FXML private void newSet() {
		try {
			StringProperty name = new SimpleStringProperty();
			if (NameEditController.display(name, true)) {
				if (!PackageSet.isUnique(name.get())) {
					BetonQuestEditor.showError("already-exists");
					return;
				}
				PackageSet set = new PackageSet(null, SaveType.NONE, name.get());
				QuestPackage pack = new QuestPackage(set, name.get());
				set.getPackages().add(pack);
				BetonQuestEditor.getInstance().getSets().add(set);
				RootController.setPackageSets(BetonQuestEditor.getInstance().getSets());
				BetonQuestEditor.getInstance().display(set);
			}
		} catch (Exception e) {
			ExceptionController.display(e);
		}
	}

	@FXML private void newPackage() {
		try {
			StringProperty name = new SimpleStringProperty();
			if (NameEditController.display(name, true)) {
				PackageSet set = BetonQuestEditor.getInstance().getDisplayedPackage().getSet();
				QuestPackage pack = new QuestPackage(set, name.get());
				set.getPackages().add(pack);
				RootController.setPackageSets(BetonQuestEditor.getInstance().getSets());
				BetonQuestEditor.getInstance().display(pack);
			}
		} catch (Exception e) {
			ExceptionController.display(e);
		}
	}

	@FXML private void loadZip() {
		try {
			BetonQuestEditor instance = BetonQuestEditor.getInstance();
			FileChooser fc = new FileChooser();
			fc.setTitle(instance.getLanguage().getString("select-file"));
			ExtensionFilter filter = new ExtensionFilter("ZIP Files", "*.zip");
			fc.getExtensionFilters().add(filter);
			fc.setSelectedExtensionFilter(filter);
			File desktop = new File(System.getProperty("user.home") + File.separator + "Desktop");
			if (desktop != null) fc.setInitialDirectory(desktop);
			File selectedFile = fc.showOpenDialog(instance.getPrimaryStage());
			if (selectedFile != null) {
				try {
					PackageSet set = PackageSet.loadFromZip(selectedFile);
					if (set != null) {
						instance.display(set);
					}
				} catch (Exception e) {
					ExceptionController.display(e);
				}
			}
		} catch (Exception e) {
			ExceptionController.display(e);
		}
	}

	@FXML private void loadDirectory() {
		try {
			BetonQuestEditor instance = BetonQuestEditor.getInstance();
			DirectoryChooser dc = new DirectoryChooser();
			dc.setTitle(instance.getLanguage().getString("select-folder"));
			File desktop = new File(System.getProperty("user.home") + File.separator + "Desktop");
			if (desktop != null) dc.setInitialDirectory(desktop);
			File selectedFile = dc.showDialog(instance.getPrimaryStage());
			if (selectedFile != null) {
				try {
					PackageSet set = PackageSet.loadFromDirectory(selectedFile);
					if (set != null) {
						instance.display(set);
					}
				} catch (Exception e) {
					ExceptionController.display(e);
				}
			}
		} catch (Exception e) {
			ExceptionController.display(e);
		}
	}
	
	@FXML public void save() {
		try {
			PackageSet set = BetonQuestEditor.getInstance().getDisplayedPackage().getSet();
			if (set.getFile() != null) {
				switch (set.getSaveType()) {
				case ZIP:
					set.saveToZip(set.getFile());
					break;
				case DIR:
					set.saveToDirectory(set.getFile());
					break;
				default:
					// do nothing
				}
			}
		} catch (Exception e) {
			ExceptionController.display(e);
		}
	}

	@FXML private void saveZip() {
		try {
			BetonQuestEditor instance = BetonQuestEditor.getInstance();
			FileChooser fc = new FileChooser();
			fc.setTitle(instance.getLanguage().getString("select-file"));
			ExtensionFilter filter = new ExtensionFilter("ZIP Files", "*.zip");
			fc.getExtensionFilters().add(filter);
			fc.setSelectedExtensionFilter(filter);
			File desktop = new File(System.getProperty("user.home") + File.separator + "Desktop");
			if (desktop != null) fc.setInitialDirectory(desktop);
			File selectedFile = fc.showSaveDialog(instance.getPrimaryStage());
			if (selectedFile != null) {
				PackageSet set = BetonQuestEditor.getInstance().getDisplayedPackage().getSet();
				set.saveToZip(selectedFile);
				set.setSaveType(SaveType.ZIP);
				set.setFile(selectedFile);
				MainMenuController.setSaveEnabled(true);
			}
		} catch (Exception e) {
			ExceptionController.display(e);
		}
	}

	@FXML private void saveDirectory() {
		try {
			BetonQuestEditor instance = BetonQuestEditor.getInstance();
			DirectoryChooser dc = new DirectoryChooser();
			dc.setTitle(instance.getLanguage().getString("select-directory"));
			File desktop = new File(System.getProperty("user.home") + File.separator + "Desktop");
			if (desktop != null) dc.setInitialDirectory(desktop);
			File selectedFile = dc.showDialog(instance.getPrimaryStage());
			if (selectedFile != null) {
				PackageSet set = BetonQuestEditor.getInstance().getDisplayedPackage().getSet();
				set.saveToDirectory(selectedFile);
				set.setSaveType(SaveType.DIR);
				set.setFile(selectedFile);
				MainMenuController.setSaveEnabled(true);
			}
		} catch (Exception e) {
			ExceptionController.display(e);
		}
	}
	
	@FXML public void export() {
		try {
			File script = new File("export.sh");
			if (!script.exists()) {
				script = new File("export.bat");
				if (!script.exists()) {
					BetonQuestEditor.showError("no-export-script");
					return;
				}
			}
			PackageSet set = BetonQuestEditor.getInstance().getDisplayedPackage().getSet();
			File file = new File(script.getParentFile(), "export_" + set.getName().get() + ".zip");
			set.saveToZip(file);
			ProcessBuilder pb = new ProcessBuilder(script.getName(), file.getAbsolutePath());
			pb.directory(script.getParentFile());
			pb.start();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	@FXML private void quit() {
		try {
			System.exit(0);
		} catch (Exception e) {
			ExceptionController.display(e);
		}
	}
	
	@FXML private void settings() {
		try {
			SettingsController.display();
		} catch (Exception e) {
			ExceptionController.display(e);
		}
	}
	
	@FXML private void reload() {
		try {
			BetonQuestEditor.reload();
		} catch (Exception e) {
			ExceptionController.display(e);
		}
	}
	
	@FXML private void about() {
		try {
			AboutController.display();
		} catch (Exception e) {
			ExceptionController.display(e);
		}
	}
	
	@FXML private void changelog() {
		try {
			ChangelogController.display();
		} catch (Exception e) {
			ExceptionController.display(e);
		}
	}
	
	@FXML private void docs() {
		try {
			Desktop.getDesktop().browse(new URI("http://betonquest.betoncraft.pl/BetonQuestDocumentation.pdf"));
		} catch (Exception e) {
			ExceptionController.display(e);
		}
	}
}