package net.azib.ipscan.gui;

import net.azib.ipscan.config.Labels;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.*;

import java.util.ArrayList;
import java.util.List;

import static net.azib.ipscan.config.Config.getConfig;
import static net.azib.ipscan.config.Labels.getLabel;

public class GettingStartedDialog extends AbstractModalDialog {
	private int activePage;
	private List<String> texts = new ArrayList<>();
	private Text gettingStartedText;
	private Button allowReports;
	private Button closeButton;
	private Button nextButton;

	public GettingStartedDialog() {
		var num = 1;
		String text;
		while ((text = Labels.getInstance().getOrNull("text.gettingStarted" + num++)) != null)
			texts.add(text);
	}

	void prependText(String text) {
		texts.add(0, text);
	}

	@Override
	protected void populateShell() {
		var currentDisplay = Display.getCurrent();
		var parent = currentDisplay != null ? currentDisplay.getActiveShell() : null;
		shell = new Shell(parent, SWT.APPLICATION_MODAL | SWT.DIALOG_TRIM);

		shell.setText(getLabel("title.gettingStarted"));
		shell.setSize(new Point(600, 300));

		var iconLabel = new Label(shell, SWT.ICON);
		iconLabel.setLocation(10, 10);
		
		if (parent != null) {
			iconLabel.setImage(parent.getImage());
			shell.setImage(parent.getImage());
		}		
		iconLabel.pack();
		var leftBound = iconLabel.getBounds().width + 20;

		allowReports = new Button(shell, SWT.CHECK);
		allowReports.setText(getLabel("preferences.allowReports"));
		allowReports.pack();
		allowReports.setSelection(getConfig().allowReports);
		allowReports.addListener(SWT.Selection, e -> getConfig().allowReports = allowReports.getSelection());

		closeButton = new Button(shell, SWT.NONE);
		closeButton.setText(getLabel("button.close"));

		nextButton = new Button(shell, SWT.NONE);
		nextButton.setText(getLabel("button.next"));
		nextButton.setFocus();
		
		positionButtons(nextButton, closeButton);
		allowReports.setBounds(leftBound, nextButton.getBounds().y, allowReports.getSize().x, nextButton.getBounds().height);
		
		gettingStartedText = new Text(shell, SWT.BORDER | SWT.MULTI | SWT.READ_ONLY | SWT.V_SCROLL | SWT.WRAP);
		gettingStartedText.setBounds(leftBound, 10, shell.getClientArea().width - leftBound - 10, closeButton.getLocation().y - 20);
		gettingStartedText.setBackground(shell.getDisplay().getSystemColor(SWT.COLOR_LIST_BACKGROUND));
		
		closeButton.addListener(SWT.Selection, e -> close());
		nextButton.addListener(SWT.Selection, e -> displayActivePage());

		displayActivePage();
	}

	@Override
	protected int getShellStyle() {
		return super.getShellStyle() | SWT.SHEET;
	}

	private void displayActivePage() {
		if (activePage < texts.size())
			gettingStartedText.setText(texts.get(activePage++));
		
		if (activePage >= texts.size()) {
			nextButton.setEnabled(false);
			shell.setDefaultButton(closeButton);
			closeButton.setFocus();
		}
	}
	
}
