/*
 * Copyright 2015 Google Inc. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
 *
 * 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.
 */

#ifndef COBALT_CSSOM_CALC_VALUE_H_
#define COBALT_CSSOM_CALC_VALUE_H_

#include <string>

#include "base/basictypes.h"
#include "base/compiler_specific.h"
#include "cobalt/base/polymorphic_equatable.h"
#include "cobalt/cssom/length_value.h"
#include "cobalt/cssom/percentage_value.h"
#include "cobalt/cssom/property_value.h"

namespace cobalt {
namespace cssom {

// Represets the result of the mathematical calculation it contains, using
// standard operator precedence rules.
// TODO: Implement the complete version of CalcValue. The
// current CalcValue is just a simplified implementation.
//  https://www.w3.org/TR/css3-values/#calc-notation
class CalcValue : public PropertyValue {
 public:
  CalcValue(const scoped_refptr<LengthValue>& length_value,
            const scoped_refptr<PercentageValue>& percentage_value)
      : length_value_(length_value), percentage_value_(percentage_value) {}

  explicit CalcValue(const scoped_refptr<LengthValue>& length_value)
      : length_value_(length_value),
        percentage_value_(new PercentageValue(0.0f)) {}

  explicit CalcValue(const scoped_refptr<PercentageValue>& percentage_value)
      : length_value_(new LengthValue(0.0f, kPixelsUnit)),
        percentage_value_(percentage_value) {}

  void Accept(PropertyValueVisitor* visitor) OVERRIDE;

  const scoped_refptr<LengthValue>& length_value() const {
    return length_value_;
  }

  const scoped_refptr<PercentageValue> percentage_value() const {
    return percentage_value_.get();
  }

  std::string ToString() const OVERRIDE;

  bool operator==(const CalcValue& other) const {
    return *length_value_ == *other.length_value_ &&
           *percentage_value_ == *other.percentage_value_;
  }

  DEFINE_POLYMORPHIC_EQUATABLE_TYPE(CalcValue);

 private:
  ~CalcValue() OVERRIDE {}

  const scoped_refptr<LengthValue> length_value_;
  const scoped_refptr<PercentageValue> percentage_value_;

  DISALLOW_COPY_AND_ASSIGN(CalcValue);
};

}  // namespace cssom
}  // namespace cobalt

#endif  // COBALT_CSSOM_CALC_VALUE_H_
