/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package sdsimulator.runnable;
import myuml.*;

/**
 *
 * @author Miguel Herreros
 */
public class Variable{
    private   MyObjects propietario;
    private   Object[] representacionArreglo;
    private   String textoNombre;
    private   String textoTipo;
    protected String textoValor;
    private   String textoValorOriginal; //para cuando reseteemos.
    
    //..........................................................................
    /** Incluímos unas validaciones mínimas, fundamentales para la correcta tra-
     * ducción de la variable, pero no se hace una validación exhaustiva del co-
     * rrecto formato de la misma, porque ya se está haciendo en la aplicación 
     * WST al crear el diagrama.
     * @param propietario
     * @param var
     * @throws java.lang.Exception
     */
    public Variable(MyObjects propietario, Object var) throws Exception{
        this.propietario = propietario;
        representacionArreglo = (Object[]) var;
        
        if (representacionArreglo.length >=1)
            textoNombre =(String)representacionArreglo[0];
        else
            throw new Exception("Unnamed variable found."); 
      
        if (representacionArreglo.length >=2)
            textoTipo = (String)representacionArreglo[1];
        else
            throw new Exception("Untyped variable found.");
        
        textoValor=valorVariable();
        textoValorOriginal=textoValor;
    }
    //..........................................................................
    public Variable(String textoNombre, String textoTipo, String textoValor) throws Exception{
        this.propietario = null;
                 
        if (!textoNombre.isEmpty())
            this.textoNombre = textoNombre;
        else
            throw new Exception("Can not create unnamed variable."); 
      
        if (!textoTipo.isEmpty())
            this.textoTipo = textoTipo;
        else
            throw new Exception("Can not create untyped variable.");
        
        if (!textoValor.isEmpty())
            this.textoValor = textoValor;
        else
            throw new Exception("Can not create unvaluated variable.");
    }
    
    //..........................................................................
    /**Conocido el tipo de la variable, esta función se encarga de devolver el 
     * valor encontrado para la misma, o, en caso de no encontrar un valor que 
     * asignarle, devolverá un valor por defecto.
     * El valor por defecto para enteros y relojes es 0, para booleanos false y
     * para cadenas de caracteres, la cadena vacía.
     * @return
     */
    private String valorVariable(){
        String retorno="";
        
        if (representacionArreglo.length >=3)
            retorno = (String)representacionArreglo[2];
        
        if (retorno.isEmpty()){
            if      (textoTipo.compareToIgnoreCase("Integer")==0)
                retorno = "0";
            else if (textoTipo.compareToIgnoreCase("Clock")==0)
                retorno = "0";
            else if (textoTipo.compareToIgnoreCase("Boolean")==0)
                retorno = "false";
        }
        
        return retorno;
    }
    
    //..........................................................................
    public String getNombrePropietario(){
        return propietario.getName();
    }
    
    //..........................................................................
    public String getNombre(){
        return textoNombre;
    }
    
    //..........................................................................
    public String getTipo(){
        return textoTipo;
    }
    
    //..........................................................................
    public String getValor(){
        return textoValor;
    }
    
    //..........................................................................
    public void setValor(String valor){
        this.textoValor = valor;
    }
    
    //..........................................................................
    public void reset(){
        textoValor=textoValorOriginal;
    }
    
    //..........................................................................
    @Override
    public String toString(){
        return getNombrePropietario() + "." + textoNombre + " = "  + textoValor + " (" + textoTipo + ")" ;           
    }
}