package de.hhu.ba.yoshikoWrapper.gui;

import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.border.Border;
import javax.swing.border.EtchedBorder;

import de.hhu.ba.yoshikoWrapper.core.LocalizationManager;

@SuppressWarnings("serial")
public class ReductionRulesChooser extends ComfortPanel{

	private final JCheckBox useCRule;
	private final JCheckBox useCCRule;
	private final JCheckBox useACRule;
	private final JCheckBox useHERule;
	private final JCheckBox usePDRRule;
	private final JCheckBox useSNRule;
	
	private final DoubleInputField multFactor;
	
	private final ComfortPanel SNPanel;

	
	public ReductionRulesChooser() {
		this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
		//Initialize subcomponents
		useCRule = new JCheckBox("Use Clique Rule");
		useCCRule = new JCheckBox("Use Critical-Clique Rule");
		useACRule = new JCheckBox("Use Almost-Clique Rule");
		useHERule = new JCheckBox("Use Heavy-Edge 3 in 1 Rule");
		usePDRRule = new JCheckBox("Use Parameter Dependent Reduction Rule");
		useSNRule = new JCheckBox("Use Similar Neighborhood Rule");
		multFactor = new DoubleInputField(1, Double.POSITIVE_INFINITY);
		multFactor.setText("1.0");
		SNPanel = new ComfortPanel();
		
		SNPanel.addAll(new JLabel(LocalizationManager.get("multFactor")),multFactor);
		useSNRule.setSelected(true);

		useSNRule.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				if (useSNRule.isSelected()) {
					multFactor.setEnabled(true);
				}
				else {
					multFactor.setEnabled(false);
				}
			}
		});
		
		
		this.addAll(
				useCRule,
				useCCRule,
				useACRule,
				useHERule,
				usePDRRule,
				useSNRule,
				SNPanel
				);
		//By default all reduction rules should be applied
		for (Component c :this.getComponents()) {
			if (c instanceof JCheckBox) {
				((JCheckBox)c).setSelected(true);
			}
		}
		
		//Create titled border
		Border border = BorderFactory.createEtchedBorder(EtchedBorder.LOWERED);
		this.setBorder(BorderFactory.createTitledBorder(border, LocalizationManager.get("redRuleChooserTitle")));
	}
	
	
	/** Creates a 6 Bit bitmask representing the currently selected choice of reduction rules.
	 * @return
	 */
	public String getBitMask() {
		String ret = "";
		ret += (useCRule.isSelected() ? "1" : "0");
		ret += (useCCRule.isSelected() ? "1" : "0");
		ret += (useACRule.isSelected() ? "1" : "0");
		ret += (useHERule.isSelected() ? "1" : "0");
		ret += (usePDRRule.isSelected() ? "1" : "0");
		ret += (useSNRule.isSelected() ? "1" : "0");
		return ret;
	}
	
	public double getMultFactor() {
		if (useSNRule.isSelected()) {
			return multFactor.getValueAsDouble();
		}
		return 1.0d;
	}
}