# frozen_string_literal: true

module Compression
  class Pipeline < Strategy
    def initialize(strategies)
      @strategies = strategies
    end

    def extension
      @strategies.reduce('') { |ext, strategy| ext += strategy.extension }
    end

    def compress(path, target_name)
      current_target = target_name
      @strategies.reduce('') do |compressed_path, strategy|
        compressed_path = strategy.compress(path, current_target)
        current_target = compressed_path.split('/').last

        compressed_path
      end
    end

    def decompress(dest_path, compressed_file_path, max_size, allow_non_root_folder: false)
      @strategies.reverse.reduce(compressed_file_path) do |to_decompress, strategy|
        last_extension = strategy.extension
        strategy.decompress(dest_path, to_decompress, max_size, allow_non_root_folder: allow_non_root_folder)
        to_decompress.gsub(last_extension, '')
      end
    end
  end
end