/*
 * Copyright (c) 2013, the Dart project authors.
 * 
 * Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except
 * in compliance with the License. You may obtain a copy of the License at
 * 
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Unless required by applicable law or agreed to in writing, software distributed under the License
 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 * or implied. See the License for the specific language governing permissions and limitations under
 * the License.
 */
package com.google.dart.engine.internal.object;

/**
 * Instances of the class {@code BoolState} represent the state of an object representing a boolean
 * value.
 */
public class BoolState extends InstanceState {
  /**
   * The value of this instance.
   */
  private Boolean value;

  /**
   * An instance representing the boolean value 'false'.
   */
  public static final BoolState FALSE_STATE = new BoolState(Boolean.FALSE);

  /**
   * An instance representing the boolean value 'true'.
   */
  public static final BoolState TRUE_STATE = new BoolState(Boolean.TRUE);

  /**
   * A state that can be used to represent a boolean whose value is not known.
   */
  public static final BoolState UNKNOWN_VALUE = new BoolState(null);

  /**
   * Return the boolean state representing the given boolean value.
   * 
   * @param value the value to be represented
   * @return the boolean state representing the given boolean value
   */
  public static BoolState from(boolean value) {
    return value ? BoolState.TRUE_STATE : BoolState.FALSE_STATE;
  }

  /**
   * Initialize a newly created state to represent the given value.
   * 
   * @param value the value of this instance
   */
  private BoolState(Boolean value) {
    this.value = value;
  }

  @Override
  public BoolState convertToBool() {
    return this;
  }

  @Override
  public StringState convertToString() {
    if (value == null) {
      return StringState.UNKNOWN_VALUE;
    }
    return new StringState(value ? "true" : "false");
  }

  @Override
  public BoolState equalEqual(InstanceState rightOperand) throws EvaluationException {
    assertBoolNumStringOrNull(rightOperand);
    if (value == null) {
      return UNKNOWN_VALUE;
    }
    if (rightOperand instanceof BoolState) {
      Boolean rightValue = ((BoolState) rightOperand).getValue();
      if (rightValue == null) {
        return UNKNOWN_VALUE;
      }
      return BoolState.from(value == rightValue);
    } else if (rightOperand instanceof DynamicState) {
      return UNKNOWN_VALUE;
    }
    return FALSE_STATE;
  }

  @Override
  public boolean equals(Object object) {
    return object instanceof BoolState && value == ((BoolState) object).value;
  }

  @Override
  public String getTypeName() {
    return "bool"; //$NON-NLS-0$
  }

  @Override
  public Boolean getValue() {
    return value;
  }

  @Override
  public boolean hasExactValue() {
    return true;
  }

  @Override
  public int hashCode() {
    return value == null ? 0 : (value ? 2 : 3);
  }

  /**
   * Return {@code true} if this object represents an object whose type is 'bool'.
   * 
   * @return {@code true} if this object represents a boolean value
   */
  @Override
  public boolean isBool() {
    return true;
  }

  @Override
  public boolean isBoolNumStringOrNull() {
    return true;
  }

  @Override
  public boolean isUnknown() {
    return value == null;
  }

  @Override
  public BoolState logicalAnd(InstanceState rightOperand) throws EvaluationException {
    assertBool(rightOperand);
    if (value == null) {
      return UNKNOWN_VALUE;
    }
    return value ? rightOperand.convertToBool() : FALSE_STATE;
  }

  @Override
  public BoolState logicalNot() {
    if (value == null) {
      return UNKNOWN_VALUE;
    }
    return value ? FALSE_STATE : TRUE_STATE;
  }

  @Override
  public BoolState logicalOr(InstanceState rightOperand) throws EvaluationException {
    assertBool(rightOperand);
    if (value == null) {
      return UNKNOWN_VALUE;
    }
    return value ? TRUE_STATE : rightOperand.convertToBool();
  }

  @Override
  public String toString() {
    return value == null ? "-unknown-" : (value ? "true" : "false");
  }
}
