/*
 * Copyright 2014 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_KEYWORD_VALUE_H_
#define COBALT_CSSOM_KEYWORD_VALUE_H_

#include <string>

#include "base/basictypes.h"
#include "base/compiler_specific.h"
#include "base/memory/ref_counted.h"
#include "cobalt/base/polymorphic_equatable.h"
#include "cobalt/cssom/property_value.h"

namespace cobalt {
namespace cssom {

class KeywordValue : public PropertyValue {
 public:
  enum Value {
    // "absolute" is a value of "position" property which indicates that values
    // of "top", "right", "bottom", and "left" properties specify offsets
    // with respect to the box's containing block.
    //   https://www.w3.org/TR/CSS21/visuren.html#choose-position
    kAbsolute,

    // "alternate" is a possible value of the "animation-direction" property.
    //   https://www.w3.org/TR/2013/WD-css3-animations-20130219/#animation-direction-property
    kAlternate,

    // "alternate-reverse" is a possible value of the "animation-direction"
    // property.
    //   https://www.w3.org/TR/2013/WD-css3-animations-20130219/#animation-direction-property
    kAlternateReverse,

    // "auto" is a value of "width" and "height" properties which indicates
    // that used value of these properties depends on the values of other
    // properties.
    //   https://www.w3.org/TR/CSS21/visudet.html#the-width-property
    //   https://www.w3.org/TR/CSS21/visudet.html#the-height-property
    kAuto,

    // "backwards" is a value of "animation-fill-mode" property which causes the
    // animation results to fill in backwards around the animation's active
    // duration.
    //   https://www.w3.org/TR/css3-animations/#animation-fill-mode-property
    kBackwards,

    // "middle" is the default value of "vertical-align" property that indicates
    // that the content should be aligned at the baselines.
    //   https://www.w3.org/TR/CSS21/visudet.html#propdef-vertical-align
    kBaseline,

    // "block" is a value of "display" property which causes an element
    // to generate a block box.
    //   https://www.w3.org/TR/CSS21/visuren.html#display-prop
    kBlock,

    // "both" is a value of "animation-fill-mode" property which causes the
    // animation results to fill in forwards and backwards around the
    // animation's active duration.
    //   https://www.w3.org/TR/css3-animations/#animation-fill-mode-property
    kBoth,

    // "bottom" is a value of "background-position" property that computes to
    // 100% for the vertical position if one or two values are given, otherwise
    // specifies the bottom edge as the origin for the next offset.
    //  https://www.w3.org/TR/css3-background/#the-background-position
    kBottom,

    // "break-word" is a value of "overflow-wrap" property which specifies to
    // the user agent that an unbreakable word may be broken at an arbitrary
    // point if there are no otherwise-acceptable break points in the line.
    //   https://www.w3.org/TR/css-text-3/#overflow-wrap-property
    kBreakWord,

    // "center" is a value of "text-align" property that indicates that the
    // content should be aligned horizontally centered.
    //   https://www.w3.org/TR/css-text-3/#text-align
    kCenter,

    // "clip" is a value of "text-overflow" property which specifies clipping
    // content that overflows its block container element. Characters may be
    // only partially rendered.
    //   https://www.w3.org/TR/css3-ui/#propdef-text-overflow
    kClip,

    // "contain" is a value of "background-size" property which scales the
    // image to the largest size such that both its width and its height can
    // completely cover the background positioning area.
    //   https://www.w3.org/TR/css3-background/#the-background-size
    kContain,

    // "cover" is a value of "background-size" property which scales the image
    // to the smallest size such that both its width and its height can fit
    // inside the background positioning area.
    //   https://www.w3.org/TR/css3-background/#the-background-size
    kCover,

    // "currentColor" is the initial value of "border-color" property.
    // CSS3 extends the color value to include the 'currentColor' keyword
    // to allow its use with all properties that accept a <color> value.
    //   https://www.w3.org/TR/css3-color/#currentcolor
    kCurrentColor,

    // "cursive" is a value of "font_family" property which indicates a generic
    // font family using a more informal script style.
    //   https://www.w3.org/TR/css3-fonts/#generic-font-families
    kCursive,

    // "ellipsis" is a value of "text-overflow" property which specifies
    // rendering an ellipsis to represent clipped inline content.
    //   https://www.w3.org/TR/css3-ui/#propdef-text-overflow
    kEllipsis,

    // "end" is a value of "text-align" property that indicates that content
    // is aligned at the end edge of the line box.
    //   https://www.w3.org/TR/css-text-3/#text-align
    kEnd,

    // "fantasy" is a value of "font_family" property which indicates a generic
    // font family using decorative or expressive representations of characters.
    //   https://www.w3.org/TR/css3-fonts/#generic-font-families
    kFantasy,

    // "fixed" is a value of the "position" property which indicates that
    // the element is positioned and the element's containing block should be
    // set to the viewport.
    //   https://www.w3.org/TR/CSS21/visuren.html#choose-position
    kFixed,

    // "forwards" is a value of "animation-fill-mode" property which causes the
    // animation results to fill in forwards around the animation's active
    // duration.
    //   https://www.w3.org/TR/css3-animations/#animation-fill-mode-property
    kForwards,

    // "hidden" is a value of "overflow" property which indicates that
    // the content is clipped.
    //   https://www.w3.org/TR/CSS21/visufx.html#overflow
    // "hidden" is a value of "visibility" property which indicates that
    // the generated box is invisible.
    //   https://www.w3.org/TR/CSS21/visufx.html#propdef-visibility
    kHidden,

    // "infinite" is a value of "animation-iteration-count" property which
    // causes the animation to loop forever.
    //   https://www.w3.org/TR/css3-animations/#animation-iteration-count-property
    kInfinite,

    // Applicable to any property, represents a cascaded value of "inherit",
    // which means that, for a given element, the property takes the same
    // specified value as the property for the element's parent.
    //   https://www.w3.org/TR/CSS21/cascade.html#value-def-inherit
    kInherit,

    // Applicable to any property, the "initial" keyword represents
    // the specified value that is designated as the property's initial value.
    //   https://www.w3.org/TR/css3-values/#common-keywords
    kInitial,

    // "inline" is a value of "display" property which causes an element
    // to generate one or more inline boxes.
    //   https://www.w3.org/TR/CSS21/visuren.html#display-prop
    kInline,

    // "inline-block" is a value of "display" property which causes an element
    // to generate an inline-level block container.
    //   https://www.w3.org/TR/CSS21/visuren.html#display-prop
    kInlineBlock,

    // "left" is a value of "text-align" property that indicates that the
    // content should be aligned horizontally to the left.
    //   https://www.w3.org/TR/css-text-3/#text-align
    kLeft,

    // "line-through" is a value of "text-decoration-line" property that
    // indicates that the line of text has a line through the middle.
    kLineThrough,

    // "middle" is a value of "vertical-align" property that indicates that the
    // content should be aligned vertically centered.
    //   https://www.w3.org/TR/CSS21/visudet.html#propdef-vertical-align
    kMiddle,

    // "monospace" is a value of "font_family" property which indicates a
    // generic
    // font family using glyphs with the same fixed width.
    //   https://www.w3.org/TR/css3-fonts/#generic-font-families
    kMonospace,

    // "none" is a value of "transform" property which means that HTML element
    // is rendered as is.
    //   https://www.w3.org/TR/css3-transforms/#transform-property
    kNone,

    // "no-repeat" is a value of "background-repeat" property which means that
    // image is not repeated in a specific direction.
    //   https://www.w3.org/TR/css3-background/#background-repeat
    kNoRepeat,

    // "normal" is a value of "line-height" property which tells user agents
    // to set the used value to a "reasonable" value based on the font
    // of the element.
    //   https://www.w3.org/TR/CSS21/visudet.html#line-height
    kNormal,

    // "nowrap" is a value of "white-space" property which tells user agents
    // that white space should be collapsed as for "normal" but line breaks
    // should be suppressed within text.
    //   https://www.w3.org/TR/css3-text/#white-space-property
    kNoWrap,

    // "pre" is a value of "white-space" property which tells user agents that
    // white space inside the element should not be collapsed and lines should
    // only be broken at preserved newline characters.
    //   https://www.w3.org/TR/css3-text/#white-space-property
    kPre,

    // "pre-line" is a value of "white-space" property which tells user agents
    // that white space inside the element should be collapsed and lines should
    // be broken at preserved newline characters and as necessary to fill line
    // boxes, meaning that wrapping is allowed.
    //   https://www.w3.org/TR/css3-text/#white-space-property
    kPreLine,

    // "pre-wrap" is a value of "white-space" property which tells user agents
    // that white space inside the element should not be collapsed and lines
    // should be broken at preserved newline characters and as necessary to fill
    // line boxes, meaning that wrapping is allowed.
    //   https://www.w3.org/TR/css3-text/#white-space-property
    kPreWrap,

    // "relative" is a value of "position" property which indicates that values
    // of "top", "right", "bottom", and "left" properties specify offsets
    // with respect to the box's in-flow position.
    //   https://www.w3.org/TR/CSS21/visuren.html#choose-position
    kRelative,

    // "repeat" is a value of "background-repeat" property which means that
    // image is repeated in a specific direction.
    //   https://www.w3.org/TR/css3-background/#background-repeat
    kRepeat,

    // "reverse" is a possible value of the "animation-direction" property.
    //   https://www.w3.org/TR/2013/WD-css3-animations-20130219/#animation-direction-property
    kReverse,

    // "right" is a value of "text-align" property that indicates that the
    // content should be aligned horizontally to the right.
    //   https://www.w3.org/TR/css-text-3/#text-align
    kRight,

    // "sans-serif" is a value of "font_family" property which indicates a
    // generic font family using glyphs with low contrast and plain stroke
    // endings (without flaring, cross stroke or other ornamentation).
    //   https://www.w3.org/TR/css3-fonts/#generic-font-families
    kSansSerif,

    // "serif" is a value of "font_family" property which indicates a generic
    // font family representing the formal text style for script.
    //   https://www.w3.org/TR/css3-fonts/#generic-font-families
    kSerif,

    // "solid" is a value of "border-style" property which indicates a single
    // line segment.
    //   https://www.w3.org/TR/css3-background/#border-style
    kSolid,

    // "start" is a value of "text-align" property that indicates that content
    // is aligned at the start edge of the line box. This is the initial
    // value for "text-align"
    //   https://www.w3.org/TR/css-text-3/#text-align
    kStart,

    // "static" is a value of "position" property which indicates that a box
    // is laid out according to the normal flow.
    //   https://www.w3.org/TR/CSS21/visuren.html#choose-position
    kStatic,

    // "top" is a value of "vertical-align" property that indicates that the
    // content should be aligned vertically at the top.
    //   https://www.w3.org/TR/CSS21/visudet.html#propdef-vertical-align
    kTop,

    // "uppercase" is a value of "text_transform" property that indicates that
    // all characters in each word of the element's text should be put in
    // uppercase.
    //   https://www.w3.org/TR/css3-text/#text-transform-property
    kUppercase,

    // "visible" is a value of "overflow" property which indicates that
    // the content is not clipped.
    //   https://www.w3.org/TR/CSS21/visufx.html#overflow
    // "visible" is a value of "visibility" property which indicates that
    // the generated box is visible.
    //   https://www.w3.org/TR/CSS21/visufx.html#propdef-visibility
    kVisible,
  };

  // Since keyword values do not hold additional information and some of them
  // (namely "inherit" and "initial") are used extensively, for the sake of
  // saving memory an explicit instantiation of this class is disallowed.
  // Use factory methods below to obtain shared instances.
  static const scoped_refptr<KeywordValue>& GetAbsolute();
  static const scoped_refptr<KeywordValue>& GetAlternate();
  static const scoped_refptr<KeywordValue>& GetAlternateReverse();
  static const scoped_refptr<KeywordValue>& GetAuto();
  static const scoped_refptr<KeywordValue>& GetBackwards();
  static const scoped_refptr<KeywordValue>& GetBaseline();
  static const scoped_refptr<KeywordValue>& GetBlock();
  static const scoped_refptr<KeywordValue>& GetBoth();
  static const scoped_refptr<KeywordValue>& GetBottom();
  static const scoped_refptr<KeywordValue>& GetBreakWord();
  static const scoped_refptr<KeywordValue>& GetCenter();
  static const scoped_refptr<KeywordValue>& GetClip();
  static const scoped_refptr<KeywordValue>& GetContain();
  static const scoped_refptr<KeywordValue>& GetCover();
  static const scoped_refptr<KeywordValue>& GetCurrentColor();
  static const scoped_refptr<KeywordValue>& GetCursive();
  static const scoped_refptr<KeywordValue>& GetEllipsis();
  static const scoped_refptr<KeywordValue>& GetEnd();
  static const scoped_refptr<KeywordValue>& GetFantasy();
  static const scoped_refptr<KeywordValue>& GetForwards();
  static const scoped_refptr<KeywordValue>& GetFixed();
  static const scoped_refptr<KeywordValue>& GetHidden();
  static const scoped_refptr<KeywordValue>& GetInfinite();
  static const scoped_refptr<KeywordValue>& GetInherit();
  static const scoped_refptr<KeywordValue>& GetInitial();
  static const scoped_refptr<KeywordValue>& GetInline();
  static const scoped_refptr<KeywordValue>& GetInlineBlock();
  static const scoped_refptr<KeywordValue>& GetLeft();
  static const scoped_refptr<KeywordValue>& GetLineThrough();
  static const scoped_refptr<KeywordValue>& GetMiddle();
  static const scoped_refptr<KeywordValue>& GetMonospace();
  static const scoped_refptr<KeywordValue>& GetNone();
  static const scoped_refptr<KeywordValue>& GetNoRepeat();
  static const scoped_refptr<KeywordValue>& GetNormal();
  static const scoped_refptr<KeywordValue>& GetNoWrap();
  static const scoped_refptr<KeywordValue>& GetPre();
  static const scoped_refptr<KeywordValue>& GetPreLine();
  static const scoped_refptr<KeywordValue>& GetPreWrap();
  static const scoped_refptr<KeywordValue>& GetRelative();
  static const scoped_refptr<KeywordValue>& GetRepeat();
  static const scoped_refptr<KeywordValue>& GetReverse();
  static const scoped_refptr<KeywordValue>& GetRight();
  static const scoped_refptr<KeywordValue>& GetSansSerif();
  static const scoped_refptr<KeywordValue>& GetSerif();
  static const scoped_refptr<KeywordValue>& GetSolid();
  static const scoped_refptr<KeywordValue>& GetStart();
  static const scoped_refptr<KeywordValue>& GetStatic();
  static const scoped_refptr<KeywordValue>& GetTop();
  static const scoped_refptr<KeywordValue>& GetUppercase();
  static const scoped_refptr<KeywordValue>& GetVisible();

  void Accept(PropertyValueVisitor* visitor) OVERRIDE;

  Value value() const { return value_; }

  std::string ToString() const OVERRIDE;

  bool operator==(const KeywordValue& other) const {
    return value_ == other.value_;
  }

  DEFINE_POLYMORPHIC_EQUATABLE_TYPE(KeywordValue);

  // Implementation detail, has to be public in order to be constructible.
  struct NonTrivialStaticFields;

 private:
  explicit KeywordValue(Value value) : value_(value) {}
  ~KeywordValue() OVERRIDE {}

  const Value value_;

  DISALLOW_COPY_AND_ASSIGN(KeywordValue);
};

}  // namespace cssom
}  // namespace cobalt

#endif  // COBALT_CSSOM_KEYWORD_VALUE_H_
