require 'deploy_rubygem/rubygem'
require 'deploy_rubygem/cookbook'
require 'deploy_rubygem/version'

module DeployRubygem
  def self.project_name
    'deploy_rubygem'
  end

  def self.self_project_options
    {
      project_name: project_name,
      git: 'git@github.com:JimboDragonGit/deploy_rubygem.git',
      chefrepo_git: 'git@github.com:JimboDragonGit/jimbodragon.git',
      binaries: %w(
        deploy_rubygem
        prepare_workstation
        test_deploy_rubygem
        deploy_jimbodragon
      ),
      dependencies: %w(
        deploy_rubygem
        jimbo_management_site
      ),
      path: DeployRubygem.deploy_rubygem_path,
      cookbooks: {
        jimbo_management_site: {
          chef_repo: DeployRubygem.chefrepo_path,
          git: 'git@github.com:JimboDragonGit/jimbo_management_site.git',
          kitchens: %w(base),
          profiles: %w(
            jimbodragon-accept
            jimbodragon-applications
            jimbodragon-deploy-context
            jimbodragon-environment
            jimbodragon-git/
            jimbodragon-linux-baseline
            jimbodragon-manual-push
            jimbodragon-push
            jimbodragon-services
            jimbodragon-users
            jimbodragon-workstation
          ),
          execute_profiles: %w(jimbodragon-accept),
          groups: %w(base)
        }
      }
    }
  end

  def self.self_deploy
    Rubygem.new(self_project_options).deploy
  end

  def self.deploy_jimbo_management_site
    self_project_options[:cookbooks].each do |cookbook_name, cookbook_options|
      Cookbook.new(cookbook_name, cookbook_options).deploy
    end
  end
  

  def self.deploy_rubygem_path
    File.join(ENV['HOME'], project_name)
  end
  

  def self.jimbo_management_site_path
    File.join(ENV['HOME'], 'jimbo_management_site')
  end

  def self.chefrepo_path
    "/usr/local/chef/repo/jimbodragon"
  end
  

  def self.change_to_directory(git_path, git_url)
    if not Dir.exist?(chefrepo_path)
      system("git clone #{git_url}")
    end
    Dir.chdir(git_path)
    git_path
  end

  def self.main
    DeployRubygem.change_to_directory(DeployRubygem.chefrepo_path, self_project_options[:chefrepo_git])
    DeployRubygem.change_to_directory(DeployRubygem.jimbo_management_site_path, self_project_options[:cookbooks][:jimbo_management_site][:git])
    DeployRubygem.change_to_directory(DeployRubygem.deploy_rubygem_path, self_project_options[:git])

    DeployRubygem.self_deploy
    DeployRubygem.deploy_jimbo_management_site
  end

  def self.rake_test
    File.delete('Gemfile.lock') if File.exist?('Gemfile.lock')
    system("bundle") || exit(100)
    system("rake") || exit(101)
    system("rake build") || exit(102)
    system("rake install:local") || exit(103)
  end

  def self.rake_release
    git_commit
    system("rake install") || exit(104)
    system("rake release") || exit(105)
  end

  def self.git_commit
    system("git add .") || exit(106)
    system("git commit -m 'Self valifated for version #{GVB.version}'") || exit(107)
    system("git push") || exit(108)
  end

  def self.release
    DeployRubygem.change_to_directory(DeployRubygem.deploy_rubygem_path, self_project_options[:git])
    rake_test
    rake_release
  end

  def self.deploy_jimbodragon
    Dir.chdir(jimbo_management_site_path)
    system('sudo rm -rf /tmp/jimbodragon/; chef exec inspec exec compliance/profiles/jimbodragon-chef')
  end
end