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

#pragma once

#include <iostream>
#include <map>
#include <random>
#include "src/connectivity/overnet/lib/environment/trace_cout.h"
#include "src/connectivity/overnet/lib/packet_protocol/packet_protocol.h"
#include "src/connectivity/overnet/lib/testing/test_timer.h"
#include "src/connectivity/overnet/lib/vocabulary/closed_ptr.h"

namespace overnet {

class PacketProtocolFuzzer {
 public:
  PacketProtocolFuzzer(const PacketProtocol::Codec* codec, bool log_stuff)
      : logging_(log_stuff ? new Logging(&timer_) : nullptr), codec_(codec) {}
  ~PacketProtocolFuzzer() { done_ = true; }

  // Begin a send operation on the packet protocol.
  // Return true if the fuzzer should continue.
  bool BeginSend(uint8_t sender_idx, Slice data);

  // Finish one send operation.
  // Return true if the fuzzer should continue.
  bool CompleteSend(uint8_t sender_idx, uint8_t status);

  // Step time forward.
  // Return true if the fuzzer should continue.
  bool StepTime(uint64_t microseconds) {
    return timer_.Step(microseconds) &&
           timer_.Now().after_epoch() != TimeDelta::PositiveInf();
  }

 private:
  static constexpr inline uint32_t kMaxSegmentSize = 1500;

  class Sender final : public PacketProtocol::PacketSender {
   public:
    void SendPacket(SeqNum seq, LazySlice data) override;

    struct PendingSend {
      SeqNum seq;
      LazySlice data;
    };

    Optional<PendingSend> CompleteSend();

   private:
    std::map<uint64_t, PendingSend> pending_sends_;
    uint64_t next_send_id_ = 0;
  };

  // Retrieve Sender index 'idx'
  Optional<Sender*> sender(uint8_t idx);

  // Retrieve PacketProtocol index 'idx'
  Optional<PacketProtocol*> packet_protocol(uint8_t idx);

  bool done_ = false;
  TestTimer timer_;
  struct Logging {
    Logging(Timer* timer) : tracer(timer) {}
    TraceCout tracer;
    ScopedRenderer set_tracer{&tracer};
    ScopedSeverity set_severity{Severity::DEBUG};
  };
  std::unique_ptr<Logging> logging_;
  Sender sender1_;
  Sender sender2_;
  // PacketProtocol needs a random number generator for some timing data.
  // Create one here with a well known seed to keep things deterministic.
  std::mt19937 rng_{12345};
  const PacketProtocol::Codec* const codec_;
  ClosedPtr<PacketProtocol> pp1_ = MakeClosedPtr<PacketProtocol>(
      &timer_, [this] { return rng_(); }, &sender1_, codec_, kMaxSegmentSize);
  ClosedPtr<PacketProtocol> pp2_ = MakeClosedPtr<PacketProtocol>(
      &timer_, [this] { return rng_(); }, &sender2_, codec_, kMaxSegmentSize);
};

}  // namespace overnet
