# frozen_string_literal: true

module Noticent
  module Definitions
    class Hooks
      VALID_STEPS = %i[pre_alert_registration post_alert_registration pre_channel_registration post_channel_registration pre_product_registration post_product_registration].freeze

      def add(step, klass)
        raise BadConfiguration, "invalid step. valid values are #{VALID_STEPS}" unless VALID_STEPS.include? step
        raise BadConfiguration, "hook #{klass} doesn't have a #{step} method" unless klass.respond_to? step

        storage[step] = [] if storage[step].nil?
        storage[step] << klass
      end

      def fetch(step)
        raise ::ArgumentError, "invalid step. valid values are #{VALID_STEPS}" unless VALID_STEPS.include? step

        storage[step]
      end

      def run(step, chan)
        chain = fetch(step)
        return if chain.nil?

        chain.each do |to_run|
          to_run.send(step, chan) if to_run.respond_to? step
        end
      end

      private

      def storage
        @storage ||= {}
      end
    end
  end
end