package bndtools.wizards.workspace;

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.io.File;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.plugin.AbstractUIPlugin;

import aQute.bnd.build.Project;
import bndtools.Plugin;

public class WorkspaceSetupWizardPage extends WizardPage {

    public static final String PROP_LOCATION = "location";
    public static final String PROP_CLEAN_BUILD = "cleanBuild";

    private final PropertyChangeSupport propSupport = new PropertyChangeSupport(this);
    private final WorkspaceLocationPart locationPart = new WorkspaceLocationPart();

    private LocationSelection location = LocationSelection.WORKSPACE;
    private boolean cleanBuild = true;

    private Image bannerImg;

    public WorkspaceSetupWizardPage() {
        super("Workspace Setup");
    }

    @Override
    public void createControl(Composite parent) {
        setTitle("Setup Bnd Workspace");
        setDescription("Create a workspace folder with initial configuration");
        setImageDescriptor(Plugin.imageDescriptorFromPlugin("icons/bndtools-wizban.png")); //$NON-NLS-1$

        Composite composite = new Composite(parent, SWT.NONE);
        GridLayout layout = new GridLayout(1, false);
        layout.verticalSpacing = 20;
        composite.setLayout(layout);
        setControl(composite);

        bannerImg = AbstractUIPlugin.imageDescriptorFromPlugin(Plugin.PLUGIN_ID, "banner.png")
            .createImage(parent.getDisplay());
        Label lblBanner = new Label(composite, SWT.NONE);
        lblBanner.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
        lblBanner.setImage(bannerImg);

        Control locationControl = locationPart.createControl(composite);
        locationControl.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));

        locationPart.addPropertyChangeListener(WorkspaceLocationPart.PROP_LOCATION, new PropertyChangeListener() {
            @Override
            public void propertyChange(PropertyChangeEvent evt) {
                LocationSelection oldLocation = location;
                location = locationPart.getLocation();
                propSupport.firePropertyChange(PROP_LOCATION, oldLocation, location);
                updateUI();
            }
        });

        Group buildGroup = new Group(composite, SWT.NONE);
        buildGroup.setText("Build");
        buildGroup.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
        buildGroup.setLayout(new GridLayout(1, false));

        final Button btnCleanBuild = new Button(buildGroup, SWT.CHECK);
        btnCleanBuild.setText("Clean workspace after import (Recommended)");
        btnCleanBuild.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false));
        btnCleanBuild.setSelection(cleanBuild);

        btnCleanBuild.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                cleanBuild = btnCleanBuild.getSelection();
                updateUI();
            }
        });

        updateUI();
    }

    private void updateUI() {
        String warning = cleanBuild ? null : "Existing Bnd projects may not build until the workspace is cleaned.";

        // Check for existing workspace/cnf
        IProject cnfProject = ResourcesPlugin.getWorkspace()
            .getRoot()
            .getProject(Project.BNDCNF);
        if (cnfProject != null && cnfProject.exists()) {
            File cnfDir = cnfProject.getLocation()
                .toFile();
            warning = String.format("This Eclipse workspace is already configured as a Bnd workspace. You will not be able to create or import a Bnd workspace from elsewhere.", cnfDir);
        }
        setMessage(warning, WARNING);

        String locationError = location.validate();
        setErrorMessage(locationError);
        setPageComplete(locationError == null);
    }

    @Override
    public void dispose() {
        super.dispose();
        bannerImg.dispose();
    }

    public void setLocation(LocationSelection location) {
        this.location = location;
        locationPart.setLocation(location);
    }

    public LocationSelection getLocation() {
        return location;
    }

    public void setCleanBuild(boolean cleanBuild) {
        this.cleanBuild = cleanBuild;
    }

    public boolean isCleanBuild() {
        return cleanBuild;
    }

    public void addPropertyChangeListener(PropertyChangeListener listener) {
        propSupport.addPropertyChangeListener(listener);
    }

    public void removePropertyChangeListener(PropertyChangeListener listener) {
        propSupport.removePropertyChangeListener(listener);
    }

    public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) {
        propSupport.addPropertyChangeListener(propertyName, listener);
    }

    public void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) {
        propSupport.removePropertyChangeListener(propertyName, listener);
    }

}
