# frozen_string_literal: true

class UserDatatable < AjaxDatatablesRails::ActiveRecord
  extend Forwardable

  def_delegator :@view, :dom_id
  def_delegator :@view, :show_roles
  def_delegator :@view, :admin_user_path
  def_delegator :@view, :edit_admin_user_path

  def initialize(params, opts = {})
    @view = opts[:view_context]
    super
  end

  def view_columns
    # Declare strings in this format: ModelName.column_name
    # or in aliased_join_table.column_name format
    @view_columns ||= {
      id:           { source: 'User.id', cond: :eq },
      confirmed_at: { source: 'User.confirmed_at', searchable: false },
      email:        { source: 'User.email' },
      name:         { source: 'User.name' },
      attended:     { source: 'attended_count', searchable: false },
      roles:        { source: 'Role.name' },
      actions:      { source: 'User.id', searchable: false, orderable: false }
    }
  end

  private

  def data
    records.map do |record|
      {
        id:           record.id,
        confirmed_at: record.confirmed_at,
        email:        record.email,
        name:         record.name,
        attended:     record.attended_count,
        roles:        record.roles.any? ? show_roles(record.get_roles) : 'None',
        view_url:     admin_user_path(record),
        edit_url:     edit_admin_user_path(record),
        DT_RowId:     dom_id(record)
      }
    end
  end

  # rubocop:disable Naming/AccessorMethodName
  def get_raw_records
    User.left_outer_joins(:registrations, :roles)
      .distinct
      .select("users.*, COUNT(CASE WHEN registrations.attended = 't' THEN 1 END) AS attended_count")
      .group('users.id')
  end
  # rubocop:enable Naming/AccessorMethodName

  # Workaround for jbox-web/ajax-datatables-rails#293
  def records_total_count
    fetch_records.unscope(:group, :select).count(:all)
  end

  # Workaround for jbox-web/ajax-datatables-rails#293
  def records_filtered_count
    filter_records(fetch_records).unscope(:group, :select).count(:all)
  end

  # ==== These methods represent the basic operations to perform on records
  # and feel free to override them

  # def filter_records(records)
  # end

  # def sort_records(records)
  # end

  # def paginate_records(records)
  # end

  # ==== Insert 'presenter'-like methods below if necessary
end
