// Copyright 2023 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "parser.h"

#include <string>
#include <string_view>
#include <vector>

#include "errors.h"
#include "frame.h"
#include "ipp_frame.h"
#include "ipp_parser.h"

namespace ipp {

std::string_view ToStrView(ParserCode code) {
  switch (code) {
    case ParserCode::kBooleanValueOutOfRange:
      return "BooleanValueOutOfRange";
    case ParserCode::kValueMismatchTagConverted:
      return "ValueMismatchTagConverted";
    case ParserCode::kOutOfBandValueWithNonEmptyData:
      return "OutOfBandValueWithNonEmptyData";
    case ParserCode::kOutOfBandAttributeWithManyValues:
      return "OutOfBandAttributeWithManyValues";
    case ParserCode::kValueMismatchTagOmitted:
      return "ValueMismatchTagOmitted";
    case ParserCode::kUnsupportedValueTag:
      return "UnsupportedValueTag";
    case ParserCode::kValueInvalidSize:
      return "ValueInvalidSize";
    case ParserCode::kAttributeNoValues:
      return "AttributeNoValues";
    case ParserCode::kAttributeNameConflict:
      return "AttributeNameConflict";
    case ParserCode::kErrorWhenAddingAttribute:
      return "ErrorWhenAddingAttribute";
    case ParserCode::kErrorWhenAddingGroup:
      return "ErrorWhenAddingGroup";
    case ParserCode::kAttributeNameIsEmpty:
      return "AttributeNameIsEmpty";
    case ParserCode::kUnexpectedEndOfFrame:
      return "UnexpectedEndOfFrame";
    case ParserCode::kGroupTagWasExpected:
      return "GroupTagWasExpected";
    case ParserCode::kEmptyNameExpectedInTNV:
      return "EmptyNameExpectedInTNV";
    case ParserCode::kEmptyValueExpectedInTNV:
      return "EmptyValueExpectedInTNV";
    case ParserCode::kNegativeNameLengthInTNV:
      return "NegativeNameLengthInTNV";
    case ParserCode::kNegativeValueLengthInTNV:
      return "NegativeValueLengthInTNV";
    case ParserCode::kTNVWithUnexpectedValueTag:
      return "TNVWithUnexpectedValueTag";
    case ParserCode::kUnexpectedEndOfGroup:
      return "UnexpectedEndOfGroup";
    case ParserCode::kLimitOnCollectionsLevelExceeded:
      return "LimitOnCollectionsLevelExceeded";
    case ParserCode::kLimitOnGroupsCountExceeded:
      return "LimitOnGroupsCountExceeded";
  }
  return "UnknownParserCode";
}

std::string ToString(const ParserError& error) {
  std::string msg = error.path.AsString();
  msg += "; ";
  msg += ToStrView(error.code);
  return msg;
}

void SimpleParserLog::AddParserError(const ParserError& error) {
  const bool critical = IsCritical(error.code);
  if (errors_.size() < max_entries_count_) {
    errors_.emplace_back(error);
  }
  if (critical) {
    critical_errors_.emplace_back(error);
  }
}

Frame Parse(const uint8_t* buffer, size_t size, ParserLog& log) {
  Frame frame;
  if (buffer == nullptr) {
    size = 0;
  }
  FrameData frame_data;
  Parser parser(&frame_data, log);
  parser.ReadFrameFromBuffer(buffer, buffer + size);
  parser.SaveFrameToPackage(&frame);
  frame.VersionNumber() = static_cast<Version>(frame_data.version_);
  frame.OperationIdOrStatusCode() = frame_data.operation_id_or_status_code_;
  frame.RequestId() = frame_data.request_id_;
  return frame;
}

}  // namespace ipp
