#
require 'fileutils'
require 'chef-raketasks'
require 'git-version-bump'
# require 'git-version-bump/rake-tasks'

def current_version
  cookbook_metadata = File.read('metadata.rb').lines.select {|line| line.match?(/version '(.).(.).(.)'/) }
  Gem::Version.create(cookbook_metadata.first.split('\'')[1])
end

def bump_metadata(next_version)
  cookbook_metadata = File.read('metadata.rb')
  new_content = cookbook_metadata.gsub(current_version.version, next_version.version)

  File.open('metadata.rb', 'w') { |file| file.write(new_content) }
  GVB.tag_version(next_version)
end

task default: %i(
  begin_structure
  download_structure
  verify_structure
  clean_structure
  unpack_structure
  prepare_structure
  build_structure
  check_structure
  install_structure
  strip_structure
  end_structure
) do
  default_variable = "\nThis was the default plan\n\n"
  puts default_variable
end

task begin_structure: %i() do
  default_variable = "\nCeci est le plan de commencement\n\n"
  puts default_variable
  
  puts "cookbook_version = #{current_version}"
end

task download_structure: %i() do
  default_variable = "\nCeci est le plan de téléchargement\n\n"
  puts default_variable
end

task verify_structure: %i() do
  default_variable = "\nCeci est le plan de vérification\n\n"
  puts default_variable
end

task clean_structure: %i(clean) do
  default_variable = "\nCeci est le plan de nettoyage\n\n"
  puts default_variable
  FileUtils.rm_rf('vendor')
end

task unpack_structure: %i(package:cookbook package:inspec) do
  default_variable = "\nCeci est le plan de décompression\n\n"
  puts default_variable
end

task prepare_structure: %i(release:chefserver) do
  default_variable = "\nCeci est le plan de préparation\n\n"
  puts default_variable

  version = current_version.version.split('.')
  major_version = version[0]
  minor_version = version[1]
  patch_version = version[2]

  next_version = Gem::Version.create("#{major_version}.#{minor_version}.#{patch_version.to_i + 1}")
  bump_metadata(next_version)
end

task build_structure: %i(package:policyfile:install package:policyfile:pack) do
  default_variable = "\nCeci est le plan de construction\n\n"
  puts default_variable
end

task :check_structure do #check_structure: %i(test:integration:static) do
  default_variable = "\nCeci est le plan de controle\n\n"
  puts default_variable
end

task install_structure: %i(package:policyfile:update) do
  default_variable = "\nCeci est le plan de l'installation\n\n"
  puts default_variable
  system("chef push builder_unix")
  system("chef push builder_windows")
end

task strip_structure: %i() do
  default_variable = "\nCeci est le plan de finition\n\n"
  puts default_variable
end

task end_structure: %i(release:supermarket) do
  default_variable = "\nCeci est le plan de closure\n\n"
  puts default_variable
  
  next_version = current_version.bump
  bump_metadata(Gem::Version.create("#{next_version}.0"))
end

task :inspecting do
  system('inspec exec compliance/profiles/physical')
end

namespace :integration do
  task physical: %i(inspecting) do
    puts('chef-client')
    # system('chef-client')
  end
end
