# frozen_string_literal: true

# This is the new report template that use QueryBuilder to directly get the data from the DB
module Reporting
  class ReportQueryTemplate < ReportTemplate
    def report_query
      raise NotImplementedError
    end

    def report_data
      @report_data ||= report_query.raw_result
    end

    # ReportQueryTemplate work differently than standard reports
    # Here the query_result is already the expected result, so we just create
    # a fake columns method to copy the sql result into the row result
    def columns
      report_data.columns.to_h{ |field| [field.to_sym, proc { |data| data[field] }] }
    end

    def search
      visible_line_items_relation.ransack(ransack_params)
    end

    def query_result
      report_data.to_a
    end

    private

    def ransacked_line_items_relation
      search.result
    end

    def visible_orders_relation
      ::Permissions::Order.new(user).
        visible_orders.complete.not_state(:canceled).
        select(:id).distinct
    end

    def visible_line_items_relation
      ::Permissions::Order.new(user).
        visible_line_items.
        select(:id).distinct
    end

    def managed_orders_relation
      ::Enterprise.managed_by(user).select(:id).distinct
    end

    def i18n_scope
      "admin.reports"
    end
  end
end
