/*
 * Copyright (C) 2020 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#pragma once

#include <android-base/logging.h>
#include <json/json.h>
#include <sys/socket.h>
#include <sys/types.h>

#include <algorithm>
#include <cstdint>
#include <map>
#include <memory>
#include <optional>
#include <string>

namespace cuttlefish {

/// Defines operations supported by allocd
enum class RequestType : uint16_t {
  Invalid = 0,       // Invalid Request
  ID,                // Allocate and return a new Session ID
  CreateInterface,   // Request to create new network interface
  DestroyInterface,  // Request to destroy a managed network interface
  StopSession,       // Request all resources within a session be released
  Shutdown,          // request allocd to shutdown and clean up all resources
};

/// Defines interface types supported by allocd
enum class IfaceType : uint16_t {
  Invalid = 0,  // an invalid interface
  mtap,         // mobile tap
  wtap,         // wireless tap
  etap,         // ethernet tap
  wbr,          // wireless bridge
  ebr           // ethernet bridge
};

enum class RequestStatus : uint16_t {
  Invalid = 0,  // Invalid status
  Pending,      // Request which has not been attempted
  Success,      // Request was satisfied
  Failure       // Request failed
};

/// Defines the format for allocd Request messages
struct RequestHeader {
  uint16_t version;  /// used to differentiate between allocd feature sets
  uint16_t len;      /// length in bytes of the message payload
};

/// Provides a wrapper around libjson's Reader to additionally log errors
class JsonRequestReader {
 public:
  JsonRequestReader() = default;

  ~JsonRequestReader() = default;

  std::optional<Json::Value> parse(std::string msg) {
    Json::Value ret;
    std::unique_ptr<Json::CharReader> reader(reader_builder.newCharReader());
    std::string errorMessage;
    if (!reader->parse(&*msg.begin(), &*msg.end(), &ret, &errorMessage)) {
      LOG(WARNING) << "Received invalid JSON object in input channel: "
                   << errorMessage;
      LOG(INFO) << "Invalid JSON: " << msg;
      return std::nullopt;
    }
    return ret;
  }

 private:
  Json::CharReaderBuilder reader_builder;
};

}  // namespace cuttlefish
