# frozen_string_literal: true

require "dragonfly_libvips/analysers/image_properties"
require "dragonfly_libvips/processors/encode"
require "dragonfly_libvips/processors/extract_area"
require "dragonfly_libvips/processors/rotate"
require "dragonfly_libvips/processors/thumb"

module DragonflyLibvips
  class Plugin
    def call(app, _opts = {})
      # Analysers
      app.add_analyser :image_properties, DragonflyLibvips::Analysers::ImageProperties.new

      %w[ width
          height
          xres
          yres
          format
      ].each do |name|
        app.add_analyser(name) { |c| c.analyse(:image_properties)[name] }
      end

      app.add_analyser(:aspect_ratio) { |c| c.analyse(:width).to_f / c.analyse(:height).to_f }
      app.add_analyser(:portrait) { |c| c.analyse(:aspect_ratio) < 1.0 }
      app.add_analyser(:landscape) { |c| !c.analyse(:portrait) }

      app.add_analyser(:image) do |c|
        c.analyse(:image_properties).key?("format")
      rescue ::Vips::Error
        false
      end

      # Aliases
      app.define(:portrait?) { portrait }
      app.define(:landscape?) { landscape }
      app.define(:image?) { image }

      # Processors
      app.add_processor :encode, Processors::Encode.new
      app.add_processor :extract_area, Processors::ExtractArea.new
      app.add_processor :thumb, Processors::Thumb.new
      app.add_processor :rotate, Processors::Rotate.new
    end
  end
end

Dragonfly::App.register_plugin(:libvips) { DragonflyLibvips::Plugin.new }