require 'db/validators/run_list_array'

class ProperNamedTasksFormatValidator < ActiveModel::Validator

  # should be an array of hashes like:
  # {
  #   'name' => 'restart',
  #   'run_list' => [
  #     'role[restart_service]'
  #   ]
  # }
  def validate(record)
    unless record.named_tasks
      record.errors.add :named_tasks, "Tasks should not be nil"
      return
    end
    record.named_tasks.each do |named_task|
      check_name!(named_task, record)
      check_run_list!(named_task, record)
    end
  end

  private

  def check_name!(task, record)
    unless task.key?('name')
      record.errors.add :named_tasks, "One of tasks doesn't have a name"
    end
  end

  def check_run_list!(task, record)
    RunListArrayValidator.validate_list(task['run_list'])
  rescue Devops::Exception::ValidationError => e
    if e.body[:elements]
      wrong_elements = e.body[:elements]
      record.errors.add :named_tasks, "Invalid run list elements: '#{wrong_elements.join(', ')}' for task #{task['name']}."
    else
      record.errors.add :named_tasks, "Task #{task['name']} has invalid run list."
    end
  end

end
