// 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.

#include "flutter/lib/ui/window/platform_message_response_dart_port.h"

#include <array>
#include <utility>

#include "flutter/common/task_runners.h"
#include "flutter/fml/make_copyable.h"
#include "flutter/fml/trace_event.h"
#include "third_party/dart/runtime/include/dart_native_api.h"
#include "third_party/tonic/converter/dart_converter.h"
#include "third_party/tonic/dart_state.h"
#include "third_party/tonic/logging/dart_invoke.h"
#include "third_party/tonic/typed_data/dart_byte_data.h"

namespace flutter {
namespace {
void FreeFinalizer(void* isolate_callback_data, void* peer) {
  free(peer);
}
}  // namespace

PlatformMessageResponseDartPort::PlatformMessageResponseDartPort(
    Dart_Port send_port,
    int64_t identifier,
    const std::string& channel)
    : send_port_(send_port), identifier_(identifier), channel_(channel) {
  FML_DCHECK(send_port != ILLEGAL_PORT);
}

void PlatformMessageResponseDartPort::Complete(
    std::unique_ptr<fml::Mapping> data) {
  is_complete_ = true;
  Dart_CObject response_identifier = {
      .type = Dart_CObject_kInt64,
  };
  response_identifier.value.as_int64 = identifier_;
  Dart_CObject response_data = {
      .type = Dart_CObject_kExternalTypedData,
  };
  // TODO(https://github.com/dart-lang/sdk/issues/49827): Move to kTypedData
  // when const values are accepted. Also consider using kExternalTypedData only
  // when the payload is >= 1KB.
  uint8_t* copy = static_cast<uint8_t*>(malloc(data->GetSize()));
  memcpy(copy, data->GetMapping(), data->GetSize());
  response_data.value.as_external_typed_data.type = Dart_TypedData_kUint8;
  response_data.value.as_external_typed_data.length = data->GetSize();
  response_data.value.as_external_typed_data.data = copy;
  response_data.value.as_external_typed_data.peer = copy;
  response_data.value.as_external_typed_data.callback = FreeFinalizer;

  std::array<Dart_CObject*, 2> response_values = {&response_identifier,
                                                  &response_data};

  Dart_CObject response = {
      .type = Dart_CObject_kArray,
  };
  response.value.as_array.length = response_values.size();
  response.value.as_array.values = response_values.data();

  bool did_send = Dart_PostCObject(send_port_, &response);
  FML_CHECK(did_send);
}

void PlatformMessageResponseDartPort::CompleteEmpty() {
  is_complete_ = true;
  Dart_CObject response = {
      .type = Dart_CObject_kNull,
  };
  bool did_send = Dart_PostCObject(send_port_, &response);
  FML_CHECK(did_send);
}

}  // namespace flutter
