package locadora.ui;


import javax.swing.JFormattedTextField;
import java.io.*;
import javax.swing.text.*;
import java.text.*;
import javax.swing.*;
import java.util.*;
import java.awt.*;

public class JNumeroField extends JFormattedTextField implements Serializable {
    public static final int AGRUPA_TRES=3;
    public static final int AGRUPA_DOIS=2;
    public static final int AGRUPA_TODOS=7;
    
    // private char simbDecimal;
    private int numCasas;
    //private char simbAgrupamento;
    private int tipoAgrupamento;
    //private char simbNegativo;
    private NumberFormatter formatador;
    private DecimalFormat formato;
    private DecimalFormatSymbols simbolos;
    private boolean valida;
    private boolean tipoMonetario;
    private JLabel lab;
    // private String cifrao;
    
    public JNumeroField() {
        super();
        
        //simbolos=new DecimalFormatSymbols(new Locale("pt","BR"));
        // simbolos=new DecimalFormatSymbols(this.getLocale());
        //simbDecimal=',';
        //simbAgrupamento='.';
        //simbNegativo='-';
        tipoAgrupamento=3;
        numCasas=3;
        
        tipoMonetario=false;
        
        
        
        
        try {
            formatador =  new NumberFormatter(NumberFormat.getIntegerInstance());
            formato= new DecimalFormat();
            formatador.setFormat(formato);
            // formato= formatador.getFormat();
            //formatador=new NumberFormatter();
            simbolos=formato.getDecimalFormatSymbols();
            lab = new JLabel(simbolos.getCurrencySymbol());
            
            formatador.setAllowsInvalid(false);
            formatador.setCommitsOnValidEdit(true);
            formatador.setOverwriteMode(false);
            
            this.aplicarPadrao();
            this.setFocusLostBehavior(JFormattedTextField.COMMIT);
            this.setPreferredSize(new java.awt.Dimension(55, 20));
            this.setValor("0");
        }
        catch (Exception e){e.printStackTrace();}
    }
    
    public void commitEdit() {
        try {
            super.commitEdit();
            String text = this.getText();
            this.setText(text);
        }
        catch(Exception e)
        {
            e.printStackTrace();
            this.setText("0");
        }
        
    }
    
    
    public void aplicarPadrao() {
        formato.setMinimumIntegerDigits(1);
        formato.setMinimumFractionDigits(1);
        formato.setGroupingSize(tipoAgrupamento);
        formato.setMaximumFractionDigits(numCasas);
        //simbolos.setDecimalSeparator(//simbDecimal);
        //simbolos.setGroupingSeparator(simbAgrupamento);
        //simbolos.setMinusSign(simbNegativo);
        
        if (isMonetario())
        { //formato.setNegativePrefix("(");
          //formato.setNegativeSuffix(")");
          formato.setParseIntegerOnly(false);
          formato.setDecimalSeparatorAlwaysShown(true);
          // simbolos.setCurrencySymbol(cifrao);
        }
        else {
            //formato.setNegativePrefix(String.valueOf(simbolos.getMinusSign()));
           // formato.setNegativeSuffix("");
            formato.setParseIntegerOnly(true);
            formato.setDecimalSeparatorAlwaysShown(false);
            
        }
        
        //formato.setDecimalFormatSymbols(simbolos);
        //System.out.println("formato no set padrao "+formato.toPattern());
        
        repaint();
    }
    
    private void writeObject(ObjectOutputStream oos) throws IOException {
        oos.defaultWriteObject();
    }
    private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException {
        ois.defaultReadObject();
    }
    
    public int getNumCasas() {
        return numCasas;
    }
  /*public char getSimbAgrupamento() {
    return simbAgrupamento;
  }
  public char getSimbDecimal() {
    return simbDecimal;
  }
  public char getSimbNegativo() {
    return simbNegativo;
  }*/
    public int getTipoAgrupamento() {
        return tipoAgrupamento;
    }
    public void setNumCasas(int numCasas) {
        this.numCasas = numCasas;
        aplicarPadrao();
    }
  /*public void setSimbAgrupamento(char simAgrupamento) {
    this.simbAgrupamento = simAgrupamento;
    aplicarPadrao();
  }
  public void setSimbDecimal(char simbDecimal) {
    this.simbDecimal = simbDecimal;
    aplicarPadrao();
  }
  public void setSimbNegativo(char simbNegativo) {
    this.simbNegativo = simbNegativo;
    aplicarPadrao();
  }*/
    public void setTipoAgrupamento(int tipoAgrupamento) {
        this.tipoAgrupamento = tipoAgrupamento;
        aplicarPadrao();
        
    }
    public boolean getTipoMonetario() {
        return tipoMonetario;
    }
    
    public boolean isMonetario() {
        return tipoMonetario;
        
    }
    
    public void setTipoMonetario(boolean tipoCampo) {
        this.tipoMonetario = tipoCampo;
        
        aplicarPadrao();
        repaint();
        //  System.out.println("padrao "+this.formato.toPattern());
    }
    
    
  /*public void setCifrao(String pCifrao) {
    this.cifrao = pCifrao;
    aplicarPadrao();
   
   
  }*/
    
  /*public String getCifrao() {
    return cifrao;
  }*/
    
    public void setValor(String text) throws Exception {
       //System.out.println("setando: "+text+" - "+formato.format(90.0));
        try
        { /*if (isMonetario())
          { if (text.charAt(0)=='-')
            { char auxStr[];
              auxStr=text.toCharArray();
              auxStr[0]='(';
              text=String.valueOf(auxStr);
              text=text+")";
            }
          }*/
          
          String auxStr = text.replace(",0","");
          System.out.println("a :"+text);
          try
          {
            Integer.parseInt(auxStr);    
          }
          catch(Exception e)
          {
              text="0,0";
          }
          
          System.out.println("d :"+text);
            
          Object aux=formatador.stringToValue(text);
          text = formatador.valueToString(aux);

          if(!isMonetario())
          {
              text = text.replace(",0","");
          }
          super.setText(text);
          this.setForeground(Color.BLACK);
          if (formato.parse(text).doubleValue()<0)
              //              this.setForeground(Color.RED);
              throw new Exception("Número Inválido: "+text);
        }
        catch(Exception e)
        { e.printStackTrace();
          //this.setForeground(Color.BLACK);
          super.setText("0");
          throw new Exception("Número Inválido: "+text);
        }
        
    }
    
    public void setValor(int num) throws Exception
    { String text=String.valueOf(num);
      setValor(text);
    }
    
    public void setValor(double num) throws Exception
    { String text=formato.format(num);
      
      setValor(text);
    }
    
    public void paint(Graphics g)
    { super.paint(g);
      if(isMonetario())
      { Container aux=this.getParent();
        lab.setSize(this.getHeight(),lab.getWidth());
        aux.add(lab);
        lab.setLocation(this.getX()-lab.getWidth(),this.getY());
        lab.setText(simbolos.getCurrencySymbol());
      }
      else
      { Container aux=this.getParent();
        lab.setSize(this.getHeight(),0);
        aux.add(lab);
        lab.setLocation(this.getX()-lab.getWidth(),this.getY());
      }
      
    }
    
    public void setText(String str)
    { try{
          this.setValor(str);
      }
      catch(Exception e) {
          e.printStackTrace();
      }
    }
    
    
    public double getValor()
    { String text=this.getText();
      try{
          return formato.parse(text).doubleValue();
      }
      catch(Exception e) {
          return 0.0;
      }
      
    }
    
    
}




