package br.com.microsoft.ocp.bot.service.jmeter.sampler.gui;

import java.awt.BorderLayout;
import java.text.DecimalFormat;
import java.text.NumberFormat;

import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.text.NumberFormatter;

import org.apache.jmeter.samplers.gui.AbstractSamplerGui;
import org.apache.jmeter.testelement.TestElement;

import br.com.microsoft.ocp.bot.service.jmeter.sampler.EventSampler;

public class EventSamplerGui extends AbstractSamplerGui {
	public static final long serialVersionUID = 240L;
	
	private static final int MAX_RESPONSES_ALLOWED = 99;
	
	private static final String NUMBER_OF_RESPONSES_EXPECTED_LABEL = "# of Responses Expected:";
	private static final String EVENT_NAME_LABEL = "Event name:";
	private static final String CHANNELDATA_LABEL = "Channeldata (JSON string):";
	
	private javax.swing.JLabel numOfResponsesExpectedLabel = new JLabel();
	private javax.swing.JLabel eventNameLabel = new JLabel();
	private javax.swing.JLabel channeldataLabel = new JLabel();
	private javax.swing.JScrollPane channeldataAreaScrollPane = new javax.swing.JScrollPane();
	
	private javax.swing.JTextArea channeldataTextArea = new JTextArea();
	private javax.swing.JTextField eventNameTextField = new JTextField();
	private javax.swing.JTextField numOfResponsesExpectedTextField = new JTextField();
	
	public EventSamplerGui() {
		init();
	}
	
	@Override
	public String getStaticLabel() {
		return "Bot Service: Event";
	}

	@Override
	public String getLabelResource() {
		return null;
	}
	
	@Override
	public void configure(TestElement element) {
		super.configure(element);
		numOfResponsesExpectedTextField.setText(String.valueOf(element.getPropertyAsInt(EventSampler.NUM_OF_EXPECTED_RESPONSES)));
		channeldataTextArea.setText(element.getPropertyAsString(EventSampler.CHANNELDATA));
		eventNameTextField.setText(element.getPropertyAsString(EventSampler.EVENT_NAME));
	}

	@Override
	public TestElement createTestElement() {
		EventSampler sampler = new EventSampler();
		modifyTestElement(sampler);
		return sampler;
	}

	@Override
	public void modifyTestElement(TestElement te) {
		te.clear();
		configureTestElement(te);
		
		te.setProperty(EventSampler.NUM_OF_EXPECTED_RESPONSES,
				Integer.parseInt(numOfResponsesExpectedTextField.getText()));
		te.setProperty(EventSampler.CHANNELDATA, channeldataTextArea.getText());
		te.setProperty(EventSampler.EVENT_NAME, eventNameTextField.getText());		
	}
	
	/*
	 * Helper method to set up the GUI screen
	 */
	private void init() {
		// Standard setup
		setLayout(new BorderLayout(0, 5));
		setBorder(makeBorder());
		add(makeTitlePanel(), BorderLayout.NORTH); // Add the standard title

		JPanel mainPanel = new JPanel();
		add(mainPanel, BorderLayout.CENTER);

		numOfResponsesExpectedLabel = new javax.swing.JLabel(NUMBER_OF_RESPONSES_EXPECTED_LABEL);
		
		channeldataTextArea.setColumns(20);
		channeldataTextArea.setRows(5);
		channeldataAreaScrollPane.setViewportView(channeldataTextArea);
		
		NumberFormat format = new DecimalFormat("#0");
		NumberFormatter formatter = new NumberFormatter(format);
		formatter.setValueClass(Integer.class);
		formatter.setMinimum(0);
		formatter.setMaximum(MAX_RESPONSES_ALLOWED);
		formatter.setAllowsInvalid(false);
		formatter.setCommitsOnValidEdit(true);

		numOfResponsesExpectedTextField = new javax.swing.JFormattedTextField(formatter);
		numOfResponsesExpectedLabel.setText(NUMBER_OF_RESPONSES_EXPECTED_LABEL);
		channeldataLabel.setText(CHANNELDATA_LABEL);
		eventNameLabel.setText(EVENT_NAME_LABEL);
		
		javax.swing.GroupLayout layout = new javax.swing.GroupLayout(mainPanel);
		mainPanel.setLayout(layout);

		layout.setHorizontalGroup(
				layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(layout
						.createSequentialGroup().addGroup(layout
								.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(layout
										.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
										.addComponent(channeldataLabel, javax.swing.GroupLayout.Alignment.LEADING,
												javax.swing.GroupLayout.DEFAULT_SIZE,
												javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
										.addComponent(eventNameLabel, javax.swing.GroupLayout.Alignment.LEADING,
												javax.swing.GroupLayout.DEFAULT_SIZE,
												javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
								.addComponent(numOfResponsesExpectedLabel))
						.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
						.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
								.addComponent(eventNameTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 244,
										javax.swing.GroupLayout.PREFERRED_SIZE)
								.addComponent(numOfResponsesExpectedTextField, javax.swing.GroupLayout.PREFERRED_SIZE,
										244, javax.swing.GroupLayout.PREFERRED_SIZE)
								.addComponent(channeldataAreaScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 585,
										javax.swing.GroupLayout.PREFERRED_SIZE))
						.addGap(0, 469, Short.MAX_VALUE)));
		layout.setVerticalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(layout
				.createSequentialGroup().addContainerGap()
				.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
						.addComponent(channeldataAreaScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE,
								javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
						.addGroup(layout.createSequentialGroup().addGap(30, 30, 30).addComponent(channeldataLabel)))
				.addGap(10, 10, 10)
				.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
						.addComponent(eventNameLabel).addComponent(eventNameTextField, javax.swing.GroupLayout.PREFERRED_SIZE,
								javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
				.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
				.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
						.addComponent(numOfResponsesExpectedLabel).addComponent(numOfResponsesExpectedTextField,
								javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE,
								javax.swing.GroupLayout.PREFERRED_SIZE))
				.addContainerGap(540, Short.MAX_VALUE)));
	}
	
	@Override
	public void clearGui() {
		super.clearGui();

		numOfResponsesExpectedTextField.setText(String.valueOf(EventSampler.NUM_OF_EXPECTED_RESPONSES_DEFAULT_VALUE));
		channeldataTextArea.setText(EventSampler.CHANNELDATA_DEFAULT_VALUE);
		eventNameTextField.setText(EventSampler.EVENT_NAME_DEFAULT_VALUE);
	}

}