require 'relish/commands/handle'

module Relish
  module Command
    class Projects < Base

      desc    'list your projects'
      command :default do
        puts format(resource['projects'].get(:accept => :json))
      end

      usage   'projects:add <publisher name>/<project name>'
      desc    'add a project',
              'append :private to make the project private',
              'example: relish projects:add rspec/rspec-core:private'
      command :add do
        puts resource['projects'].post(:handle => handle_to_add, :private => private?)
      end

      usage   'projects:remove <project>'
      desc    'remove a project'
      command :remove do
        puts resource[resource_url(handle_to_remove)].delete
      end

      usage   'projects:visibility <project>:<public or private>'
      desc    'set the status of a project',
              'example: relish projects:visibility rspec/rspec-core:private'
      command :visibility do
        puts resource[resource_url(handle_to_update)].put(
          :project => { :private => private? }
        )
      end

      usage   'projects:rename <project>:<new handle>'
      desc    "rename a project's handle",
              'example: relish projects:rename rspec/rspec-core:rspec-corez'
      command :rename do
        puts resource[resource_url(handle_to_update)].put(
          :project => { :handle => rename_handle }
        )
      end

    private

      def format(response)
        json_parse(response) do |hash|
          result = hash['project']['full_handle']
          result << " (private)" if hash['project']['private']
          result
        end
      end

      def handle_to_add
        handle || error(:project_blank)
      end
      alias_method :handle_to_update, :handle_to_add

      def handle_to_remove
        handle || project
      end

      def handle
        @param.without_option if @param
      end

      def rename_handle
        @param.has_option? ? @param.extract_option : error(:handle_blank)
      end

      def private?
        @param.extract_option == 'private'
      end

      def resource_url(handle)
        Commands::Handle.new(handle).resource_url
      end
    end
  end
end