/*
 * Copyright 2017 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_ACCESSIBILITY_INTERNAL_TEXT_ALTERNATIVE_HELPER_H_
#define COBALT_ACCESSIBILITY_INTERNAL_TEXT_ALTERNATIVE_HELPER_H_

#include <string>
#include <vector>

#include "base/hash_tables.h"
#include "cobalt/base/token.h"
#include "cobalt/dom/element.h"
#include "cobalt/dom/node.h"

namespace cobalt {
namespace accessibility {
namespace internal {

// Helper class for implementing the WAI-ARIA Text Alternative computation
// algorithm, made public for testing. This class should not be used directly.
class TextAlternativeHelper {
 public:
  TextAlternativeHelper() : in_labelled_by_(false) {}
  void AppendTextAlternative(const scoped_refptr<dom::Element>& element);

  // Return the accumulated alternatives joined by a single space character.
  std::string GetTextAlternative();

  // Append the text alternative from a aria-labelledby property. Returns true
  // if text alternative(s) were successfully appended.
  bool TryAppendFromLabelledBy(const scoped_refptr<dom::Element>& element);

  // Append the text alternative from a aria-label property. Returns true
  // if the aria-label property exists and has a non-empty value.
  bool TryAppendFromLabel(const scoped_refptr<dom::Element>& element);

  // Append the text alternative from an element's "alt" property, for element
  // types that support the semantics of the alt property. The only such element
  // in Cobalt is <img> elements.
  // Returns true if |element| is an element that supports the semantics of the
  // "alt" property, and has a non-empty value for the "alt" property.
  bool TryAppendFromAltProperty(const scoped_refptr<dom::Element>& element);

  // Append |text| to the accumulation of text alternative strings if it is not
  // empty. Returns true if text is non-empty.
  bool AppendTextIfNonEmpty(const std::string& text);

  // Returns true iff this element or one of its ancestors has the "aria-hidden"
  // attribute set to "true".
  static bool IsAriaHidden(const scoped_refptr<dom::Element>& element);

 private:
  typedef base::hash_set<base::Token> TokenSet;

  bool in_labelled_by_;
  std::vector<std::string> alternatives_;
  TokenSet visited_element_ids_;
};

}  // namespace internal
}  // namespace accessibility
}  // namespace cobalt

#endif  // COBALT_ACCESSIBILITY_INTERNAL_TEXT_ALTERNATIVE_HELPER_H_
