#!/usr/bin/ruby.ruby1.8 
# encoding: utf-8

require 'git/gitlab'
require 'thor'

#
# Gitlab Commandline interface
#
class GitGitlabCLI < Thor

  attr_reader :gitlab

  def initialize(args, opts, config)
    @gitlab = GitlabKernel.new
    super(args, opts, config)
  end

  desc "merge SOURCE TARGET --assign ${ASSING}", "create mergerequest SOURCE to TARGET. assign to ${ASSING}"
  long_desc <<-LONGDESC
    [-l | --list] get all opened mergerequests
  LONGDESC
  option :assign
  option :list, :type => :boolean
  option :l , :type => :boolean
  def merge(source = nil, target = nil)
    show_all = lambda { |source, target, options|
      (source == nil && target == nil) ||
      options[:l] ||
      options[:list]
    }
    if show_all.call(source, target, options)
      mergerequests = @gitlab.mergerequests
      result = mergerequests.map { |m| "\##{m.iid}, #{m.title}" }.join("\n")
      puts(result)
      exit 0
    end

    title = source
    assign = options[:assign]
    begin
      url = if target == nil
        @gitlab.create_merge_request(title, assign, source)
      else
        @gitlab.create_merge_request(title, assign, source, target)
      end
    rescue GitlabApi::Error::MergeRequestError => e
      puts("Failed Create Merge Request")
      puts("Please check your command's argument ,options and already exists mergerequests...")
      puts(e.message)
      exit 1
    rescue GitlabApi::Error::ProjectIdNotFound => e
      puts(e.message)
      exit 1
    end
    puts("created mergerequest at")
    puts(url)
  end

  desc "issue ID", "show issue which has ID"
  option :all, :type => :boolean
  def issue(id = nil)
    if id == nil
      issues = @gitlab.issues(options[:all])
      result = issues.map { |i| "\##{i.iid}, #{i.title}" }.join("\n")
      puts(result)
      exit 0
    end
    begin
      issue = @gitlab.issue(id)
    rescue GitlabApi::Error::IssueNotFound => e
      puts("Could not find \##{id} issue!!")
      puts(e.message)
      exit 1
    rescue GitlabApi::Error::ProjectIdNotFound => e
      puts(e.message)
      exit 1
    end

    puts("\##{issue.iid}")
    puts("title      : #{issue.title}")
    puts("description: #{issue.description}")
    puts("label      : #{issue.labels.join(',')}")
    puts("state      : #{issue.state}")
    if issue.assignee != nil
      puts("assignee   : #{issue.assignee.username}")
    end
  end

  desc "review ID", "checkout mergerequest merged commit"
  def review(id)
    
    begin
      remote = @gitlab.remote
      mergerequest = @gitlab.mergerequest(id)
      
      repository = GitlabLocalRepository.new()
      repository.review("mergerequest/\##{id}" , mergerequest.source_branch, mergerequest.target_branch, remote)
      puts("When you finish code review,then")
      puts("  git merge --abort")
      puts("and")
      puts("  git checkout -")
    rescue GitlabApi::Error::MergeRequestError => e
      puts("Merege request is not found")
      puts(e.message)
      exit 1
    rescue GitlabApi::Error::ReviewError => e
      puts("Local Repository's status is invalided")
      puts("Check your repository's status")
      puts(e.message)
      exit 1
    end
  end

  def help
    user = @gitlab.authorize
    puts("You are #{user.username}")    
    puts("Gitlab is #{Gitlab.endpoint}")
    super
  end
end

GitGitlabCLI.start