// Copyright 2022 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.

#include "rgbkbd/keyboard_backlight_logger.h"

#include <stdint.h>
#include <string>

#include "base/files/file.h"
#include "base/files/file_path.h"
#include "base/files/file_util.h"
#include "base/logging.h"
#include "base/strings/strcat.h"

namespace rgbkbd {

KeyboardBacklightLogger::KeyboardBacklightLogger(const base::FilePath& path)
    : log_path_(path) {
  if (!InitializeFile()) {
    LOG(ERROR) << "Failed to initially create or open log file.";
  }
}

bool KeyboardBacklightLogger::SetKeyColor(uint32_t key,
                                          uint8_t r,
                                          uint8_t g,
                                          uint8_t b) {
  const std::string log = base::StrCat(
      {"RGB::SetKeyColor - ", std::to_string(key), ",", std::to_string(r), ",",
       std::to_string(g), ",", std::to_string(b)});
  return WriteLogEntry(log);
}

bool KeyboardBacklightLogger::SetAllKeyColors(uint8_t r, uint8_t g, uint8_t b) {
  const std::string log =
      base::StrCat({"RGB::SetAllKeyColors - ", std::to_string(r), ",",
                    std::to_string(g), ",", std::to_string(b)});
  return WriteLogEntry(log);
}

RgbKeyboardCapabilities KeyboardBacklightLogger::GetRgbKeyboardCapabilities() {
  return RgbKeyboardCapabilities::kFiveZone;
}

bool KeyboardBacklightLogger::InitializeFile() {
  // If the file exists, delete it to start fresh.
  base::DeleteFile(log_path_);

  // Create the file.
  file_ = std::make_unique<base::File>(
      log_path_,
      base::File::Flags::FLAG_WRITE | base::File::Flags::FLAG_CREATE_ALWAYS);

  if (!file_->IsValid()) {
    file_.reset();
    return false;
  }

  if (file_->Seek(base::File::Whence::FROM_END, 0) < 0) {
    LOG(ERROR) << "Failed to seek to end of log file.";
    file_.reset();
    return false;
  }

  return true;
}

bool KeyboardBacklightLogger::WriteLogEntry(const std::string& log) {
  if (!file_) {
    LOG(ERROR) << "Attempted to write log to a non-existant file.";
    return false;
  }

  // Add a new line between each log.
  const std::string to_write = base::StrCat({log, "\n"});

  const int len = to_write.length();
  return (len == file_->WriteAtCurrentPos(to_write.data(), len));
}

bool KeyboardBacklightLogger::ResetLog() {
  return InitializeFile();
}

}  // namespace rgbkbd
