// Copyright 2014 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 "chromeos/ui/util.h"

#include <stdarg.h>
#include <sys/types.h>
#include <unistd.h>

#include <vector>

#include <base/command_line.h>
#include <base/files/file_path.h>
#include <base/files/file_util.h>
#include <base/logging.h>
#include <base/process/launch.h>

namespace chromeos {
namespace ui {
namespace util {

base::FilePath GetReparentedPath(const std::string& path,
                                 const base::FilePath& parent) {
  if (parent.empty())
    return base::FilePath(path);

  CHECK(!path.empty() && path[0] == '/');
  base::FilePath relative_path(path.substr(1));
  CHECK(!relative_path.IsAbsolute());
  return parent.Append(relative_path);
}

bool SetPermissions(const base::FilePath& path,
                    uid_t uid,
                    gid_t gid,
                    mode_t mode) {
  if (getuid() == 0) {
    if (chown(path.value().c_str(), uid, gid) != 0) {
      PLOG(ERROR) << "Couldn't chown " << path.value() << " to " << uid << ":"
                  << gid;
      return false;
    }
  }
  if (chmod(path.value().c_str(), mode) != 0) {
    PLOG(ERROR) << "Unable to chmod " << path.value() << " to " << std::oct
                << mode;
    return false;
  }
  return true;
}

bool EnsureDirectoryExists(const base::FilePath& path,
                           uid_t uid,
                           gid_t gid,
                           mode_t mode) {
  if (!base::DirectoryExists(path)) {
    // Remove the existing file or link if any.
    if (!base::DeleteFile(path, /*recursive=*/false)) {
      PLOG(ERROR) << "Unable to delete " << path.value();
      return false;
    }
    if (!base::CreateDirectory(path)) {
      PLOG(ERROR) << "Unable to create " << path.value();
      return false;
    }
  }
  return SetPermissions(path, uid, gid, mode);
}

bool Run(const char* command, const char* arg, ...) {
  // Extra parentheses because yay C++ most vexing parse.
  base::CommandLine cl((base::FilePath(command)));
  va_list list;
  va_start(list, arg);
  while (arg) {
    cl.AppendArg(const_cast<char*>(arg));
    arg = va_arg(list, char*);
  }
  va_end(list);

  std::string output;
  int exit_code = 0;
  if (!base::GetAppOutputWithExitCode(cl, &output, &exit_code)) {
    LOG(WARNING) << "\"" << cl.GetCommandLineString() << "\" failed with "
                 << exit_code << ": " << output;
    return false;
  }

  return true;
}

}  // namespace util
}  // namespace ui
}  // namespace chromeos
