package gui;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.SystemColor;

import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import javax.swing.event.DocumentListener;

import model.JWTTabModel;

import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
import org.fife.ui.rsyntaxtextarea.Style;
import org.fife.ui.rsyntaxtextarea.SyntaxConstants;
import org.fife.ui.rsyntaxtextarea.SyntaxScheme;
import org.fife.ui.rsyntaxtextarea.Token;
import org.fife.ui.rtextarea.RTextScrollPane;

import app.algorithm.AlgorithmType;

public class JWTViewTab extends JPanel{

	private static final long serialVersionUID = 1L;
	private RSyntaxTextArea  outputField;
	private JTextArea jwtKeyArea;
	private JLabel outputLabel;
	private JLabel keyLabel;
	private JButton verificationIndicator;
	private JWTTabModel jwtTM;
	private JLabel lblCookieFlags;
	private JLabel lbRegisteredClaims;

	public JWTViewTab(JWTTabModel jwtTM) {
		drawPanel();
		this.jwtTM = jwtTM;
	}

	public void registerDocumentListener(DocumentListener inputFieldListener) {
		jwtKeyArea.getDocument().addDocumentListener(inputFieldListener);
	}

	
	private void drawPanel() {
		GridBagLayout gridBagLayout = new GridBagLayout();
		gridBagLayout.columnWidths = new int[] { 10, 447, 0, 0 };
		gridBagLayout.rowHeights = new int[] { 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
		gridBagLayout.columnWeights = new double[] { 0.0, 1.0, 0.0, Double.MIN_VALUE };
		gridBagLayout.rowWeights = new double[] { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, Double.MIN_VALUE };
		setLayout(gridBagLayout);
		
		keyLabel = new JLabel(" ");
		keyLabel.setFont(new Font("Tahoma", Font.BOLD, 12));
		GridBagConstraints gbc_inputLabel1 = new GridBagConstraints();
		gbc_inputLabel1.fill = GridBagConstraints.VERTICAL;
		gbc_inputLabel1.insets = new Insets(0, 0, 5, 5);
		gbc_inputLabel1.anchor = GridBagConstraints.WEST;
		gbc_inputLabel1.gridx = 1;
		gbc_inputLabel1.gridy = 1;
		add(keyLabel, gbc_inputLabel1);

		jwtKeyArea = new JTextArea();
		GridBagConstraints gbc_inputField1 = new GridBagConstraints();
		gbc_inputField1.insets = new Insets(0, 0, 5, 5);
		gbc_inputField1.fill = GridBagConstraints.HORIZONTAL;
		gbc_inputField1.gridx = 1;
		gbc_inputField1.gridy = 2;
		add(jwtKeyArea, gbc_inputField1);
		jwtKeyArea.setColumns(10);
		
		verificationIndicator = new JButton("");
		Dimension preferredSize = new Dimension(400, 30);
		verificationIndicator.setPreferredSize(preferredSize);
		GridBagConstraints gbc_validIndicator = new GridBagConstraints();
		gbc_validIndicator.insets = new Insets(0, 0, 5, 5);
		gbc_validIndicator.gridx = 1;
		gbc_validIndicator.gridy = 4;
		add(verificationIndicator, gbc_validIndicator);

		outputField = new RSyntaxTextArea();
		SyntaxScheme scheme = outputField.getSyntaxScheme();
		Style style = new Style();
		style.foreground = new Color(222,133,10);
		scheme.setStyle(Token.LITERAL_STRING_DOUBLE_QUOTE, style);
		outputField.revalidate();
		outputField.setHighlightCurrentLine(false);
		outputField.setCurrentLineHighlightColor(Color.WHITE);
		outputField.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_JAVASCRIPT);
		outputField.setEditable(false);
		outputField.setPopupMenu(new JPopupMenu()); // no context menu on right-click
		
		outputLabel = new JLabel("JWT");
		outputLabel.setFont(new Font("Tahoma", Font.BOLD, 12));
		GridBagConstraints gbc_outputLabel = new GridBagConstraints();
		gbc_outputLabel.anchor = GridBagConstraints.WEST;
		gbc_outputLabel.insets = new Insets(0, 0, 5, 5);
		gbc_outputLabel.gridx = 1;
		gbc_outputLabel.gridy = 5;
		add(outputLabel, gbc_outputLabel);
		
		lbRegisteredClaims = new JLabel();
		lbRegisteredClaims.setBackground(SystemColor.controlHighlight);
		GridBagConstraints gbc_lbRegisteredClaims = new GridBagConstraints();
		gbc_lbRegisteredClaims.fill = GridBagConstraints.BOTH;
		gbc_lbRegisteredClaims.insets = new Insets(0, 0, 5, 5);
		gbc_lbRegisteredClaims.gridx = 1;
		gbc_lbRegisteredClaims.gridy = 8;
		add(lbRegisteredClaims, gbc_lbRegisteredClaims);
		
		lblCookieFlags = new JLabel(" ");
		lblCookieFlags.setFont(new Font("Tahoma", Font.BOLD, 12));
		GridBagConstraints gbc_lblCookieFlags = new GridBagConstraints();
		gbc_lblCookieFlags.anchor = GridBagConstraints.SOUTHWEST;
		gbc_lblCookieFlags.insets = new Insets(0, 0, 5, 5);
		gbc_lblCookieFlags.gridx = 1;
		gbc_lblCookieFlags.gridy = 9;
		add(lblCookieFlags, gbc_lblCookieFlags);
		
		RTextScrollPane sp = new RTextScrollPane(outputField);
		sp.setLineNumbersEnabled(false);
		
		GridBagConstraints gbc_outputfield = new GridBagConstraints();
		gbc_outputfield.insets = new Insets(0, 0, 5, 5);
		gbc_outputfield.fill = GridBagConstraints.BOTH;
		gbc_outputfield.gridx = 1;
		gbc_outputfield.gridy = 6;
		add(sp, gbc_outputfield);
	}
	

	public JTextArea getOutputfield() {
		return outputField;
	}
		
	public String getKeyValue() {
		return jwtKeyArea.getText();
	}

	public void setKeyValue(String value) {
		jwtKeyArea.setText(value);		
	}

	public void setVerificationResult(String value) {
		verificationIndicator.setText(value);
	}

	public void setVerificationResultColor(Color verificationResultColor) {
		verificationIndicator.setBackground(verificationResultColor);
	}

	public void setCaret() {
		outputField.setCaretPosition(0);
	}

	public String getSelectedData() {
		return getOutputfield().getSelectedText();
	}

	
	public void updateSetView(final String algorithmType) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				if(!jwtTM.getJWTJSON().equals(outputField.getText())){
					outputField.setText(jwtTM.getJWTJSON());
				}
				if(!jwtTM.getKeyLabel().equals(keyLabel.getText())){
					keyLabel.setText(jwtTM.getKeyLabel());
				}
				if(!jwtTM.getKey().equals(jwtKeyArea.getText())){
					jwtKeyArea.setText(jwtTM.getKey());
				}
				if(!jwtTM.getVerificationColor().equals(verificationIndicator.getBackground())){
					verificationIndicator.setBackground(jwtTM.getVerificationColor());
				}
				if(!jwtTM.getVerificationLabel().equals(verificationIndicator.getText())){
					verificationIndicator.setText(jwtTM.getVerificationLabel());
				}
				if(algorithmType.equals(AlgorithmType.symmetric)){
					keyLabel.setText("Secret");
					jwtKeyArea.setEnabled(true);
				}
				if(algorithmType.equals(AlgorithmType.asymmetric)){
					keyLabel.setText("Public Key");
					jwtKeyArea.setEnabled(true);
				}
				if(algorithmType.equals(AlgorithmType.none)){
					keyLabel.setText("");
					jwtKeyArea.setEnabled(false);
					jwtKeyArea.setEnabled(false);
				}
				
				if(jwtTM.getcFW().isCookie()){
					lblCookieFlags.setText(jwtTM.getcFW().toHTMLString());
				}else{
					lblCookieFlags.setText("");
				}
				setCaret();
				lbRegisteredClaims.setText(jwtTM.getTimeClaimsAsText());
			}
		});
	}

}