/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef __FILES_HPP__
#define __FILES_HPP__

#include <grp.h>
#include <pwd.h>

#include <sys/stat.h>

#include <string>

#include <process/future.hpp>
#include <process/http.hpp>

#include <stout/format.hpp>
#include <stout/json.hpp>
#include <stout/nothing.hpp>
#include <stout/path.hpp>

namespace mesos {
namespace internal {

// Forward declarations.
class FilesProcess;


// Provides an abstraction for browsing and reading files via HTTP
// endpoints. A path (file or directory) may be "attached" to a name
// (similar to "mounting" a device) for subsequent browsing and
// reading of any files and directories it contains. The "mounting" of
// paths to names enables us to do a form of chrooting for better
// security and isolation of files.
class Files
{
public:
  Files();
  ~Files();

  // Returns the result of trying to attach the specified path
  // (directory or file) at the specified name.
  process::Future<Nothing> attach(
      const std::string& path,
      const std::string& name);

  // Removes the specified name.
  void detach(const std::string& name);

private:
  FilesProcess* process;
};


// Returns our JSON representation of a file or directory.
// The JSON contains all of the information one would find in ls -l.
// Example JSON:
// {
//   'path': '\/some\/file',
//   'mode': '-rwxrwxrwx',
//   'nlink': 5,
//   'uid': 'bmahler',
//   'gid': 'employee',
//   'size': 4096,           // Bytes.
//   'mtime': 1348258116,    // Unix timestamp.
// }
inline JSON::Object jsonFileInfo(const std::string& path,
                                 const struct stat& s)
{
  JSON::Object file;
  file.values["path"] = path;
  file.values["nlink"] = s.st_nlink;
  file.values["size"] = s.st_size;
  file.values["mtime"] = s.st_mtime;

  char filetype;
  if (S_ISREG(s.st_mode)) {
    filetype = '-';
  } else if (S_ISDIR(s.st_mode)) {
    filetype = 'd';
  } else if (S_ISCHR(s.st_mode)) {
    filetype = 'c';
  } else if (S_ISBLK(s.st_mode)) {
    filetype = 'b';
  } else if (S_ISFIFO(s.st_mode)) {
    filetype = 'p';
  } else if (S_ISLNK(s.st_mode)) {
    filetype = 'l';
  } else if (S_ISSOCK(s.st_mode)) {
    filetype = 's';
  } else {
    filetype = '-';
  }

  int owner = (s.st_mode & 0700) >> 6;
  int group = (s.st_mode & 0070) >> 3;
  int other = s.st_mode & 0007;

  file.values["mode"] = strings::format("%c%c%c%c%c%c%c%c%c%c",
      filetype,
      (owner & 0x4) ? 'r' : '-',
      (owner & 0x2) ? 'w' : '-',
      (owner & 0x1) ? 'x' : '-',
      (group & 0x4) ? 'r' : '-',
      (group & 0x2) ? 'w' : '-',
      (group & 0x1) ? 'x' : '-',
      (other & 0x4) ? 'r' : '-',
      (other & 0x2) ? 'w' : '-',
      (other & 0x1) ? 'x' : '-').get();

  passwd* p = getpwuid(s.st_uid);
  if (p != NULL) {
    file.values["uid"] = p->pw_name;
  } else {
    file.values["uid"] = stringify(s.st_uid);
  }

  struct group* g = getgrgid(s.st_gid);
  if (g != NULL) {
    file.values["gid"] = g->gr_name;
  } else {
    file.values["gid"] = stringify(s.st_gid);
  }

  return file;
}

} // namespace internal {
} // namespace mesos {

#endif // __FILES_HPP__
