class Card
  module Query
    # support the use of the card_references table in CQL
    class ReferenceQuery < AbstractQuery
      def table
        "card_references"
      end

      def table_prefix
        "cr"
      end

      def referer hash
        add_conditions :referer_id, hash
      end

      def referee hash
        add_conditions :referee_id, hash
      end

      def add_conditions outfield, hash
        add_reftype_condition hash[:reftype]
        add_outfield_condition outfield, hash[:card]
      end

      def add_outfield_condition outfield, outcard
        if outcard == "_none"
          non_outfield
        elsif (op_and_id = op_and_id_or_ids_from_val(outcard))
          outfield_id outfield, op_and_id
        else
          tie :card, outcard, from: outfield
        end
      end

      def non_outfield
        add_condition "#{fld :is_present} = 0"
      end

      def outfield_id outfield, op_and_id
        add_condition "#{fld(outfield)} #{op_and_id}"
      end

      def add_reftype_condition reftype
        return unless reftype.present?

        reftype = Array.wrap reftype
        operator = (reftype.size == 1 ? "=" : "IN")
        quoted_letters = reftype.map { |letter| "'#{letter}'" } * ", "
        add_condition "#{fld(:ref_type)} #{operator} (#{quoted_letters})"
      end
    end
  end
end
