# frozen_string_literal: true

require "rom-sql"
require "hanami/model/associations/belongs_to"
require "hanami/model/associations/has_many"
require "hanami/model/associations/has_one"
require "hanami/model/associations/many_to_many"

module Hanami
  module Model
    # Association factory
    #
    # @since 0.7.0
    # @api private
    class Association
      # Instantiate an association
      #
      # @since 0.7.0
      # @api private
      def self.build(repository, target, subject)
        lookup(repository.root.associations[target])
          .new(repository, repository.root.name.to_sym, target, subject)
      end

      # Translate ROM SQL associations into Hanami::Model associations
      #
      # @since 0.7.0
      # @api private
      def self.lookup(association)
        case association
        when ROM::SQL::Association::ManyToMany
          Associations::ManyToMany
        when ROM::SQL::Association::OneToOne
          Associations::HasOne
        when ROM::SQL::Association::OneToMany
          Associations::HasMany
        when ROM::SQL::Association::ManyToOne
          Associations::BelongsTo
        else
          raise "Unsupported association: #{association}"
        end
      end
    end
  end
end
