# Generate statistics, around events, by date or place
class StatsController < ApplicationController
  has_scope :region, :tag
  has_scope :near, type: :hash, using: %i[location distance]

  before_action :set_events, :counts, :temporal, :local, only: [:index]

  private

  def counts
    @events_count = @events.count :all
    @events_um_count = apply_scopes(Event.unmoderated).count :all
    @orgas_count = apply_scopes(Orga).moderated.count :all
    @orgas_um_count = apply_scopes(Orga.unmoderated).count :all
  end

  def temporal
    @years = @events.group(year_grouping).count :all
    @months = @events.group(year_grouping, month_grouping).count :all
  end

  def local
    @region_events = @events.group(:region_id, year_grouping).count :all
    @regions = Region.all.find_all do |region|
      @years.sum { |year| @region_events[[region.id, year[0]]] || 0 }.positive?
    end
    @city_events = @events.group(:city).having('count(city) > 3')
                          .order('count(city) desc').count :all
  end

  def set_events
    # Remove the ordering which can occur after geocoding
    @events = apply_scopes(Event.moderated).reorder nil
  end

  def year_grouping
    if %w[Mysql2 MySQL PostgreSQL].include? Event.connection.adapter_name
      'extract(year from start_time)'
    elsif Event.connection.adapter_name == 'SQLite'
      'strftime("%Y", start_time)'
    end
  end

  def month_grouping
    if %w[Mysql2 MySQL PostgreSQL].include? Event.connection.adapter_name
      'extract(month from start_time)'
    elsif Event.connection.adapter_name == 'SQLite'
      'strftime("%m", start_time)'
    end
  end
end