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

#include "chrome/chrome_cleaner/logging/message_builder.h"

#include <utility>

#include "base/strings/string_number_conversions.h"
#include "base/strings/utf_string_conversions.h"

namespace chrome_cleaner {

MessageBuilder::MessageItem::MessageItem(base::StringPiece16 value)
    : value_(value.as_string()) {}

MessageBuilder::MessageItem::MessageItem(base::StringPiece value)
    : value_(base::UTF8ToUTF16(value.as_string())) {}

MessageBuilder::MessageItem::MessageItem(int value)
    : value_(base::IntToString16(value)) {}

MessageBuilder::ScopedIndent::ScopedIndent(MessageBuilder* builder)
    : builder_(builder) {
  builder_->IncreaseIdentationLevel();
}

MessageBuilder::ScopedIndent::ScopedIndent(
    MessageBuilder::ScopedIndent&& other) {
  operator=(std::move(other));  // Should call the move assignment operator.
}

MessageBuilder::ScopedIndent& MessageBuilder::ScopedIndent::operator=(
    MessageBuilder::ScopedIndent&& other) {
  std::swap(builder_, other.builder_);
  return *this;
}

MessageBuilder::ScopedIndent::~ScopedIndent() {
  builder_->DecreaseIdentationLevel();
}

void MessageBuilder::IncreaseIdentationLevel() {
  ++indentation_level_;
  if (!content_.empty() && content_.back() != L'\n')
    NewLine();
}

void MessageBuilder::DecreaseIdentationLevel() {
  DCHECK_GT(indentation_level_, 0);
  --indentation_level_;
  if (!content_.empty() && content_.back() != L'\n')
    NewLine();
}

MessageBuilder& MessageBuilder::NewLine() {
  content_ += L"\n";
  return *this;
}

void MessageBuilder::AddInternal(std::initializer_list<MessageItem> values) {
  for (auto value : values)
    content_ += value.value();
}

void MessageBuilder::IndentIfNewLine() {
  if (content_.empty() || content_.back() != L'\n')
    return;
  for (int i = 0; i < indentation_level_; ++i)
    content_ += L"\t";
}

MessageBuilder& MessageBuilder::AddHeaderLine(base::StringPiece16 title) {
  Add(title, L":").NewLine();
  return *this;
}

MessageBuilder::ScopedIndent MessageBuilder::Indent() {
  return MessageBuilder::ScopedIndent(this);
}

}  // namespace chrome_cleaner
