require 'yaml'
require 'digest'

WOODPECKER_YML='.woodpecker.yml'
DOCKER_COMPOSE='compose.test.yml'

desc 'iniciar entorno'
task :up do
  compose('up', '--build', '-d')
end

desc 'poblar entorno'
task :init => [:up] do
  pecker = YAML.load_file(WOODPECKER_YML)
  pecker.dig('pipeline', 'tests', 'commands').grep(/install/).each do |cmd|
    compose('exec', 'app.dev', cmd)
  end
  compose('exec', 'app.dev', 'bash .dev/install_module.sh')
end

desc 'terminal'
task :sh do
  compose('exec', 'app.dev', 'bash')
end

desc 'iterar'
task :tdd do
  # cuando se realizan cambios sobre los modelos
  # que afectan las tablas es necesario limpiar el cache
  # de trytond
  if `which git`.then { $? }.success?
    changes = %x{git diff}.split("\n").grep(/^[-+]/)
    num = changes.grep(/fields/).length
    hash = Digest::MD5.hexdigest(changes.flatten.join(''))

    # touch
    File.open('.tdd_cache', 'a+').close

    File.open('.tdd_cache', 'r+') do |cache|
      tdd_cache = cache.read()

      if num > 0 && (tdd_cache != hash)
        compose('exec', 'app.dev', 'rm -f /tmp/*.dump')
        cache.seek(0); cache.write(hash)
      end
    end
  end

  compose('exec', 'app.dev', 'python3 -m unittest')
end

desc 'detener entorno'
task :down do
  compose('down')
end

desc 'entorno vivo'
namespace :live do

  desc 'iniciar entorno'
  task :up do
    compose('up', '--build', '-d', compose: 'compose.yml')
  end

  desc 'monitorear salida'
  task :tail do
    compose('logs', '-f', 'app.dev', compose: 'compose.yml')
  end

  desc 'detener entorno'
  task :down do
    compose('down', compose: 'compose.yml')
  end
end

def compose(*arg, compose: DOCKER_COMPOSE)
  sh "docker-compose -f #{compose} #{arg.join(' ')}"
end