# encoding: utf-8

module GithubCLI
  class Commands::Repositories < Command

    namespace :repo

    desc 'list', 'Lists all repositories'
    method_option :org, :type => :string, :aliases => ["-o"],
                  :desc => 'List repositories for <organization>',
                  :banner => '<organization>'
    method_option :user, :type => :string, :aliases => ["-u"],
                  :desc => 'List repositories for <user>',
                  :banner => '<user>'
    method_option :params, :type => :hash, :default => {}, :aliases => '-p',
                  :desc => 'Additonal request parameters e.i per_page:100'
    def list
      if options[:org]
        options[:params]['org'] = options[:org]
      elsif options[:user]
        options[:params]['user'] = options[:user]
      end
      Repository.all options[:params], options[:format]
    end

    desc 'get <user> <repo>', 'Get a repository'
    method_option :params, :type => :hash, :default => {}, :aliases => '-p',
                  :desc => 'Additonal request parameters e.i per_page:100'
    def get(user, repo)
      Repository.get user, repo, options[:params], options[:format]
    end

    desc 'create', 'Create a new repository for the authenticated user.'
    long_desc <<-DESC
      Create a new repository for the autheticated user.

      Parameters

        name - Required string \n
        description - Optional string \n
        homepage - Optional string \n
        private - Optional boolean - true to create a private repository, false to create a public one \n
        has_issues - Optional boolean - true to enable issues for this repository, false to disable them \n
        has_wiki - Optional boolean - true to enable the wiki for this repository, false to disable it. Default is true \n
        has_downloads Optional boolean - true to enable downloads for this repository \n
        org Optional string - The organisation in which this repository will be created \n
        team_id - Optional number - The id of the team that will be granted access to this repository. This is only valid when creating a repo in an organization \n
    DESC
    method_option :org, :type => :string, :aliases => ["-o"],
                  :desc => 'Create repository in <organization>',
                  :banner => '<organization>'
    method_option :params, :type => :hash, :default => {}, :aliases => '-p',
                  :desc => 'Additonal request parameters e.i per_page:100'
    def create
      if options[:org]
        options[:params]['org'] = options[:org]
      end
      Repository.create options[:params], options[:format]
    end

    desc 'edit <user> <repo>', 'Edit <repo> for an <user>.'
    long_desc <<-DESC
      Create a new repository for the autheticated user.

      Parameters

        name - Required string \n
        description - Optional string \n
        homepage - Optional string \n
        private - Optional boolean - true to create a private repository, false to create a public one \n
        has_issues - Optional boolean - true to enable issues for this repository, false to disable them \n
        has_wiki - Optional boolean - true to enable the wiki for this repository, false to disable it. Default is true \n
        has_downloads Optional boolean - true to enable downloads for this repository \n
    DESC
    method_option :params, :type => :hash, :default => {}, :aliases => '-p',
                  :desc => 'Additonal request parameters e.i per_page:100'
    def edit(user, repo)
      Repository.edit user, repo, options[:params], options[:format]
    end

    desc 'branches <user> <repo>', 'List branches'
    method_option :params, :type => :hash, :default => {}, :aliases => '-p',
                  :desc => 'Additonal request parameters e.i per_page:100'
    def branches(user, repo)
      Repository.branches user, repo, options[:params], options[:format]
    end

    desc 'contribs <user> <repo>', 'List contributors'
    method_option :params, :type => :hash, :default => {}, :aliases => '-p',
                  :desc => 'Additonal request parameters e.i per_page:100'
    def contribs(user, repo)
      Repository.contributors user, repo, options[:params], options[:format]
    end

    desc 'languages <user> <repo>', 'Listing all languages'
    method_option :params, :type => :hash, :default => {}, :aliases => '-p',
                  :desc => 'Additonal request parameters e.i per_page:100'
    def languages(user, repo)
      Repository.languages user, repo, options[:params], options[:format]
    end

    desc 'tags <user> <repo>', 'Listing all tags'
    method_option :params, :type => :hash, :default => {}, :aliases => '-p',
                  :desc => 'Additonal request parameters e.i per_page:100'
    def tags(user, repo)
      Repository.tags user, repo, options[:params], options[:format]
    end

    desc 'teams <user> <repo>', 'Listing all teams'
    method_option :params, :type => :hash, :default => {}, :aliases => '-p',
                  :desc => 'Additonal request parameters e.i per_page:100'
    def teams(user, repo)
      Repository.teams user, repo, options[:params], options[:format]
    end

  end # Repositories
end # GithubCLI