module Middleman
  module Deploy
    module Strategies
      module Git
        class Base
          attr_accessor :branch, :build_dir, :remote, :commit_message, :user_name, :user_email

          def initialize(build_dir, remote, branch, commit_message)
            self.branch         = branch
            self.build_dir      = build_dir
            self.remote         = remote
            self.commit_message = commit_message
            self.user_name      = `git config --get user.name`
            self.user_email     = `git config --get user.email`
          end

          def process
            raise NotImplementedError
          end

          protected

          def add_signature_to_commit_message(base_message)
            signature = "#{Middleman::Deploy::PACKAGE} #{Middleman::Deploy::VERSION}"
            time      = "#{Time.now.utc}"

            "#{base_message} at #{time} by #{signature}"
          end

          def checkout_branch
            # if there is a branch with that name, switch to it, otherwise create a new one and switch to it
            if `git branch`.split("\n").any? { |b| b =~ /#{self.branch}/i }
              `git checkout #{self.branch}`
            else
              `git checkout -b #{self.branch}`
            end
          end

          def commit_branch(options = '')
            message = self.commit_message ? self.commit_message : add_signature_to_commit_message('[ci skip] Automated commit')

            run_or_fail("git add -A")
            run_or_fail("git commit --allow-empty -am \"#{message}\"")
            run_or_fail("git push #{options} origin #{self.branch}")
          end

          private
          def run_or_fail(command)
            system(command) || raise("ERROR running: #{command}")
          end
        end
      end
    end
  end
end
