# frozen_string_literal: true

require 'tempfile'

module Dpl
  class Zip < Struct.new(:src, :dest, :opts)
    ZIP_EXT = %w[.zip .jar].freeze

    def initialize(*)
      require 'zip'
      super
    end

    def zip
      if zip_file?
        File.new(src)
      elsif dir?
        zip_dir
      else
        zip_file
      end
    end

    def zip_dir
      create(Dir.glob(*glob).reject { |path| dir?(path) })
    end

    def zip_file
      create([src])
    end

    def create(files)
      ::Zip::File.open(dest, ::Zip::File::CREATE) do |zip|
        files.each do |file|
          zip.add(file.sub("#{src}/", ''), file)
        end
      end
      File.new(dest)
    end

    def zip_file?
      exts.include?(File.extname(src))
    end

    def dir?(path = src)
      File.directory?(path)
    end

    def copy
      FileUtils.cp(src, dest)
    end

    def glob
      glob = ["#{src}/**/*"]
      glob << File::FNM_DOTMATCH if dot_match?
      glob
    end

    def dot_match?
      opts[:dot_match]
    end

    def exts
      opts[:exts] ||= ZIP_EXT
    end

    def opts
      super || {}
    end
  end
end