// 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_RADIAL_GRADIENT_VALUE_H_
#define COBALT_CSSOM_RADIAL_GRADIENT_VALUE_H_

#include <string>
#include <vector>

#include "base/basictypes.h"
#include "base/compiler_specific.h"
#include "base/memory/ref_counted.h"
#include "base/memory/scoped_ptr.h"
#include "base/optional.h"
#include "cobalt/base/polymorphic_equatable.h"
#include "cobalt/cssom/color_stop.h"
#include "cobalt/cssom/property_list_value.h"
#include "cobalt/cssom/property_value.h"

namespace cobalt {
namespace cssom {

// A radial gradient is specified by indicating the center of the gradient (
// where the 0% ellipse will be) and the size and shape of the ending shape (the
// 100% ellipse). Color stops are given as a list. Starting from the center and
// progressing towards (and potentially beyond) the ending shape
// uniformly-scaled concentric ellipses are drawn and colored according to the
// specified color stops.
//   https://www.w3.org/TR/css3-images/#radial-gradients
class RadialGradientValue : public PropertyValue {
 public:
  enum Shape {
    kCircle,
    kEllipse,
  };

  enum SizeKeyword {
    kClosestSide,
    kFarthestSide,
    kClosestCorner,
    kFarthestCorner,
  };

  RadialGradientValue(Shape shape, SizeKeyword size_keyword,
                      const scoped_refptr<PropertyListValue>& position,
                      ColorStopList color_stop_list)
      : shape_(shape),
        size_keyword_(size_keyword),
        position_(position),
        color_stop_list_(color_stop_list.Pass()) {}

  RadialGradientValue(Shape shape,
                      const scoped_refptr<PropertyListValue>& size_value,
                      const scoped_refptr<PropertyListValue>& position,
                      ColorStopList color_stop_list)
      : shape_(shape),
        size_value_(size_value),
        position_(position),
        color_stop_list_(color_stop_list.Pass()) {}

  void Accept(PropertyValueVisitor* visitor) OVERRIDE;

  const Shape& shape() const { return shape_; }

  base::optional<SizeKeyword> size_keyword() const { return size_keyword_; }
  const scoped_refptr<PropertyListValue>& size_value() const {
    return size_value_;
  }

  const scoped_refptr<PropertyListValue>& position() const { return position_; }

  const ColorStopList& color_stop_list() const {
    return color_stop_list_;
  }

  std::string ToString() const OVERRIDE;

  bool operator==(const RadialGradientValue& other) const;

  DEFINE_POLYMORPHIC_EQUATABLE_TYPE(RadialGradientValue);

 private:
  ~RadialGradientValue() OVERRIDE {}

  const Shape shape_;

  // Exactly one of |size_keyword_| and |size_value_| is engaged.
  const base::optional<SizeKeyword> size_keyword_;
  const scoped_refptr<PropertyListValue> size_value_;

  const scoped_refptr<PropertyListValue> position_;
  const ColorStopList color_stop_list_;

  DISALLOW_COPY_AND_ASSIGN(RadialGradientValue);
};

}  // namespace cssom
}  // namespace cobalt

#endif  // COBALT_CSSOM_RADIAL_GRADIENT_VALUE_H_
