/**
 * 
 */
package view.tool.moneyField;

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

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

import view.tool.inputField.JValidTextField;

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

	/**
	 * 
	 */
	private static final long serialVersionUID = -8565637035721694023L;
	public static final String ZERO_DOLLAR = "0.00$";
	private boolean isValid = true;
	
	public JMoneyField(int characterLength) {
		super(ZERO_DOLLAR,true,"[0-9.$\\-]",characterLength);
		this.addFocusListener(this);
	}
	
	public boolean isValid(){
		return isValid;
	}
	
	/**
	 * validates the content of the field
	 */
	private void validateContent(){
		String content = this.getText();
		
		if(content.length() == 0)
		{
			content = "0.00$";
		}
		
		if(!content.contains("$"))
		{
			content += "$";
		}
		else if(content.contains("-") && content.indexOf("-") != 0)
		{
			this.setBackground(Color.red);
			isValid = false;
			return;
		}
		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;
			}
			if(content.charAt(0) == '-' && content.charAt(1) == '.')
			{
				content = "-0"+content.substring(1);
			}
			if(content.charAt(content.length()-2) == '.')
			{
				content = content.substring(0,content.length()-1)+"00$";
			}
			else if(content.charAt(content.length()-3) == '.')
			{
				content = content.substring(0,content.length()-1)+"0$";
			}
			else if(content.charAt(content.length()-4) == '.')
			{
				content = truncateUselessZero(content);
				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) + ".00$";
		}

		content = truncateUselessZero(content);
		/*while(content.charAt(0+(content.charAt(0) == '-'?1:0)) == '0' && (content.charAt(1+(content.charAt(0) == '-'?1:0)) == '0' || content.charAt(1) != '.'))
		{
			content = content.substring(1);
		}*/
		
		/*super.setText(content);
		validateContent();*/
		this.setText(content);
	}
	
	private String truncateUselessZero(String content){
		int start = (content.contains("-")?1:0);
		while(content.charAt(start) == '0' && content.charAt(start+1) == '0')
		{
			content = content.substring(start+1);
			start = (content.contains("-")?1:0);
		}
		
		return content;
	}
	
	/**
	 * set the text of the field from a bigdecimal and format it to money
	 * @param value 
	 */
	public void setValue(BigDecimal value){
		this.setText(value.setScale(2,BigDecimal.ROUND_UP).toString());
	}
	
	@Override
	public void setText(String money){
		super.setText(money);
		validateContent();
	}

	@Override
	public void focusGained(FocusEvent arg0) {
		validateContent();
	}

	@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);
		a.add(new JMoneyField(8));
		a.add(new JButton("Click here for focus lost"));
		a.setVisible(true);
	}
}
