// 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_GROUPING_RULE_H_
#define COBALT_CSSOM_CSS_GROUPING_RULE_H_

#include <string>

#include "base/basictypes.h"
#include "base/compiler_specific.h"
#include "base/memory/ref_counted.h"
#include "cobalt/cssom/css_rule.h"
#include "cobalt/script/wrappable.h"

namespace cobalt {
namespace cssom {

class CSSRuleList;
class CSSRuleVisitor;

// The CSSGroupingRule interface represents an at-rule that contains other rules
// nested inside itself.
//   https://www.w3.org/TR/cssom/#the-cssgroupingrule-interface
//   https://www.w3.org/TR/css3-conditional/#cssgroupingrule
class CSSGroupingRule : public CSSRule {
 public:
  explicit CSSGroupingRule(const scoped_refptr<CSSRuleList>& css_rule_list);

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

  // Inserts a new rule into the css rule list of the group. This Web API takes
  // a string as input and parses it into a rule.
  unsigned int InsertRule(const std::string& rule, unsigned int index);

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

  void SetIndex(int index) override;
  int IndexWidth() const override;

  // Sets the CSS rule list for the grouping rule.
  void set_css_rules(const scoped_refptr<CSSRuleList>& css_rule_list);

  DEFINE_WRAPPABLE_TYPE(CSSGroupingRule);

 protected:
  ~CSSGroupingRule() override;

 private:
  scoped_refptr<CSSRuleList> css_rule_list_;

  DISALLOW_COPY_AND_ASSIGN(CSSGroupingRule);
};

}  // namespace cssom
}  // namespace cobalt

#endif  // COBALT_CSSOM_CSS_GROUPING_RULE_H_
