namespace :katello do

desc "Migrate all APT repo content to match the deb_enable_structured_apt setting."
task :migrate_structure_content_for_deb => ['environment', 'dynflow:client', "check_ping"] do
  User.current = User.anonymous_api_admin # Set a user

  deb_enable_structured_apt = Setting['deb_enable_structured_apt']
  puts "'Enable structured APT for deb content' is currently set to '#{deb_enable_structured_apt}'!"
  if deb_enable_structured_apt
    puts "Enabling structured APT for existing deb type repos."
  else
    puts "Disabling structured APT for existing deb type repos."
  end

  found_repos_to_migrate = false
  roots = Katello::RootRepository.deb_type
  roots.each do |root|
    next if root.deb_using_structured_apt? == deb_enable_structured_apt
    found_repos_to_migrate = true
    puts "Migrating root repo '#{root.name}', id='#{root.id}'."

    # Ensure ensure_valid_deb_constraints won't prevent us from saving the root repo.
    unless root.ensure_valid_deb_constraints.blank?
      puts "Root repo '#{root.name}' (id='#{root.id}') violates deb constraints, setting url and deb_releases to nil!"
      root.url = nil
      root.deb_releases = nil
    end

    repos = root.repositories
    library_instance = root.library_instance
    if deb_enable_structured_apt
      if root.content_id != 'NEEDS_RE_MIGRATION'
        begin
          # Move the content_id from the root to the library instance so that ContentDestroy will destroy it!
          old_content_id = root.content_id
          library_instance.content_id = old_content_id
          library_instance.save!
          root.content_id = nil
          root.save!
          ForemanTasks.sync_task(::Actions::Katello::Product::ContentDestroy, root.library_instance)
          library_instance.content_id = nil
          library_instance.save!
        rescue
          root.content_id = old_content_id
          root.save!
          library_instance.content_id = nil
          library_instance.save!
          raise
        end
      end
      begin
        root.content_id = nil
        root.save!

        repos.each do |repo|
          if repo[:content_id].nil?
            content_create = ForemanTasks.sync_task(::Actions::Katello::Product::ContentCreate, repo)
            content_id = content_create.input[:content_id]
          else
            content_id = repo.content_id
          end
          content_view_environment = repo.content_view_environment
          if content_view_environment
            ForemanTasks.sync_task(::Actions::Candlepin::Environment::AddContentToEnvironment, :view_env_cp_id => content_view_environment.cp_id, :content_id => content_id)
          end
        end
      rescue
        root.content_id = 'NEEDS_RE_MIGRATION'
        root.save!
        raise
      end
    else
      library_instance_content_id = library_instance.content_id

      repos.each do |repo|
        next if repo.library_instance?

        content_view_environment = repo.content_view_environment
        if content_view_environment
          ForemanTasks.sync_task(::Actions::Candlepin::Environment::AddContentToEnvironment, :view_env_cp_id => content_view_environment.cp_id, :content_id => library_instance_content_id)
        end
        ForemanTasks.sync_task(::Actions::Katello::Product::ContentDestroy, repo)
        repo.content_id = nil
        repo.save!
      end

      root.content_id = library_instance_content_id
      library_instance.content_id = nil
      root.save!
      library_instance.save!
      ForemanTasks.sync_task(::Actions::Katello::Repository::Update, root, {})
      repos.each do |repo|
        ForemanTasks.sync_task(::Actions::Katello::Repository::MetadataGenerate, repo, force_publication: true)
      end
    end
    puts "Successfully migrated root repo '#{root.name}', id='#{root.id}'."
  end

  if found_repos_to_migrate
    puts "Successfully migrated all remaining repositories to be consistent with deb_enable_structured_apt='#{deb_enable_structured_apt}'!"
    puts "IMPORTANT: Any smart proxies serving deb content that was migrated must be re-synced!"
  else
    puts "Found no repositories that needed migrating. Everything is consistent with deb_enable_structured_apt='#{deb_enable_structured_apt}'!"
  end
end

end