require "thor"
require "zfs_mgmt"

class Snapshot < Thor
  class_option :noop, :type => :boolean, :default => false,
               :desc => 'pass -n option to zfs commands'
  class_option :verbose, :type => :boolean, :default => false,
               :desc => 'pass -v option to zfs commands'
  class_option :debug, :type => :boolean, :default => false,
               :desc => 'set logging level to debug'
  class_option :filter, :type => :string, :default => '.+',
               :desc => 'only act on zfs matching this regexp'
  desc "destroy", "apply the snapshot destroy policy to zfs"
  def destroy()
    ZfsMgmt.snapshot_destroy(noop: options[:noop], verbopt: options[:verbose], debugopt: options[:debug], filter: options[:filter])
  end
  desc "policy", "print the policy table for zfs"
  def policy()
    ZfsMgmt.snapshot_policy(verbopt: options[:verbose], debugopt: options[:debug], filter: options[:filter])
  end
  desc "create", "execute zfs snapshot based on zfs properties"
  def create()
    ZfsMgmt.snapshot_create(verbopt: options[:verbose], debugopt: options[:debug], filter: options[:filter])
  end
end

class ZfsMgr < Thor
  desc "zfsget [ZFS]", "execute zfs get for the given properties and types and parse the output into a nested hash"
  method_option :properties, :type => :array, :default => ['name'], :desc => "List of properties passed to zfs get"
  method_option :types,      :type => :array, :default => ['filesystem','volume'], enum: ['filesystem','volume','snapshot'], :desc => "list of types"
  def zfsget(zfs)
    pp ZfsMgmt.zfsget(properties: options[:properties],
                      types: options[:types],
                      zfs: zfs)
  end
  desc "snapshot SUBCOMMAND ...ARGS", "manage snapshots"
  subcommand "snapshot", Snapshot
end

ZfsMgr.start(ARGV)
