// Copyright 2017 The Chromium 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 THIRD_PARTY_BLINK_RENDERER_PLATFORM_MOJO_NOTIFICATION_STRUCT_TRAITS_H_
#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_MOJO_NOTIFICATION_STRUCT_TRAITS_H_

#include "base/containers/span.h"
#include "mojo/public/cpp/bindings/array_traits_wtf_vector.h"
#include "mojo/public/cpp/bindings/string_traits_wtf.h"
#include "skia/public/interfaces/bitmap_skbitmap_struct_traits.h"
#include "third_party/blink/public/platform/modules/notifications/notification.mojom-blink.h"
#include "third_party/blink/public/platform/modules/notifications/web_notification_action.h"
#include "third_party/blink/renderer/platform/mojo/kurl_struct_traits.h"
#include "third_party/blink/renderer/platform/mojo/string16_mojom_traits.h"
#include "third_party/blink/renderer/platform/platform_export.h"
#include "third_party/blink/renderer/platform/weborigin/kurl.h"
#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
#include "third_party/skia/include/core/SkBitmap.h"

namespace mojo {

template <>
struct PLATFORM_EXPORT EnumTraits<blink::mojom::NotificationDirection,
                                  blink::WebNotificationData::Direction> {
  static blink::mojom::NotificationDirection ToMojom(
      blink::WebNotificationData::Direction input);

  static bool FromMojom(blink::mojom::NotificationDirection input,
                        blink::WebNotificationData::Direction* out);
};

template <>
struct PLATFORM_EXPORT EnumTraits<blink::mojom::NotificationActionType,
                                  blink::WebNotificationAction::Type> {
  static blink::mojom::NotificationActionType ToMojom(
      blink::WebNotificationAction::Type input);

  static bool FromMojom(blink::mojom::NotificationActionType input,
                        blink::WebNotificationAction::Type* out);
};

template <>
struct PLATFORM_EXPORT StructTraits<blink::mojom::NotificationActionDataView,
                                    blink::WebNotificationAction> {
  static blink::WebNotificationAction::Type type(
      const blink::WebNotificationAction& action) {
    return action.type;
  }

  static WTF::String action(const blink::WebNotificationAction&);

  static WTF::String title(const blink::WebNotificationAction&);

  static blink::KURL icon(const blink::WebNotificationAction&);

  static WTF::String placeholder(const blink::WebNotificationAction&);

  static bool Read(blink::mojom::NotificationActionDataView,
                   blink::WebNotificationAction* output);
};

template <>
struct PLATFORM_EXPORT StructTraits<blink::mojom::NotificationDataDataView,
                                    blink::WebNotificationData> {
  static WTF::String title(const blink::WebNotificationData&);

  static blink::WebNotificationData::Direction direction(
      const blink::WebNotificationData& data) {
    return data.direction;
  }

  static WTF::String lang(const blink::WebNotificationData&);

  static WTF::String body(const blink::WebNotificationData&);

  static WTF::String tag(const blink::WebNotificationData&);

  static blink::KURL image(const blink::WebNotificationData&);

  static blink::KURL icon(const blink::WebNotificationData&);

  static blink::KURL badge(const blink::WebNotificationData&);

  static base::span<const int32_t> vibration_pattern(
      const blink::WebNotificationData&);

  static double timestamp(const blink::WebNotificationData& data) {
    return data.timestamp;
  }

  static bool renotify(const blink::WebNotificationData& data) {
    return data.renotify;
  }

  static bool silent(const blink::WebNotificationData& data) {
    return data.silent;
  }

  static bool require_interaction(const blink::WebNotificationData& data) {
    return data.require_interaction;
  }

  static base::span<const int8_t> data(const blink::WebNotificationData&);

  static base::span<const blink::WebNotificationAction> actions(
      const blink::WebNotificationData&);

  static bool Read(blink::mojom::NotificationDataDataView,
                   blink::WebNotificationData* output);
};

}  // namespace mojo

#endif  // THIRD_PARTY_BLINK_RENDERER_PLATFORM_MOJO_NOTIFICATION_STRUCT_TRAITS_H_
