/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package sdsimulator.runnable.expresiones;
import sdsimulator.runnable.*;
import java.lang.*;

/**
 *
 * @author Miguel Herreros
 */
public class ExpresionLogica{ 
    private java.util.ResourceBundle bundle;
    private String expresion;
    private ExpresionPolaca expresionEvaluable;
    private ContextoEjecucion contexto;
    
    //..........................................................................
    public ExpresionLogica(String expresion , Object variables /*quitarlo*/, ContextoEjecucion contexto){           
        bundle = java.util.ResourceBundle.getBundle("sdsimulator/resources/runnable");
        this.contexto  = contexto;
        this.expresion = expresion;
        try{
            this.expresionEvaluable = new ExpresionPolaca(expresion);
        } catch (Exception e){
            System.out.println("EXPRESION LÓGICA: Error creando Expresión Polaca" + e.getMessage());
        }
    }
    //..........................................................................
    /** Ni por asomo es la implementación real de la evaluación de una expresión
     * lógica, pero así puedo posponer el desarrollo y ya dispongo de la clase 
     * para llevar a cabo otras implementaciones.
     * @return
     */
    public boolean evaluar(){
        if (expresion.isEmpty())
            return true;
        
        try{
            Variable retorno=expresionEvaluable.evaluar(contexto);
            
            if (retorno.getValor().equalsIgnoreCase("true"))
                return true;
            else if (retorno.getValor().equalsIgnoreCase("false"))
                return false;
            else{
                System.out.println("EXPRESION LÓGICA: ERROR, se esperaba true o false y ha llegado: " + retorno.getValor());
                return false;
            }
        } catch (Exception e){
            System.out.println("EXPRESION LÓGICA: HA OCURRIDO UN ERROR EVALUANDO LA EXPRESIÓN LÓGICA: " + 
                                e.getMessage() + "Se devuelve falso como resultado");
            return false;
        }
        
        
    }
    //..........................................................................
    @Override
    public String toString(){
        String retorno;
        
        if (expresion.isEmpty())
            return bundle.getString("LOGICA_VACIA");
        else
            retorno = expresion + bundle.getString("LOGICA");
        
        if (evaluar()) 
            retorno+="true";
        else
            retorno+="false";
        
        return retorno;
    }
    //..........................................................................
    public boolean isEmpty(){
        return expresion.isEmpty();
    }
}

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/***************************package sdsimulator.runnable.expresiones;
import sdsimulator.runnable.*;**************/
/**
 *
 * @author Miguel Herreros
 */
/*******************public class ExpresionLogica extends ExpresionTokenizada{
    private java.util.ResourceBundle bundle;
    private String expresion;
    ContextoEjecucion contexto;
    
    //..........................................................................
    public ExpresionLogica(String expresion,ContextoEjecucion contexto){           
        super(expresion);
        
        this.contexto=contexto;
        bundle = java.util.ResourceBundle.getBundle("sdsimulator/resources/runnable");
    }
    ******************************/
    //..........................................................................
    /** Evalúa la expresión dentro del contexto (valor de las distintas variables)
     * actual. Devuelve true o false en función del resultado de la evaluación.
     * @return
     */
    /***************************public boolean evaluar(){
        Variable retorno=super.evaluar(contexto);
        if (retorno.getValor().equalsIgnoreCase("true"))
            return true;
        else if (retorno.getValor().equalsIgnoreCase("false"))
            return false;
        else{
            System.out.println("ERROR");
            return false;
        }
    }
    
    //..........................................................................
    @Override
    public String toString(){
        String retorno;
        
        if (expresion.isEmpty())
            return bundle.getString("LOGICA_VACIA");
        else{
            retorno = expresion + bundle.getString("LOGICA");
            retorno+=evaluar(contexto).getValor();
        }
  
        return retorno;
    }
}****************************/
