/*
 * 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_CSS_STYLE_DECLARATION_H_
#define COBALT_CSSOM_CSS_STYLE_DECLARATION_H_

#include <algorithm>
#include <string>

#include "base/basictypes.h"
#include "base/memory/ref_counted.h"
#include "base/memory/weak_ptr.h"
#include "base/optional.h"
#include "cobalt/cssom/property_definitions.h"
#include "cobalt/script/exception_state.h"
#include "cobalt/script/wrappable.h"

namespace cobalt {
namespace cssom {

class CSSRule;
class MutationObserver;

// The CSSStyleDeclaration interface represents a CSS declaration block,
// including its underlying state, where this underlying state depends
// upon the source of the CSSStyleDeclaration instance.
//   https://www.w3.org/TR/2013/WD-cssom-20131205/#the-cssstyledeclaration-interface
class CSSStyleDeclaration : public script::Wrappable {
 public:
  // Web API: CSSStyleDeclaration
  //
  std::string animation(script::ExceptionState* exception_state) const;
  void set_animation(const std::string& animation,
                     script::ExceptionState* exception_state);

  std::string animation_delay(script::ExceptionState* exception_state) const;
  void set_animation_delay(const std::string& animation_delay,
                           script::ExceptionState* exception_state);

  std::string animation_direction(
      script::ExceptionState* exception_state) const;
  void set_animation_direction(const std::string& animation_direction,
                               script::ExceptionState* exception_state);

  std::string animation_duration(script::ExceptionState* exception_state) const;
  void set_animation_duration(const std::string& animation_duration,
                              script::ExceptionState* exception_state);

  std::string animation_fill_mode(
      script::ExceptionState* exception_state) const;
  void set_animation_fill_mode(const std::string& animation_fill_mode,
                               script::ExceptionState* exception_state);

  std::string animation_iteration_count(
      script::ExceptionState* exception_state) const;
  void set_animation_iteration_count(
      const std::string& animation_iteration_count,
      script::ExceptionState* exception_state);

  std::string animation_name(script::ExceptionState* exception_state) const;
  void set_animation_name(const std::string& animation_name,
                          script::ExceptionState* exception_state);

  std::string animation_timing_function(
      script::ExceptionState* exception_state) const;
  void set_animation_timing_function(
      const std::string& animation_timing_function,
      script::ExceptionState* exception_state);

  std::string background(script::ExceptionState* exception_state) const;
  void set_background(const std::string& background,
                      script::ExceptionState* exception_state);

  std::string background_color(script::ExceptionState* exception_state) const;
  void set_background_color(const std::string& background_color,
                            script::ExceptionState* exception_state);

  std::string background_image(script::ExceptionState* exception_state) const;
  void set_background_image(const std::string& background_image,
                            script::ExceptionState* exception_state);

  std::string background_position(
      script::ExceptionState* exception_state) const;
  void set_background_position(const std::string& background_position,
                               script::ExceptionState* exception_state);

  std::string background_repeat(script::ExceptionState* exception_state) const;
  void set_background_repeat(const std::string& background_repeat,
                             script::ExceptionState* exception_state);

  std::string background_size(script::ExceptionState* exception_state) const;
  void set_background_size(const std::string& background_size,
                           script::ExceptionState* exception_state);

  std::string border(script::ExceptionState* exception_state) const;
  void set_border(const std::string& border,
                  script::ExceptionState* exception_state);

  std::string border_bottom(script::ExceptionState* exception_state) const;
  void set_border_bottom(const std::string& border_bottom,
                         script::ExceptionState* exception_state);

  std::string border_bottom_color(
      script::ExceptionState* exception_state) const;
  void set_border_bottom_color(const std::string& border_bottom_color,
                               script::ExceptionState* exception_state);

  std::string border_bottom_style(
      script::ExceptionState* exception_state) const;
  void set_border_bottom_style(const std::string& border_bottom_style,
                               script::ExceptionState* exception_state);

  std::string border_bottom_width(
      script::ExceptionState* exception_state) const;
  void set_border_bottom_width(const std::string& border_bottom_width,
                               script::ExceptionState* exception_state);

  std::string border_color(script::ExceptionState* exception_state) const;
  void set_border_color(const std::string& border_color,
                        script::ExceptionState* exception_state);

  std::string border_left(script::ExceptionState* exception_state) const;
  void set_border_left(const std::string& border_left,
                       script::ExceptionState* exception_state);

  std::string border_left_color(script::ExceptionState* exception_state) const;
  void set_border_left_color(const std::string& border_left_color,
                             script::ExceptionState* exception_state);

  std::string border_left_style(script::ExceptionState* exception_state) const;
  void set_border_left_style(const std::string& border_left_style,
                             script::ExceptionState* exception_state);

  std::string border_left_width(script::ExceptionState* exception_state) const;
  void set_border_left_width(const std::string& border_left_width,
                             script::ExceptionState* exception_state);

  std::string border_radius(script::ExceptionState* exception_state) const;
  void set_border_radius(const std::string& border_radius,
                         script::ExceptionState* exception_state);

  std::string border_right(script::ExceptionState* exception_state) const;
  void set_border_right(const std::string& border_right,
                        script::ExceptionState* exception_state);

  std::string border_right_color(script::ExceptionState* exception_state) const;
  void set_border_right_color(const std::string& border_right_color,
                              script::ExceptionState* exception_state);

  std::string border_right_style(script::ExceptionState* exception_state) const;
  void set_border_right_style(const std::string& border_right_style,
                              script::ExceptionState* exception_state);

  std::string border_right_width(script::ExceptionState* exception_state) const;
  void set_border_right_width(const std::string& border_right_width,
                              script::ExceptionState* exception_state);

  std::string border_top(script::ExceptionState* exception_state) const;
  void set_border_top(const std::string& border_top,
                      script::ExceptionState* exception_state);

  std::string border_top_color(script::ExceptionState* exception_state) const;
  void set_border_top_color(const std::string& border_top_color,
                            script::ExceptionState* exception_state);

  std::string border_top_style(script::ExceptionState* exception_state) const;
  void set_border_top_style(const std::string& border_top_style,
                            script::ExceptionState* exception_state);

  std::string border_top_width(script::ExceptionState* exception_state) const;
  void set_border_top_width(const std::string& border_top_width,
                            script::ExceptionState* exception_state);

  std::string border_style(script::ExceptionState* exception_state) const;
  void set_border_style(const std::string& border_style,
                        script::ExceptionState* exception_state);

  std::string border_width(script::ExceptionState* exception_state) const;
  void set_border_width(const std::string& border_width,
                        script::ExceptionState* exception_state);

  std::string bottom(script::ExceptionState* exception_state) const;
  void set_bottom(const std::string& bottom,
                  script::ExceptionState* exception_state);

  std::string box_shadow(script::ExceptionState* exception_state) const;
  void set_box_shadow(const std::string& box_shadow,
                      script::ExceptionState* exception_state);

  std::string color(script::ExceptionState* exception_state) const;
  void set_color(const std::string& color,
                 script::ExceptionState* exception_state);

  std::string content(script::ExceptionState* exception_state) const;
  void set_content(const std::string& content,
                   script::ExceptionState* exception_state);

  std::string display(script::ExceptionState* exception_state) const;
  void set_display(const std::string& display,
                   script::ExceptionState* exception_state);

  std::string font(script::ExceptionState* exception_state) const;
  void set_font(const std::string& font,
                script::ExceptionState* exception_state);

  std::string font_family(script::ExceptionState* exception_state) const;
  void set_font_family(const std::string& font_family,
                       script::ExceptionState* exception_state);

  std::string font_size(script::ExceptionState* exception_state) const;
  void set_font_size(const std::string& font_size,
                     script::ExceptionState* exception_state);

  std::string font_style(script::ExceptionState* exception_state) const;
  void set_font_style(const std::string& font_style,
                      script::ExceptionState* exception_state);

  std::string font_weight(script::ExceptionState* exception_state) const;
  void set_font_weight(const std::string& font_weight,
                       script::ExceptionState* exception_state);

  std::string height(script::ExceptionState* exception_state) const;
  void set_height(const std::string& height,
                  script::ExceptionState* exception_state);

  std::string left(script::ExceptionState* exception_state) const;
  void set_left(const std::string& left,
                script::ExceptionState* exception_state);

  std::string line_height(script::ExceptionState* exception_state) const;
  void set_line_height(const std::string& line_height,
                       script::ExceptionState* exception_state);

  std::string margin(script::ExceptionState* exception_state) const;
  void set_margin(const std::string& margin,
                  script::ExceptionState* exception_state);

  std::string margin_bottom(script::ExceptionState* exception_state) const;
  void set_margin_bottom(const std::string& margin_bottom,
                         script::ExceptionState* exception_state);

  std::string margin_left(script::ExceptionState* exception_state) const;
  void set_margin_left(const std::string& margin_left,
                       script::ExceptionState* exception_state);

  std::string margin_right(script::ExceptionState* exception_state) const;
  void set_margin_right(const std::string& margin_right,
                        script::ExceptionState* exception_state);

  std::string margin_top(script::ExceptionState* exception_state) const;
  void set_margin_top(const std::string& margin_top,
                      script::ExceptionState* exception_state);

  std::string max_height(script::ExceptionState* exception_state) const;
  void set_max_height(const std::string& max_height,
                      script::ExceptionState* exception_state);

  std::string max_width(script::ExceptionState* exception_state) const;
  void set_max_width(const std::string& max_width,
                     script::ExceptionState* exception_state);

  std::string min_height(script::ExceptionState* exception_state) const;
  void set_min_height(const std::string& min_height,
                      script::ExceptionState* exception_state);

  std::string min_width(script::ExceptionState* exception_state) const;
  void set_min_width(const std::string& min_width,
                     script::ExceptionState* exception_state);

  std::string opacity(script::ExceptionState* exception_state) const;
  void set_opacity(const std::string& opacity,
                   script::ExceptionState* exception_state);

  std::string overflow(script::ExceptionState* exception_state) const;
  void set_overflow(const std::string& overflow,
                    script::ExceptionState* exception_state);

  std::string overflow_wrap(script::ExceptionState* exception_state) const;
  void set_overflow_wrap(const std::string& overflow_wrap,
                         script::ExceptionState* exception_state);

  std::string padding(script::ExceptionState* exception_state) const;
  void set_padding(const std::string& padding,
                   script::ExceptionState* exception_state);

  std::string padding_bottom(script::ExceptionState* exception_state) const;
  void set_padding_bottom(const std::string& padding_bottom,
                          script::ExceptionState* exception_state);

  std::string padding_left(script::ExceptionState* exception_state) const;
  void set_padding_left(const std::string& padding_left,
                        script::ExceptionState* exception_state);

  std::string padding_right(script::ExceptionState* exception_state) const;
  void set_padding_right(const std::string& padding_right,
                         script::ExceptionState* exception_state);

  std::string padding_top(script::ExceptionState* exception_state) const;
  void set_padding_top(const std::string& padding_top,
                       script::ExceptionState* exception_state);

  std::string position(script::ExceptionState* exception_state) const;
  void set_position(const std::string& position,
                    script::ExceptionState* exception_state);

  std::string right(script::ExceptionState* exception_state) const;
  void set_right(const std::string& right,
                 script::ExceptionState* exception_state);

  std::string text_align(script::ExceptionState* exception_state) const;
  void set_text_align(const std::string& text_align,
                      script::ExceptionState* exception_state);

  std::string text_decoration(script::ExceptionState* exception_state) const;
  void set_text_decoration(const std::string& text_decoration,
                           script::ExceptionState* exception_state);

  std::string text_decoration_color(
      script::ExceptionState* exception_state) const;
  void set_text_decoration_color(const std::string& text_decoration_color,
                                 script::ExceptionState* exception_state);

  std::string text_decoration_line(
      script::ExceptionState* exception_state) const;
  void set_text_decoration_line(const std::string& text_decoration_line,
                                script::ExceptionState* exception_state);

  std::string text_indent(script::ExceptionState* exception_state) const;
  void set_text_indent(const std::string& text_indent,
                       script::ExceptionState* exception_state);

  std::string text_overflow(script::ExceptionState* exception_state) const;
  void set_text_overflow(const std::string& text_overflow,
                         script::ExceptionState* exception_state);

  std::string text_shadow(script::ExceptionState* exception_state) const;
  void set_text_shadow(const std::string& text_shadow,
                       script::ExceptionState* exception_state);

  std::string text_transform(script::ExceptionState* exception_state) const;
  void set_text_transform(const std::string& text_transform,
                          script::ExceptionState* exception_state);

  std::string top(script::ExceptionState* exception_state) const;
  void set_top(const std::string& top, script::ExceptionState* exception_state);

  std::string transform(script::ExceptionState* exception_state) const;
  void set_transform(const std::string& transform,
                     script::ExceptionState* exception_state);

  std::string transform_origin(script::ExceptionState* exception_state) const;
  void set_transform_origin(const std::string& transform_origin,
                            script::ExceptionState* exception_state);

  std::string transition(script::ExceptionState* exception_state) const;
  void set_transition(const std::string& transition,
                      script::ExceptionState* exception_state);

  std::string transition_delay(script::ExceptionState* exception_state) const;
  void set_transition_delay(const std::string& transition_delay,
                            script::ExceptionState* exception_state);

  std::string transition_duration(
      script::ExceptionState* exception_state) const;
  void set_transition_duration(const std::string& transition_duration,
                               script::ExceptionState* exception_state);

  std::string transition_property(
      script::ExceptionState* exception_state) const;
  void set_transition_property(const std::string& transition_property,
                               script::ExceptionState* exception_state);

  std::string transition_timing_function(
      script::ExceptionState* exception_state) const;
  void set_transition_timing_function(
      const std::string& transition_timing_function,
      script::ExceptionState* exception_state);

  std::string vertical_align(script::ExceptionState* exception_state) const;
  void set_vertical_align(const std::string& vertical_align,
                          script::ExceptionState* exception_state);

  std::string visibility(script::ExceptionState* exception_state) const;
  void set_visibility(const std::string& visibility,
                      script::ExceptionState* exception_state);

  std::string white_space(script::ExceptionState* exception_state) const;
  void set_white_space(const std::string& width,
                       script::ExceptionState* exception_state);

  std::string width(script::ExceptionState* exception_state) const;
  void set_width(const std::string& width,
                 script::ExceptionState* exception_state);

  std::string word_wrap(script::ExceptionState* exception_state) const;
  void set_word_wrap(const std::string& word_wrap,
                     script::ExceptionState* exception_state);

  std::string z_index(script::ExceptionState* exception_state) const;
  void set_z_index(const std::string& z_index,
                   script::ExceptionState* exception_state);

  virtual std::string css_text(
      script::ExceptionState* exception_state) const = 0;
  virtual void set_css_text(const std::string& css_text,
                            script::ExceptionState* exception_state) = 0;

  virtual unsigned int length() const = 0;

  virtual base::optional<std::string> Item(unsigned int index) const = 0;

  std::string GetPropertyValue(const std::string& property_name);
  virtual void SetPropertyValue(const std::string& property_name,
                                const std::string& property_value,
                                script::ExceptionState* exception_state) = 0;

  virtual void SetProperty(const std::string& property_name,
                           const std::string& property_value,
                           const std::string& priority,
                           script::ExceptionState* exception_state) = 0;

  void SetProperty(const std::string& property_name,
                   const std::string& property_value,
                   script::ExceptionState* exception_state) {
    SetPropertyValue(property_name, property_value, exception_state);
  }

  std::string RemoveProperty(const std::string& property_name,
                             script::ExceptionState* exception_state) {
    std::string retval = GetPropertyValue(property_name);
    if (!retval.empty()) {
      SetPropertyValue(property_name, "", exception_state);
    }
    return retval;
  }

  // The parent rule is the CSS rule that the CSS declaration block is
  // associated with, if any, or null otherwise.
  //   https://www.w3.org/TR/2013/WD-cssom-20131205/#css-declaration-block
  virtual scoped_refptr<CSSRule> parent_rule() const;

  DEFINE_WRAPPABLE_TYPE(CSSStyleDeclaration);

 protected:
  CSSStyleDeclaration() {}
  virtual ~CSSStyleDeclaration() {}

 private:
  virtual std::string GetDeclaredPropertyValueStringByKey(
      const PropertyKey key) const = 0;
  void SetPropertyValueStringByKey(PropertyKey key,
                                   const std::string& property_value,
                                   script::ExceptionState* exception_state);

  DISALLOW_COPY_AND_ASSIGN(CSSStyleDeclaration);
};

}  // namespace cssom
}  // namespace cobalt

#endif  // COBALT_CSSOM_CSS_STYLE_DECLARATION_H_
