# frozen_string_literal: true

module Decidim
  module ActionDelegator
    class VotesCountAggregation
      def initialize(field, aliaz)
        @field = field
        @aliaz = aliaz
      end

      def to_sql
        int_field = cast(field, :integer)
        int_field = coalesce(int_field, 1)
        Arel::Nodes::Sum.new([int_field], aliaz).to_sql
      end

      private

      attr_reader :field, :aliaz

      # Returns the equivalent of `CAST ((<exprs>) AS <type>)` in Arel
      def cast(*exprs, type)
        Arel::Nodes::NamedFunction.new(
          "CAST",
          [Arel::Nodes::As.new(Arel::Nodes::Grouping.new(exprs), Arel.sql(type.to_s.upcase))]
        )
      end

      def coalesce(*exprs)
        Arel::Nodes::NamedFunction.new("COALESCE", exprs)
      end
    end
  end
end