package eu.dnetlib.dlms.swing.wizard;

import java.awt.BorderLayout;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JDialog;


public abstract class AbstractDialogWizard<T extends DialogResult> extends JDialog {

	/**
	 * 
	 */
	private static final long serialVersionUID = -3456843453087986788L;
	
	private int currentStep = 0;

	private StepsPanel stepsPanel;
	private ButtonsPanel buttonsPanel;
	private MainPanel mainPanel;
	
	private List<String> steps;
	private List<MainStepPanel<T>> listStepPanels;
	
	protected T result;
	
	
	public AbstractDialogWizard(List<String> steps, T result) {
		super();
		this.steps = steps;
		this.result = result;
		
		listStepPanels = new ArrayList<MainStepPanel<T>>();
		
		initStepPanel(listStepPanels);
		
		
		setSize(600, 400);
		setModal(true);
		setLayout(new BorderLayout());
		stepsPanel = new StepsPanel(this);
		buttonsPanel = new ButtonsPanel(this);
		mainPanel = new MainPanel(this);
		add(stepsPanel, BorderLayout.WEST);
		add(mainPanel, BorderLayout.CENTER);
		add(buttonsPanel, BorderLayout.PAGE_END);

		listStepPanels.get(0).redraw();
		
		validate();
		setVisible(true);
	}

	abstract protected void initStepPanel(List<MainStepPanel<T>> panels);
	
	
	private void executeStep(int i) {
		listStepPanels.get(i).executeStep();
	}
	
	private void abortStep(int i) {
		listStepPanels.get(i).abortStep();
	}
	
	
	public List<MainStepPanel<T>> listStepPanels() {
		return listStepPanels;
	}
	
	public void updateStatus() {
		stepsPanel.updateStatus();
		buttonsPanel.updateStatus();
		mainPanel.updateContent(currentStep);
	}

	public int getCurrentStep() {
		return currentStep;
	}

	
	public void goToPrevStep() {
		if (currentStep > 0) {
			currentStep--;
			abortStep(currentStep);
		}
		updateStatus();
	}


	public void goToNextStep() {
		if (currentStep < steps.size() - 1) {
			executeStep(currentStep);
			currentStep++;
		}
		updateStatus();
	}

	public void executeFinalStep() {
		executeStep(steps.size() - 1);		
		dispose();
	}


	public void abort() {
		dispose();
	}


	public List<String> getSteps() {
		return steps;
	}


	public void setSteps(List<String> steps) {
		this.steps = steps;
	}

	public DialogResult getResult() {
		return result;
	}

	public void setResult(T result) {
		this.result = result;
	}
	
}
