// Copyright 2019 The Chromium OS 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 LIBIPP_IPP_FRAME_BUILDER_H_
#define LIBIPP_IPP_FRAME_BUILDER_H_

#include <cstdint>
#include <list>
#include <string>
#include <vector>

#include "ipp_base.h"
#include "ipp_frame.h"

namespace ipp {

// forward declarations
class Attribute;
class Collection;
class Package;

class FrameBuilder {
 public:
  // Constructor, both parameters must not be nullptr. |frame| is used as
  // internal buffer to store intermediate form of data to send. All spotted
  // issues are logged to |log| (by push_back()).
  FrameBuilder(FrameData* frame, std::vector<Log>* log)
      : frame_(frame), errors_(log) {}

  // Build a content of the frame from the given Package.
  void BuildFrameFromPackage(const Package* package);

  // Returns the current frame size in bytes. Call it after
  // BuildFrameFromPackage(...) to get the size of the output buffer.
  std::size_t GetFrameLength() const;

  // Write data to given buffer (use the method above to learn about required
  // size of the buffer).
  bool WriteFrameToBuffer(uint8_t* ptr);

 private:
  // Copy/move/assign constructors/operators are forbidden.
  FrameBuilder(const FrameBuilder&) = delete;
  FrameBuilder(FrameBuilder&&) = delete;
  FrameBuilder& operator=(const FrameBuilder&) = delete;
  FrameBuilder& operator=(FrameBuilder&&) = delete;

  // Method for adding entries to the log.
  void LogFrameBuilderError(const std::string& message);

  // Main functions for building a frame.
  void SaveGroup(const Collection* coll, std::list<TagNameValue>* data_chunks);
  void SaveCollection(const Collection* coll,
                      std::list<TagNameValue>* data_chunks);

  // Helpers for converting individual values to binary form.
  void SaveAttrValue(const Attribute* attr,
                     size_t index,
                     uint8_t* tag,
                     std::vector<uint8_t>* buf);

  // Write data to buffer (ptr is updated, whole list is written).
  bool WriteTNVsToBuffer(const std::list<TagNameValue>&, uint8_t** ptr);

  // Internal buffer.
  FrameData* frame_;

  // Internal log: all errors & warnings are logged here.
  std::vector<Log>* errors_;
};

}  // namespace ipp

#endif  //  LIBIPP_IPP_FRAME_BUILDER_H_
