/*******************************************************************************
 * Copyright (c) 2015 QNX Software Systems and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *******************************************************************************/
package org.eclipse.cdt.arduino.ui.internal.remote;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map.Entry;

import org.eclipse.cdt.arduino.core.internal.HierarchicalProperties;
import org.eclipse.cdt.arduino.core.internal.board.ArduinoBoard;
import org.eclipse.cdt.arduino.core.internal.board.ArduinoManager;
import org.eclipse.cdt.arduino.core.internal.board.ArduinoPackage;
import org.eclipse.cdt.arduino.core.internal.board.ArduinoPlatform;
import org.eclipse.cdt.arduino.core.internal.remote.ArduinoRemoteConnection;
import org.eclipse.cdt.arduino.ui.internal.Activator;
import org.eclipse.cdt.arduino.ui.internal.Messages;
import org.eclipse.cdt.serial.SerialPort;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.remote.core.IRemoteConnectionWorkingCopy;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;

public class BoardPropertyControl extends Composite {

	private Combo portCombo;
	private String[] portNames;
	private String portName;

	private Combo boardCombo;
	private ArduinoBoard[] boards;
	private ArduinoBoard board;

	private List<SelectionListener> listeners = Collections.synchronizedList(new ArrayList<SelectionListener>());
	private List<Control> menuControls = new ArrayList<>();

	public BoardPropertyControl(Composite parent, int style) {
		super(parent, style);
		setLayout(new GridLayout(2, false));

		Label portLabel = new Label(this, SWT.NONE);
		portLabel.setText(Messages.NewArduinoTargetWizardPage_4);

		portCombo = new Combo(this, SWT.NONE);
		portCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
		try {
			portNames = SerialPort.list();
		} catch (IOException e) {
			portNames = new String[0];
			Activator.log(e);
		}
		for (String portName : portNames) {
			portCombo.add(portName);
		}
		if (portNames.length > 0) {
			portCombo.select(0);
			portName = portNames[0];
		} else {
			portName = ""; //$NON-NLS-1$
		}
		portCombo.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent e) {
				portName = portCombo.getText();
				fireSelection();
			}
		});

		Label boardLabel = new Label(this, SWT.NONE);
		boardLabel.setText(Messages.ArduinoTargetPropertyPage_2);

		boardCombo = new Combo(this, SWT.READ_ONLY);
		boardCombo.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
		try {
			List<ArduinoBoard> boardList = new ArrayList<>(
					Activator.getService(ArduinoManager.class).getInstalledBoards());
			Collections.sort(boardList, new Comparator<ArduinoBoard>() {
				@Override
				public int compare(ArduinoBoard o1, ArduinoBoard o2) {
					return o1.getName().compareTo(o2.getName());
				}
			});
			boards = boardList.toArray(new ArduinoBoard[boardList.size()]);

			for (ArduinoBoard board : boards) {
				boardCombo.add(board.getName());
			}

			boardCombo.addSelectionListener(new SelectionAdapter() {
				@Override
				public void widgetSelected(SelectionEvent e) {
					boardChanged();
					fireSelection();
				}
			});

			if (boards.length > 0) {
				// TODO use preference to remember the last selected board
				boardCombo.select(0);
				board = boards[0];
				updateBoardMenu();
			}
		} catch (CoreException e) {
			Activator.log(e);
		}
	}

	public String getPortName() {
		return portName;
	}

	public ArduinoBoard getSelectedBoard() {
		return board;
	}

	public void addSelectionListener(SelectionListener listener) {
		listeners.add(listener);
	}

	private void updateBoardMenu() {
		HierarchicalProperties menus = board.getMenus();
		if (menus != null) {
			for (Entry<String, HierarchicalProperties> menuEntry : menus.getChildren().entrySet()) {
				Label label = new Label(this, SWT.NONE);
				label.setText(board.getPlatform().getMenuText(menuEntry.getKey()) + ':');
				label.setData(menuEntry.getKey());
				menuControls.add(label);

				Combo combo = new Combo(this, SWT.READ_ONLY);
				combo.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
				menuControls.add(combo);

				List<String> ids = new ArrayList<>();
				for (Entry<String, HierarchicalProperties> valueEntry : menuEntry.getValue().getChildren().entrySet()) {
					String value = valueEntry.getValue().getValue();
					if (value != null) {
						combo.add(value);
						ids.add(valueEntry.getKey());
					}
				}
				combo.setData(ids);
				combo.select(0);
			}
		}
	}

	private void boardChanged() {
		int index = boardCombo.getSelectionIndex();
		ArduinoBoard newBoard = index < 0 ? null : boards[index];
		if (newBoard != board) {
			// Clear out old menus
			for (Control control : menuControls) {
				control.dispose();
			}
			menuControls.clear();

			board = newBoard;
			updateBoardMenu();

			layout();
			getShell().pack();
			redraw();
		}
	}

	private void fireSelection() {
		for (SelectionListener listener : listeners) {
			Event event = new Event();
			event.widget = this;
			listener.widgetSelected(new SelectionEvent(event));
		}
	}

	public void apply(IRemoteConnectionWorkingCopy workingCopy) {
		ArduinoRemoteConnection.setBoardId(workingCopy, board);
		ArduinoRemoteConnection.setPortName(workingCopy, portName);

		String key = null;
		for (Control control : menuControls) {
			if (control instanceof Label) {
				key = (String) control.getData();
			} else if (control instanceof Combo) {
				Combo combo = (Combo) control;
				@SuppressWarnings("unchecked")
				String value = ((List<String>) combo.getData()).get(combo.getSelectionIndex());

				if (key != null) {
					ArduinoRemoteConnection.setMenuValue(workingCopy, key, value);
				}
			}
		}
	}

}
