module Lumberg
  module Cpanel
    # Public: This module provides access to file functions such as listing
    # directories and viewing files.
    class FileManager < Base
      def self.api_module; "Fileman"; end

      # Public: list files and attributes contained within a specified
      # directory
      #
      # options   - Hash options for API call params (default: {})
      #   :check_leaf - Boolean value of "1" will cause the function to add
      #                 "isleaf" parameter to the output key, e.g: true value
      #                 (1) indicates a directory that has no subdirectories
      #                 (default: '')
      #
      #   :directory - String directory that contains the files you wish to
      #                browse, and '/' represents your home directory.
      #                (default: 'your home directory')
      #
      #   :list - A Boolean value of "1" indicates the function to look for
      #           keys that begin with "filepath-*". These keys are used to
      #           indicate specific files to list (default: '')
      #
      #   :path - String parameter allows you to specify files you want listed
      #           with the output if :list is set to "1". This can be any
      #           number of parameters such as "filelist-A", "filelist-B", etc.
      #           Each of these keys indicate a file you wish to view
      #           (default:'')
      #
      #   :need_mime - A Boolean value of "1" indicates that you would like the
      #                function to add the 'mimename' and 'mimetype' to output
      #                (default: '')
      #
      #
      #   :show_dot_files - A Boolean value of "1" indicates that you'd like
      #                     the function to add dotfiles to output
      #                     (default: '')
      #
      #   :types - String filter allowing you to specify which file types you
      #            wish to view. Acceptable values include "dir", "file" and
      #            "special". Separate each type using a pipe (|) to add
      #            multiple values. (default: '')
      #
      # Examples
      #   api_args = { host: "x.x.x.x", hash: "pass", api_username: "user" }
      #   file_manager = Lumberg::Cpanel::FileManager.new(api_args.dup)
      #
      #   file_manager.list
      #
      # Returns Hash API response.
      def list(options = {})
        options[:dir]          = options.delete(:directory)
        options[:filelist]     = options.delete(:list)
        options[:filepath]     = options.delete(:path)
        options[:needmime]     = options.delete(:need_mime)
        options[:checkleaf]    = options.delete(:check_leaf)
        options[:showdotfiles] = options.delete(:show_dot_files)

        perform_request({ api_function: 'listfiles' }.merge(options))
      end

      # Public: View a file within your home directory. This function also
      # display additional information about the file such as the contents of a
      # tarball, a link to an image and more
      #
      # options - Hash options for API call params (default: {})
      #   :directory - String directory in which the file is located. Path must
      #                be relative to user's home, e.g: 'public_html/files/'
      #                (default: '')
      #   :file - String path to the file you wish to view
      #
      # Returns Hash API response.
      def show(options = {})
        options[:dir] = options.delete(:directory)

        perform_request({ api_function: 'viewfile' }.merge(options))
      end

      # Public: Retrieve information about specific files
      #
      # options - Hash options for API call params (default: {})
      #   :directory - String directory whose files you wish to review, (e.g:
      #                /home/user/public_html/files). (default: 'your home')
      #
      #   :file - String name of the file whose statistics you wish to review.
      #           You may define multiple files by separating each value with a
      #           pipe, e.g: 'file1|file2|file3'
      #
      # Returns Hash API response.
      def stat(options = {})
        options[:dir] = options.delete(:directory)

        perform_request({ api_function: 'statfiles' }.merge(options))
      end

      # Public: Retrieve disk usage statistics about your account.
      #
      # Returns Hash API response.
      def disk_usage
        perform_request({ api_function: 'getdiskinfo' })
      end

      # Public: Perform an operation on a file or group of files. You can use
      # this function to copy, move, rename, chmod, extract and compress, link
      # and unlink, and trash files and directories.
      #
      # options - Hash options for API call params (default: {})
      #   :name - String naming the operation to perform. Acceptable values
      #           include 'copy', 'move', 'rename', 'chmod', 'extract',
      #           'compress', 'link', 'unlink', and 'trash' (move to .trash
      #           directory)
      #   :source_files - String files on which you wish to perform the
      #                   operation. You can include multiple files by
      #                   separating each file with a comma (,). Do not add
      #                   spaces.
      #   :destination_files - String list of destination filenames. If
      #                        multiple sourcefiles are listed with multiple
      #                        destination files ('destfiles'), the function
      #                        attempts to handle each transaction on a 1-to-1
      #                        basis. If only 1 file is specified in
      #                        'sourcefiles', it will be moved, or copied, or
      #                        etc. to the first directory listed.
      #   :decode_uri - Boolean value. Entering '1' will cause the function to
      #                 decode the URI-encoded variables :source_files and
      #                 :destination_files
      #   :metadata - String parameter which contains any added values required
      #               by the named operation. When using 'compress', tihs would
      #               be the archive type. Acceptable values for the compress
      #               operation include: tar, gz, bz2, zip, tar.gz and tar.bz2.
      #               The chmod operation requires octal octal permissions like
      #               0755 or 0700.
      #
      # Returns Hash API response
      def operate(options={})
        options[:op] = options.delete(:name)
        options[:doubledecode] = options.delete(:decode_uri)
        options[:sourcefiles] = options.delete(:source_files)
        options[:destfiles] = options.delete(:destination_files)

        perform_request({ api_function: "fileop" }.merge(options))
      end
    end
  end
end