/*******************************************************************************
 * Copyright (c) 2006 Oracle Corporation.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Cameron Bateman/Oracle - initial API and implementation
 *    
 ********************************************************************************/

package org.eclipse.jst.jsf.validation.internal.el.operators;

import org.eclipse.emf.common.util.Diagnostic;
import org.eclipse.jst.jsf.common.internal.types.BooleanLiteralType;
import org.eclipse.jst.jsf.common.internal.types.IAssignable;
import org.eclipse.jst.jsf.common.internal.types.LiteralType;
import org.eclipse.jst.jsf.common.internal.types.TypeCoercer;
import org.eclipse.jst.jsf.common.internal.types.TypeCoercionException;
import org.eclipse.jst.jsf.common.internal.types.TypeConstants;
import org.eclipse.jst.jsf.common.internal.types.TypeTransformer;
import org.eclipse.jst.jsf.common.internal.types.ValueType;
import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;

/**
 * Represents a logical binary operator per JSP.2.3.6.1 (logical and/or)
 * 
 * @author cbateman
 *
 */
/*package*/abstract class LogicalBinaryOperator extends BinaryOperator 
{
    public ValueType performOperation(ValueType firstArg, ValueType secondArg) 
    {
        final boolean canCoerceFirstArg = 
            TypeCoercer.canCoerceToBoolean(TypeTransformer.transformBoxPrimitives(firstArg.getSignature()));
        final boolean canCoerceSecondArg = 
            TypeCoercer.canCoerceToBoolean(TypeTransformer.transformBoxPrimitives(secondArg.getSignature()));
        
        // if can't perform, must return null
        if (! (canCoerceFirstArg && canCoerceSecondArg))
        {
            return null;
        }

        Boolean  firstArgResolvedValue = null;
        
        if (firstArg instanceof LiteralType)
        {
            try
            {
                firstArgResolvedValue = ((LiteralType)firstArg).coerceToBoolean();
            }
            catch (TypeCoercionException tce)
            {
                // should never be throw due to already checking if can coerce
                throw new AssertionError("coercion already checked; this should never be reached");
            }
        }
    
        Boolean secondArgResolvedValue = null;
        if (secondArg instanceof LiteralType)
        {
            try
            {
                secondArgResolvedValue = ((LiteralType)secondArg).coerceToBoolean();
            }
            catch (TypeCoercionException tce)
            {
                // should never be throw due to already checking if can coerce
                throw new AssertionError("coercion already checked; this should never be reached");
            }
        }

        if (firstArgResolvedValue != null && secondArgResolvedValue != null)
        {
            boolean result = 
                doRealOperation(firstArgResolvedValue, secondArgResolvedValue);
            
            return result ? BooleanLiteralType.TRUE : BooleanLiteralType.FALSE;
            
        }
        
        // otherwise, just return a boolean
        // result can only be an rvalue
        return new ValueType(TypeConstants.TYPE_BOOLEAN, IAssignable.ASSIGNMENT_TYPE_RHS);
    }

    public Diagnostic validate(ValueType firstArg, ValueType secondArg) 
    {
        final boolean canCoerceFirstArg = 
            TypeCoercer.canCoerceToBoolean(TypeTransformer.transformBoxPrimitives(firstArg.getSignature()));
        final boolean canCoerceSecondArg = 
            TypeCoercer.canCoerceToBoolean(TypeTransformer.transformBoxPrimitives(secondArg.getSignature()));
       
        if (!canCoerceFirstArg)
        {
            return DiagnosticFactory.
                    create_BINARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN("first");
            //return new BasicDiagnostic(Diagnostic.ERROR, "", 0, "Cannot coerce first argument of "+readableOperatorName()+" to boolean", null);
        }
       
        if (!canCoerceSecondArg)
        {
            return DiagnosticFactory.
                create_BINARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN("first");

            //return new BasicDiagnostic(Diagnostic.ERROR, "", 0, "Cannot coerce second argument of "+readableOperatorName()+" to boolean", null);
        }
           
        if (firstArg instanceof LiteralType)
        {
            try
            {
                final Boolean boolValue = 
                    ((LiteralType)firstArg).coerceToBoolean();
         
                if (boolValue.booleanValue() == shortCircuitValue())
                {
                    return DiagnosticFactory.
                        create_BINARY_OP_FIRST_ARGUMENT_SHORT_CIRCUITS
                            (shortCircuitValue(), readableOperatorName());
                }
            }
            catch (TypeCoercionException tce)
            {
                // should never be throw due to already checking if can coerce
                throw new AssertionError("coercion already checked; this should never be reached");
            }
        }
        
        if (secondArg instanceof LiteralType)
        {
            try
            {
                final Boolean boolValue =
                    ((LiteralType)secondArg).coerceToBoolean();
 
                if (boolValue.booleanValue() == shortCircuitValue())
                {
                    return DiagnosticFactory.
                        create_BINARY_OP_SECOND_ARGUMENT_ALWAYS_EVAL_SAME
                            (shortCircuitValue(), readableOperatorName());
                }
            }
            catch (TypeCoercionException tce)
            {
                // should never be throw due to already checking if can coerce
                throw new AssertionError("coercion already checked; this should never be reached");
            }
        }
           
        // otherwise, nothing to report
        return Diagnostic.OK_INSTANCE;
    }
    
    /**
     * @return a human readable name for the operator
     */
    protected abstract String readableOperatorName();
    
    /**
     * @return the boolean value on which the operator short-circuits
     */
    protected abstract boolean shortCircuitValue();
    
    /**
     * @param firstArg
     * @param secondArg
     * @return the result of performing the operator to two actual values
     */
    protected abstract boolean doRealOperation(Boolean firstArg, Boolean secondArg);
}
