/**
 * 
 */
package view.tool.percentageField;

import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.math.BigDecimal;
import java.math.RoundingMode;

import javax.swing.JButton;
import javax.swing.JFrame;

import view.tool.inputField.JValidTextField;

/**
 * @author alexis
 *
 */
public class JPercentField extends JValidTextField implements FocusListener{

	/**
	 * 
	 */
	private static final long serialVersionUID = -8565637035721694023L;
	boolean isValid = false;
	
	public JPercentField(int characterLength) {
		super("",true,"[0-9.%]",characterLength);
		this.addFocusListener(this);
		this.setColumns(16);
	}
	
	public void setValue(BigDecimal percent){
		this.setText(percent.multiply(new BigDecimal(100)).setScale(1, RoundingMode.HALF_UP)+"%");
	}
	
	public boolean isValid(){
		return isValid;
	}
	
	private void validateContent(){
		String content = this.getFormatedText();//this.getText();
		
		if(content.length() == 0)
		{
			content = "0.0%";
		}
		
		if(!content.contains("%"))
		{
			content += "%";
		}
		else if(content.charAt(content.length()-1) != '%')
		{
			this.setBackground(Color.red);
			isValid = false;
			return;
		}
		if(content.length() - content.replace("%", "").length() > 1)
		{
			this.setBackground(Color.red);
			isValid = false;
			return;
		}
		if(content.length() - content.replace(".", "").length() > 1)
		{
			this.setBackground(Color.red);
			isValid = false;
			return;
		}
		if(content.indexOf("%") < content.indexOf("."))
		{
			this.setBackground(Color.red);
			isValid = false;
			return;
		}
		
		if(content.contains("."))
		{
			if(content.charAt(0) == '.')
			{
				content = "0"+content;
			}
			else if(content.charAt(content.length()-2) == '.')
			{
				content = content.substring(0,content.length()-1)+"0%";
			}
			else if(content.charAt(content.length()-3) == '.')
			{
				super.setText(content);
				this.setBackground(Color.WHITE);
				isValid = true;
				return;
			}
			else
			{
				this.setBackground(Color.red);
				isValid = false;
				return;
			}
		}
		else
		{
			content = content.substring(0,content.length()-1) + ".0%";
		}
		
		while(content.charAt(0) == '0' && (content.charAt(1) == '0' || content.charAt(1) != '.'))
		{
			content = content.substring(1);
		}
		
		this.setText(content);
		//validateContent();
	}

	@Override
	public void setText(String text){
		if(!"".equals(text) && !text.contains("%"))
		{
			BigDecimal temp = new BigDecimal(text);
			temp = temp.multiply(new BigDecimal("100"));
			text = temp.toPlainString()+"%";
			text = text.replace("00%", "%");
		}
		super.setText(text);
		validateContent();
	}
	
	@Override
	public String getText(){
		String text = super.getText();
		
		if(text.contains("%"))
		{
			text = text.substring(0, text.length()-1);
			BigDecimal temp = new BigDecimal(text);
			temp = temp.divide(new BigDecimal("100"));
			return temp.toPlainString();
		}
		return super.getText();//text;
	}
	
	public String getFormatedText(){
		return super.getText();
	}
	
	@Override
	public void focusGained(FocusEvent arg0) {}

	@Override
	public void focusLost(FocusEvent arg0) {
		validateContent();
	}
	
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		JFrame a = new JFrame();
		a.setLayout(new FlowLayout());
		a.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		a.setSize(300,300);
		JPercentField fer = new JPercentField(32);
		fer.setValue(new BigDecimal(0.075));
		a.add(fer);
		a.add(new JButton("Click here for focus lost"));
		
		a.setVisible(true);
	}
}
