#include "parse_text_proto.h"

#include <cstddef>
#include <cstdio>
#include <fstream>
#include <string>
#include <vector>

#include "absl/log/log.h"
#include "absl/strings/str_format.h"
#include "absl/strings/str_split.h"
#include "absl/strings/string_view.h"
#include "google/protobuf/io/tokenizer.h"

namespace safepower_agent {
namespace internal {

std::string ErrorCollectorString::ExtractLine(int line) const {
  std::vector<absl::string_view> lines = absl::StrSplit(text_proto_, '\n');
  return (static_cast<std::size_t>(line) < lines.size())
             ? std::string(lines[line])
             : "";
}

std::string ErrorCollectorFile::ExtractLine(int line) const {
  std::ifstream file(path_);
  std::string line_string;
  for (int i = 0; i <= line; ++i) {
    if (!file.good()) {
      return "";
    }
    std::getline(file, line_string);
    LOG(INFO) << "line: " << line_string;
  }
  return line_string;
}

void ErrorCollector::RecordError(int line, google::protobuf::io::ColumnNumber column,
                                 absl::string_view message) {
  absl::StrAppendFormat(&message_, "%s [line %d, column %d]\n%s", message,
                        line + 1, column + 1, ExtractLine(line));
}

void ErrorCollector::RecordWarning(int line, google::protobuf::io::ColumnNumber column,
                                   absl::string_view message) {
  LOG(WARNING) << message << " [line " << line + 1 << ", column " << column + 1
               << "]\n"
               << ExtractLine(line);
}

}  // namespace internal
}  // namespace safepower_agent
