/*
 * Parameter.java
 *
 */

package com.uvigo.tMaestro.SCOCreator.tool.adaptation;

import com.uvigo.tMaestro.SCOCreator.tool.MainFrame;
import java.math.BigDecimal;


/**
 * Esta clase contiene toda la informacion referente a un parametro
 * @author raul
 */
public class Parameter implements java.awt.event.ActionListener {
    
    /*
     * Estas constantes se utilizan para identificar el tipo del parametro
     */
    final public static int INTEGER=0;
    final public static int REAL=1;
    final public static int BOOLEAN=2;
    final public static int TEXT=3;
    final public static int ENUMERATION=4;
    final public static int COMPLEX=5;
    final public static int LANCODE=6;
    final public static int COLLECTION=7;
    
    /**
     * El nombre del parametro
     */
    private String sName;
    
    /**
     * El Tipo del parametro. Ver las variables estaticas definidas al principio
     * de esta clase
     */
    private int iType;
    
    
    /**
     * Valor minimos permitido para el parametro si es de tipo numerico
     */
    private BigDecimal oMin;
    
    
    /**
     * Valor maximo permitido para el parametro si es de tipo numerico
     */
    private BigDecimal oMax;
    
    /**
     * Lista de valores validos del parametro si es de tipo enumerado
     * Si el parametro es de tipo COMPLEX es la lista de sus parametros componentes
     */
    private java.util.List oList;
    
    
    /**
     * Inicializa la clase
     * @param sName El nombre del parametro
     * @param iType El tipo del parametro
     * @param fMin Valor minimo si el parametro es numerico. Si no es numerico debe valer null.
     * @param fMax Valor maximo si el parametro es numerico. Si no es numerico debe valer null.
     * @param oList La lista de valores (si es enumerado) o de parametros componentes( si es COMPLEX o COLLECTION)
     * @throws Exception Si el nombre del parametro es null o vacio
     */
    private void init(String sName,int iType,BigDecimal oMin,BigDecimal oMax,java.util.List oList) throws Exception {
        if (sName==null || sName.equals("")) throw new Exception("Parameter must be named");
        this.sName = new String(sName);
        this.iType = iType;
        this.oMax= oMax;
        this.oMin = oMin;
        this.oList = oList;
        
    }
    
    /**
     * Constructor para los parametros num�ricos.
     * @param sName El nombre del parametro
     * @param iType El tipo del parametro (INTEGER o REAL)
     * @param fMin Valor minimo
     * @param fMax Valor maximo
     * @throws Exception Si el tipo es incorrecto o el nombre es null, etc
     */
    public Parameter(String sName,int iType, BigDecimal oMin,BigDecimal oMax) throws Exception {
        if (iType!=INTEGER && iType!=REAL) throw new Exception("This contructor is not suitable for this Parameter");
        init(sName,iType,oMin,oMax,null);
    }
    
    /**
     * Contructor para los tipos enumerados
     * @param sName el nombre
     * @param Los posibles valores
     * @throws Exception Si el tipo es incorrecto o oList es null
     */
    public Parameter(String sName,int iType,java.util.List oList) throws Exception {
        if (iType!=ENUMERATION && iType!=COMPLEX && iType!=COLLECTION) throw new Exception("This contructor is not suitable for this Parameter");
        if ((oList==null) || (oList.size()==0)) throw new Exception("There are not values");
        init(sName, iType, null,null, oList);
    }
    
    /**
     * Constructor para los tipos Boolean y Text
     * @param sName El nombre
     * @throws Exception Si el tipo es incorrecto
     */
    public Parameter(String sName,int iType) throws Exception {
        if (iType!=BOOLEAN && iType!=TEXT &&  iType!=LANCODE) throw new Exception("This contructor is not suitable for this Parameter");
        init(sName, iType, null, null, null);
    }
    
    /**
     * Esta funcion devuelve el tipo del parametro
     */
    public int getType() {
        return iType;
    }
    
    /**
     * Devuelve el valor minimo para este parametro
     */
    public BigDecimal getMin() {
        return oMin;
    }
    
    /**
     * Devuelve el valor minimo para este parametro
     */
    public BigDecimal getMax() {
        return oMax;
    }
    
    /**
     * Devuelve los valores de este parametro de tipo ENUMERADO
     */
    public Object[] getValues() {
        if (iType!=ENUMERATION) return null;
        return oList.toArray();
    }
    
    
    /**
     * Devuelve los parametros de este parametro de tipo COMPLEX o COLLECTION
     */
    public Object[] getParameters() {
        if (iType!=COMPLEX && iType!=COLLECTION) return null;
        return oList.toArray();
    }
    
    /**
     * Esta funcion proporciona el nombre
     * del parametro
     */
    public String getName() {
        return new String(sName);
    }
    
    /**
     * Metodo llamado (si este parametro es de tipo complex o collection)
     * para configurar los parametros de este parametro
     */
    public void actionPerformed(java.awt.event.ActionEvent oE) {
        //Lanzamos la ventana de configuracion del parametro complex
        ComplexPanel oPanel=null;
        if (iType==COLLECTION) oPanel= new ComplexPanel(sName, ((Parameter) oList.get(0)).getName(),this);
        else oPanel = new ComplexPanel(sName, null,this); //Si es un parametro de TIPO COMPLEX
        MainFrame.oMainFrame.getAssistant().openComplexPanel(oPanel);
    }
    
    
}

