require 'big_keeper/command/spec/analyze'
require 'big_keeper/command/spec/list'
require 'big_keeper/command/spec/add'
require 'big_keeper/command/spec/delete'
require 'big_keeper/command/spec/search'
require 'big_keeper/command/spec/sync'
require 'big_keeper/util/leancloud_logger'

module BigKeeper

  def self.spec_command
    desc 'Spec operations'

    command :spec do |spec|
      spec.switch [:a,:all]
      spec.desc 'Analyze spec dependency infomation.'
      spec.command :analyze do |analyze|
        analyze.action do |global_options, options, args|
          LeanCloudLogger.instance.set_command("spec/analyze")

          path = File.expand_path(global_options[:path])
          is_all = options[:all]
          module_names = args
          spec_analyze(path, is_all, module_names)
        end
      end

      spec.desc 'List all the specs.'
      spec.command :list do | list |
        list.action do |global_options, options, args|
          LeanCloudLogger.instance.set_command("spec/list")

          path = File.expand_path(global_options[:path])
          version = global_options[:ver]
          user = global_options[:user].gsub(/[^0-9A-Za-z]/, '').downcase

          spec_list(path, user, options)
        end
      end

      spec.desc 'Sync Module dependency from Home.'
      spec.command :sync do | sync|
        sync.action do |global_options, options, args|
          LeanCloudLogger.instance.set_command("spec/sync")

          path = File.expand_path(global_options[:path])
          version = global_options[:ver]
          user = global_options[:user].gsub(/[^0-9A-Za-z]/, '').downcase
          module_name = args

          spec_sync(path, version, user, module_name)
        end
      end

      spec.desc 'Add a spec (Coming soon).'
      spec.command :add do |add|
        add.action do
          spec_add()
        end
      end

      spec.desc 'Delete a spec (Coming soon).'
      spec.command :delete do |delete|
        delete.action do
          spec_delete()
        end
      end

      spec.desc 'Search a spec with name (Coming soon).'
      spec.command :search do |search|
        search.action do
          spec_search()
        end
      end

    end
  end
end
