require "bard/git"
require "bard/command"
require "bard/github_pages"

module Bard::CLI::Deploy
  def self.included mod
    mod.class_eval do

      option :"skip-ci", type: :boolean
      option :"local-ci", type: :boolean
      option :clone, type: :boolean
      desc "deploy [TO=production]", "checks that current branch is a ff with master, checks with ci, merges into master, deploys to target, and then deletes branch."
      def deploy to=:production
        branch = Bard::Git.current_branch

        if branch == "master"
          if !Bard::Git.up_to_date_with_remote?(branch)
            run! "git push origin #{branch}:#{branch}"
          end
          invoke :ci, [branch], options.slice("local-ci") unless options["skip-ci"]

        else
          run! "git fetch origin master:master"

          unless Bard::Git.fast_forward_merge?("origin/master", branch)
            puts "The master branch has advanced. Attempting rebase..."
            run! "git rebase origin/master"
          end

          run! "git push -f origin #{branch}:#{branch}"

          invoke :ci, [branch], options.slice("local-ci") unless options["skip-ci"]

          run! "git push origin #{branch}:master"
          run! "git fetch origin master:master"
        end

        if `git remote` =~ /\bgithub\b/
          run! "git push github"
        end

        if options[:clone]
          config[to].run! "git clone git@github.com:botandrosedesign/#{project_name} #{config[to].path}", home: true
          invoke :master_key, [], from: "local", to: to
          config[to].run! "bin/setup && bard setup"
        else
          if config[to].github_pages
            Bard::GithubPages.new(self).deploy(config[to])
          else
            config[to].run! "git pull origin master && bin/setup"
          end
        end

        puts green("Deploy Succeeded")

        if branch != "master"
          puts "Deleting branch: #{branch}"
          run! "git push --delete origin #{branch}"

          if branch == Bard::Git.current_branch
            run! "git checkout master"
          end

          run! "git branch -D #{branch}"
        end

        ping to
      rescue Bard::Command::Error => e
        puts red("!!! ") + "Running command failed: #{yellow(e.message)}"
        exit 1
      end

    end
  end
end