// Copyright 2015 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 "fides/file_utils.h"

#include <fstream>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>

#include <base/files/file_enumerator.h>
#include <base/files/file_path.h>
#include <base/files/file_util.h>
#include <base/files/important_file_writer.h>

namespace fides {

namespace utils {

namespace {

std::vector<std::string> ListEntries(const std::string& path, int file_type) {
  std::vector<std::string> entries;
  base::FileEnumerator fe(base::FilePath(FILE_PATH_LITERAL(path)), false,
                          file_type);
  for (base::FilePath name = fe.Next(); !name.empty(); name = fe.Next())
    entries.push_back(name.BaseName().value());
  return entries;
}

}  // namespace

std::vector<std::string> ListFiles(const std::string& path) {
  return ListEntries(path, base::FileEnumerator::FILES);
}

std::vector<std::string> ListDirectories(const std::string& path) {
  return ListEntries(path, base::FileEnumerator::DIRECTORIES);
}

bool CreateDirectory(const std::string& path) {
  return CreateDirectory(base::FilePath(FILE_PATH_LITERAL(path)));
}

bool PathExists(const std::string& path) {
  return base::PathExists(base::FilePath(FILE_PATH_LITERAL(path)));
}

bool DeleteFile(const std::string& path) {
  return (unlink(path.c_str()) == 0 || errno == ENOENT);
}

bool ReadFile(const std::string& path,
              std::vector<uint8_t>* contents,
              size_t max_size) {
  std::string data;
  if (!base::ReadFileToString(base::FilePath(FILE_PATH_LITERAL(path)), &data,
                              max_size)) {
    return false;
  }
  if (contents)
    *contents = std::vector<uint8_t>(data.begin(), data.end());
  return true;
}

bool WriteFileAtomically(const std::string& path,
                         const uint8_t* data,
                         size_t size) {
  DCHECK_EQ(sizeof(char), sizeof(uint8_t));
  std::string out_data(reinterpret_cast<const char*>(data), size);
  return base::ImportantFileWriter::WriteFileAtomically(
      base::FilePath(FILE_PATH_LITERAL(path)), out_data);
}

}  // namespace utils

}  // namespace fides
