package de.griefed.serverpackcreatoraddonexample;

import de.griefed.serverpackcreator.ApplicationProperties;
import de.griefed.serverpackcreator.ConfigurationModel;
import de.griefed.serverpackcreator.plugins.serverpackhandler.ServerPackArchiveCreated;
import de.griefed.serverpackcreator.plugins.serverpackhandler.ServerPackCreated;
import de.griefed.serverpackcreator.plugins.serverpackhandler.ServerPackStart;
import de.griefed.serverpackcreator.plugins.swinggui.AddTab;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.pf4j.Extension;
import org.pf4j.Plugin;
import org.pf4j.PluginWrapper;

import javax.swing.*;
import java.awt.*;

public class ExamplePlugin extends Plugin {

    private static final Logger LOG_ADDONS = LogManager.getLogger("AddonsLogger");

    /*
        You should provide and read all these from the manifest.
                                                                    */
    public static final String NAME = "ServerPackCreatorExampleAddon";
    public static final String DESCRIPTION = "This is an example addon for ServerPackCreator showcasing all, currently 4, aspects of" +
            "ServerPackCreators addon functionality. In this example you see code which gets executed before a server pack is generated," +
            "code that gets executed after a server pack was generated but before the ZIP-archive is created, code that gets executed" +
            "after this ZIP-archive was created, as well as code adding a new tabbed pane to the GUI.";
    public static final String AUTHOR = "Griefed";
    public static final String VERSION = "0.0.1";

    public ExamplePlugin(PluginWrapper wrapper) {
        super(wrapper);
    }

    @Override
    public void start() {
        LOG_ADDONS.info("Starting ExamplePlugin...");
        LOG_ADDONS.info("This methods should prepare the environment for anything you want to do with it.");
        /*
            Write all your preparation code here..
                                                    */
    }

    @Extension(ordinal = 1)
    public static class ExampleStartPlugin implements ServerPackStart {

        @Override
        public void run(ApplicationProperties applicationProperties, ConfigurationModel configurationModel, String destination) throws Exception {
            LOG_ADDONS.info("This would run before a server pack generation.");
            LOG_ADDONS.info("We recieved the following configurationModel: " + configurationModel.toString());
            LOG_ADDONS.info("We received the following applicationProperties: " + applicationProperties.toString());
            /*
                Write all your pre-gen stuff here...
                                                        */
        }

        @Override
        public String getName() {
            return NAME;
        }

        @Override
        public String getDescription() {
            return DESCRIPTION;
        }

        @Override
        public String getAuthor() {
            return AUTHOR;
        }

        @Override
        public String getVersion() {
            return VERSION;
        }
    }

    @Extension(ordinal = 1)
    public static class ExampleCreatedPlugin implements ServerPackCreated {

        @Override
        public void run(ApplicationProperties applicationProperties, ConfigurationModel configurationModel, String destination) throws Exception {
            LOG_ADDONS.info("This would run after a server pack was generated, but BEFORE the ZIP-archive would be generated.");
            LOG_ADDONS.info("We recieved the following configurationModel: " + configurationModel.toString());
            LOG_ADDONS.info("We received the following applicationProperties: " + applicationProperties.toString());
            /*
                Write all your post-gen-pre-zip stuff here...
                                                                 */
        }

        @Override
        public String getName() {
            return NAME;
        }

        @Override
        public String getDescription() {
            return DESCRIPTION;
        }

        @Override
        public String getAuthor() {
            return AUTHOR;
        }

        @Override
        public String getVersion() {
            return VERSION;
        }
    }

    @Extension(ordinal = 1)
    public static class ExampleArchivePlugin implements ServerPackArchiveCreated {

        @Override
        public void run(ApplicationProperties applicationProperties, ConfigurationModel configurationModel, String destination) throws Exception {
            LOG_ADDONS.info("This would run after the server pack ZIP-archive was created.");
            LOG_ADDONS.info("We recieved the following configurationModel: " + configurationModel.toString());
            LOG_ADDONS.info("We received the following applicationProperties: " + applicationProperties.toString());
            /*
                Write all your post-archive stuff here...
                                                        */
        }

        @Override
        public String getName() {
            return NAME;
        }

        @Override
        public String getDescription() {
            return DESCRIPTION;
        }

        @Override
        public String getAuthor() {
            return AUTHOR;
        }

        @Override
        public String getVersion() {
            return VERSION;
        }
    }

    @Extension(ordinal = 1)
    public static class ExampleTabbedpanePlugin extends JComponent implements AddTab {

        @Override
        public JComponent getTab() {
            JComponent jComponent = new JPanel(false);
            jComponent.setLayout(new GridBagLayout());

            GridBagConstraints gridBagConstraints = new GridBagConstraints();
            gridBagConstraints.fill = GridBagConstraints.NONE;
            gridBagConstraints.anchor = GridBagConstraints.CENTER;
            gridBagConstraints.gridwidth = 1;
            gridBagConstraints.gridheight = 1;
            gridBagConstraints.weightx = 1;
            gridBagConstraints.weighty = 1;

            JLabel jLabel = new JLabel("This is a label");
            jLabel.setToolTipText("Some label tooltip");
            gridBagConstraints.gridx = 1;
            gridBagConstraints.gridy = 1;
            jComponent.add(jLabel, gridBagConstraints);

            JButton jButton = new JButton("Some button");
            jButton.setToolTipText("This could do anything");
            gridBagConstraints.gridx = 1;
            gridBagConstraints.gridy = 2;
            jComponent.add(jButton, gridBagConstraints);

            return jComponent;
        }

        @Override
        public Icon getTabIcon() {
            /*
             * other default icons can be:
             *   OptionPane.errorIcon
             *   OptionPane.warningIcon
             *   OptionPane.questionIcon
            */
            return UIManager.getIcon("OptionPane.informationIcon");
        }

        @Override
        public String getTabTitle() {
            return "Some title text";
        }

        @Override
        public String getTabTooltip() {
            return "Some tooltip text";
        }

        @Override
        public void run(ApplicationProperties applicationProperties, ConfigurationModel configurationModel, String destination) throws Exception {
            LOG_ADDONS.info("When adding tabbed panes, you could also write some backend logic here, like threads that do some stuff.");
            LOG_ADDONS.info("We recieved the following configurationModel: " + configurationModel.toString());
            LOG_ADDONS.info("We received the following applicationProperties: " + applicationProperties.toString());
            /*
                Write all your pre-gen stuff here...
                                                        */
        }

        @Override
        public String getName() {
            return NAME;
        }

        @Override
        public String getDescription() {
            return DESCRIPTION;
        }

        @Override
        public String getAuthor() {
            return AUTHOR;
        }

        @Override
        public String getVersion() {
            return VERSION;
        }
    }
}