package tim.prune.load.babel;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.GridLayout;

import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
import javax.swing.border.EtchedBorder;

import tim.prune.I18nManager;
import tim.prune.gui.WholeNumberField;

/**
 * Discard filter for GPSBabel
 */
public final class DiscardFilter extends FilterDefinition
{
	/** Constructor */
	public DiscardFilter(AddFilterDialog inFilterDialog)
	{
		super(inFilterDialog);
		makePanelContents();
	}

	private WholeNumberField _hdopField = null;
	private WholeNumberField _vdopField = null;
	private JComboBox<String> _combineDopsCombo = null;
	private WholeNumberField _numSatsField = null;
	private JCheckBox _noFixCheckbox = null;
	private JCheckBox _unknownFixCheckbox = null;


	/** @return filter name */
	protected String getFilterName() {
		return "discard";
	}

	/** Make the panel contents */
	protected void makePanelContents()
	{
		setLayout(new BorderLayout());
		JPanel boxPanel = new JPanel();
		boxPanel.setLayout(new BoxLayout(boxPanel, BoxLayout.Y_AXIS));
		JLabel topLabel = new JLabel(I18nManager.getText("dialog.gpsbabel.filter.discard.intro"));
		topLabel.setAlignmentX(Component.LEFT_ALIGNMENT);
		boxPanel.add(topLabel);
		boxPanel.add(Box.createVerticalStrut(9)); // spacer

		JPanel boxPanel2 = new JPanel();
		boxPanel2.setLayout(new BoxLayout(boxPanel2, BoxLayout.Y_AXIS));
		// Panel for dops
		JPanel dopPanel = new JPanel();
		dopPanel.setBorder(BorderFactory.createCompoundBorder(
			BorderFactory.createEtchedBorder(EtchedBorder.LOWERED), BorderFactory.createEmptyBorder(4, 4, 4, 4))
		);
		dopPanel.setLayout(new GridLayout(0, 3, 4, 2));
		dopPanel.add(new JLabel(I18nManager.getText("dialog.gpsbabel.filter.discard.hdop"), SwingConstants.RIGHT));
		_hdopField = new WholeNumberField(2);
		_hdopField.addKeyListener(_paramChangeListener);
		dopPanel.add(_hdopField);
		_combineDopsCombo = new JComboBox<String>(new String[] {I18nManager.getText("logic.and"), I18nManager.getText("logic.or")});
		dopPanel.add(_combineDopsCombo);
		dopPanel.add(new JLabel(I18nManager.getText("dialog.gpsbabel.filter.discard.vdop"), SwingConstants.RIGHT));
		_vdopField = new WholeNumberField(2);
		_vdopField.addKeyListener(_paramChangeListener);
		dopPanel.add(_vdopField);
		boxPanel2.add(dopPanel);

		// Number of satellites
		JPanel satPanel = new JPanel();
		satPanel.add(new JLabel(I18nManager.getText("dialog.gpsbabel.filter.discard.numsats")));
		_numSatsField = new WholeNumberField(2);
		_numSatsField.addKeyListener(_paramChangeListener);
		satPanel.add(_numSatsField);
		boxPanel2.add(satPanel);

		// Checkboxes for no fix and unknown fix
		_noFixCheckbox = new JCheckBox(I18nManager.getText("dialog.gpsbabel.filter.discard.nofix"));
		boxPanel2.add(_noFixCheckbox);
		_unknownFixCheckbox = new JCheckBox(I18nManager.getText("dialog.gpsbabel.filter.discard.unknownfix"));
		boxPanel2.add(_unknownFixCheckbox);
		boxPanel2.add(Box.createVerticalStrut(9)); // spacer

		boxPanel2.setAlignmentX(Component.LEFT_ALIGNMENT);
		boxPanel.add(boxPanel2);
		add(boxPanel, BorderLayout.NORTH);
}

	/**
	 * @return true if the filters are valid
	 */
	public boolean isFilterValid()
	{
		// If values are entered, insist that they're positive (0 not valid)
		if (_hdopField.getText() != null && _hdopField.getText().length() > 0 && _hdopField.getValue() <= 0) {return false;}
		if (_vdopField.getText() != null && _vdopField.getText().length() > 0 && _vdopField.getValue() <= 0) {return false;}
		if (_numSatsField.getText() != null && _numSatsField.getText().length() > 0 && _numSatsField.getValue() <= 0) {return false;}
		// Insist that at least one value has been entered
		return _hdopField.getValue() > 0 || _vdopField.getValue() > 0 || _numSatsField.getValue() > 0;
	}

	/**
	 * @return filter parameters as a string, or null
	 */
	protected String getParameters()
	{
		if (!isFilterValid()) return null;
		StringBuilder builder = new StringBuilder();
		// hdop and vdop
		final int hdop = _hdopField.getValue();
		if (hdop > 0) {
			builder.append(",hdop=").append(hdop);
		}
		final int vdop = _vdopField.getValue();
		if (vdop > 0)
		{
			builder.append(",vdop=").append(vdop);
			if (hdop > 0 && _combineDopsCombo.getSelectedIndex() == 0) {
				builder.append(",hdopandvdop");
			}
		}
		// number of satellites
		final int numSats = _numSatsField.getValue();
		if (numSats > 0)
		{
			builder.append(",sat=").append(numSats);
		}
		// checkboxes
		if (_noFixCheckbox.isSelected()) {
			builder.append(",fixnone");
		}
		if (_unknownFixCheckbox.isSelected()) {
			builder.append(",fixunknown");
		}
		return builder.toString();
	}
}
