// 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_SHELL_PLATFORM_COMMON_CPP_CLIENT_WRAPPER_TESTING_TEST_CODEC_EXTENSIONS_H_
#define FLUTTER_SHELL_PLATFORM_COMMON_CPP_CLIENT_WRAPPER_TESTING_TEST_CODEC_EXTENSIONS_H_

#include "flutter/shell/platform/common/cpp/client_wrapper/include/flutter/encodable_value.h"
#include "flutter/shell/platform/common/cpp/client_wrapper/include/flutter/standard_codec_serializer.h"

namespace flutter {

// A representation of a point, for custom type testing of a simple type.
class Point {
 public:
  Point(int x, int y) : x_(x), y_(y) {}
  ~Point() = default;

  int x() const { return x_; }
  int y() const { return y_; }

  bool operator==(const Point& other) const {
    return x_ == other.x_ && y_ == other.y_;
  }

 private:
  int x_;
  int y_;
};

// A typed binary data object with extra fields, for custom type testing of a
// variable-length type that includes types handled by the core standard codec.
class SomeData {
 public:
  SomeData(const std::string label, const std::vector<uint8_t>& data)
      : label_(label), data_(data) {}
  ~SomeData() = default;

  const std::string& label() const { return label_; }
  const std::vector<uint8_t>& data() const { return data_; }

 private:
  std::string label_;
  std::vector<uint8_t> data_;
};

// Codec extension for Point.
class PointExtensionSerializer : public StandardCodecSerializer {
 public:
  PointExtensionSerializer();
  virtual ~PointExtensionSerializer();

  static const PointExtensionSerializer& GetInstance();

  // |TestCodecSerializer|
  EncodableValue ReadValueOfType(uint8_t type,
                                 ByteStreamReader* stream) const override;

  // |TestCodecSerializer|
  void WriteValue(const EncodableValue& value,
                  ByteStreamWriter* stream) const override;

 private:
  static constexpr uint8_t kPointType = 128;
};

// Codec extension for SomeData.
class SomeDataExtensionSerializer : public StandardCodecSerializer {
 public:
  SomeDataExtensionSerializer();
  virtual ~SomeDataExtensionSerializer();

  static const SomeDataExtensionSerializer& GetInstance();

  // |TestCodecSerializer|
  EncodableValue ReadValueOfType(uint8_t type,
                                 ByteStreamReader* stream) const override;

  // |TestCodecSerializer|
  void WriteValue(const EncodableValue& value,
                  ByteStreamWriter* stream) const override;

 private:
  static constexpr uint8_t kSomeDataType = 129;
};

}  // namespace flutter

#endif  // FLUTTER_SHELL_PLATFORM_COMMON_CPP_CLIENT_WRAPPER_TESTING_TEST_CODEC_EXTENSIONS_H_
