// Copyright 2015 The Cobalt Authors. 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_MEDIA_RULE_H_
#define COBALT_CSSOM_CSS_MEDIA_RULE_H_

#include <string>

#include "base/basictypes.h"
#include "base/compiler_specific.h"
#include "base/memory/ref_counted.h"
#include "cobalt/cssom/css_condition_rule.h"
#include "cobalt/cssom/viewport_size.h"
#include "cobalt/math/size.h"
#include "cobalt/script/wrappable.h"

namespace cobalt {
namespace cssom {

class CSSRuleList;
class CSSRuleVisitor;
class CSSStyleSheet;
class MediaList;
class PropertyValue;

// The CSSMediaRule interface represents an @media at-rule.
//   https://www.w3.org/TR/cssom/#the-cssmediarule-interface
class CSSMediaRule : public CSSConditionRule {
 public:
  CSSMediaRule(const scoped_refptr<MediaList>& media_list,
               const scoped_refptr<CSSRuleList>& css_rule_list);

  // Web API: CSSRule
  Type type() const override { return kMediaRule; }
  std::string css_text(script::ExceptionState* exception_state) const override;
  void set_css_text(const std::string& css_text,
                    script::ExceptionState* exception_state) override;

  // Web API: CSSConditionRule
  std::string condition_text() override;
  void set_condition_text(const std::string& condition) override;

  // Web API: CSSMediaRule
  //
  // Returns a read-only, live object representing the CSS rules.
  const scoped_refptr<MediaList>& media() const;

  // Custom, not in any spec.
  //
  // From CSSRule.
  void Accept(CSSRuleVisitor* visitor) override;

  // Evaluates the condition expression and caches the resulting condition
  // value. Returns true if the cached condition value has changed.
  bool EvaluateConditionValueAndReturnIfChanged(
      const ViewportSize& viewport_size);

  // This method can be used to setup the parent style sheet.
  void AttachToCSSStyleSheet(CSSStyleSheet* style_sheet) override;

  CSSMediaRule* AsCSSMediaRule() override { return this; }

  DEFINE_WRAPPABLE_TYPE(CSSMediaRule);

 private:
  ~CSSMediaRule() override;

  scoped_refptr<MediaList> media_list_;

  DISALLOW_COPY_AND_ASSIGN(CSSMediaRule);
};

}  // namespace cssom
}  // namespace cobalt

#endif  // COBALT_CSSOM_CSS_MEDIA_RULE_H_
