// Copyright 2014 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_DOM_DOM_TOKEN_LIST_H_
#define COBALT_DOM_DOM_TOKEN_LIST_H_

#include <string>
#include <vector>

#include "base/memory/ref_counted.h"
#include "base/optional.h"
#include "cobalt/base/token.h"
#include "cobalt/dom/element.h"
#include "cobalt/script/wrappable.h"

namespace cobalt {
namespace dom {

// The DOMTokenList interface represents a set of space-separated tokens.
//   https://www.w3.org/TR/dom/#domtokenlist
class DOMTokenList : public script::Wrappable {
 public:
  DOMTokenList(Element* element, const std::string& attr_name);

  // Web API: DOMTokenList
  //
  unsigned int length() const;

  base::Optional<std::string> Item(unsigned int index) const;
  bool Contains(const std::string& token) const;
  void Add(const std::vector<std::string>& tokens);
  void Remove(const std::vector<std::string>& tokens);
  bool Toggle(const std::string& token,
              const base::Optional<bool>& force = base::nullopt);
  std::string AnonymousStringifier() const;

  // Custom, not in any spec.

  // This is a variation of Contains that should only be called in cases where
  // the token has already been validated.
  bool ContainsValid(base::Token valid_token) const;

  // Returns a reference to the contained tokens for rapid iteration.
  const std::vector<base::Token>& GetTokens() const;

  // The associated element.
  Element* element() { return element_; }

  DEFINE_WRAPPABLE_TYPE(DOMTokenList);
  JSObjectType GetJSObjectType() override { return JSObjectType::kArray; }
  void TraceMembers(script::Tracer* tracer) override;

 private:
  ~DOMTokenList();

  // From the spec: DOMTokenList.
  //   https://www.w3.org/TR/dom/#concept-dtl-update
  void RunUpdateSteps() const;

  // Returns if a token is valid.
  bool IsTokenValid(const std::string& token) const;
  // Refreshes the cache if it is not up to date.
  void MaybeRefresh() const;

  // The associated element, it is guaranteed to outlive the dom token list.
  Element* element_;
  // Name of the associated attribute.
  std::string attr_name_;
  // Node generation of the element when tokens is updated.
  mutable uint32_t element_node_generation_;
  // Cached tokens.
  mutable std::vector<base::Token> tokens_;

  DISALLOW_COPY_AND_ASSIGN(DOMTokenList);
};

}  // namespace dom
}  // namespace cobalt

#endif  // COBALT_DOM_DOM_TOKEN_LIST_H_
