module DownloadManager
  class ProcedureAttachmentsExport
    delegate :destination, to: :@queue

    attr_reader :queue
    attr_accessor :errors

    def initialize(procedure, attachments, destination)
      @procedure = procedure
      @errors = {}
      @queue = ParallelDownloadQueue.new(attachments, destination)
      @queue.on_error = proc do |attachment, path, error|
        errors[path] = [attachment, path]
        Rails.logger.error("Fail to download filename #{path} in procedure##{@procedure.id}, reason: #{error}")
      end
    end

    def download_all(attempt_left: 1)
      @queue.download_all
      if !errors.empty? && attempt_left.positive?
        retryable_queue = self.class.new(@procedure, errors.values, destination)
        retryable_queue.download_all(attempt_left: 0)
        retryable_queue.write_report if !retryable_queue.errors.empty?
      end
    end

    def write_report
      manifest_path = File.join(destination, '-LISTE-DES-FICHIERS-EN-ERREURS.txt')
      manifest_content = errors.map do |file_basename, _failed|
                                                      "Impossible de récupérer le fichier #{file_basename}"
                                                    end
        .join("\n")
      File.write(manifest_path, manifest_content)
    end
  end
end