/*
 * 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,

    // "monoscopic" is a value of the "cobalt-mtm" property which indicates
    // that the mesh should only be rendered through one eye.
    kMonoscopic,

    // "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,

    // "stereoscopic-left-right" is a value of the "cobalt-mtm" property which
    // indicates that the mesh should be rendered in two views
    // side-by-side.
    kStereoscopicLeftRight,

    // "stereoscopic-top-bottom" is a value of the "cobalt-mtm" property which
    // indicates that the mesh should be rendered in two views above and below.
    kStereoscopicTopBottom,

    // "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>& GetMonoscopic();
  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>& GetStereoscopicLeftRight();
  static const scoped_refptr<KeywordValue>& GetStereoscopicTopBottom();
  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_
