// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef FLUTTER_LIB_UI_SEMANTICS_STRING_ATTRIBUTE_H_
#define FLUTTER_LIB_UI_SEMANTICS_STRING_ATTRIBUTE_H_

#include "flutter/lib/ui/dart_wrapper.h"
#include "third_party/tonic/dart_library_natives.h"

namespace flutter {

struct StringAttribute;

using StringAttributePtr = std::shared_ptr<flutter::StringAttribute>;
using StringAttributes = std::vector<StringAttributePtr>;

// When adding a new StringAttributeType, the classes in these file must be
// updated as well.
//  * engine/src/flutter/lib/ui/semantics.dart
//  * engine/src/flutter/lib/web_ui/lib/src/ui/semantics.dart
//  * engine/src/flutter/shell/platform/android/io/flutter/view/AccessibilityBridge.java

enum class StringAttributeType : int32_t {
  kSpellOut,
  kLocale,
};

//------------------------------------------------------------------------------
/// The c++ representation of the StringAttribute, this struct serves as an
/// abstract interface for the subclasses and should not be used directly.
struct StringAttribute {
  virtual ~StringAttribute() = default;
  int32_t start = -1;
  int32_t end = -1;
  StringAttributeType type;
};

//------------------------------------------------------------------------------
/// Indicates the string needs to be spelled out character by character when the
/// assistive technologies announce the string.
struct SpellOutStringAttribute : StringAttribute {};

//------------------------------------------------------------------------------
/// Indicates the string needs to be treated as a specific language when the
/// assistive technologies announce the string.
struct LocaleStringAttribute : StringAttribute {
  std::string locale;
};

//------------------------------------------------------------------------------
/// The peer class for all of the StringAttribute subclasses in semantics.dart.
class NativeStringAttribute
    : public RefCountedDartWrappable<NativeStringAttribute> {
  DEFINE_WRAPPERTYPEINFO();
  FML_FRIEND_MAKE_REF_COUNTED(NativeStringAttribute);

 public:
  ~NativeStringAttribute() override;

  //----------------------------------------------------------------------------
  /// The init method for SpellOutStringAttribute constructor
  static void initSpellOutStringAttribute(Dart_Handle string_attribute_handle,
                                          int32_t start,
                                          int32_t end);

  //----------------------------------------------------------------------------
  /// The init method for LocaleStringAttribute constructor
  static void initLocaleStringAttribute(Dart_Handle string_attribute_handle,
                                        int32_t start,
                                        int32_t end,
                                        std::string locale);

  //----------------------------------------------------------------------------
  /// Returns the c++ representataion of StringAttribute.
  const StringAttributePtr GetAttribute() const;

  static void RegisterNatives(tonic::DartLibraryNatives* natives);

 private:
  NativeStringAttribute();
  StringAttributePtr attribute_;
};

}  // namespace flutter

#endif  // FLUTTER_LIB_UI_SEMANTICS_STRING_ATTRIBUTE_H_
