earlymarket/CoPosition

View on GitHub
app/admin/device_settings.rb

Summary

Maintainability
B
5 hrs
Test Coverage
ActiveAdmin.register_page "Device Settings" do
  BOOLEAN_HEADERS = %w(Flag On Off).freeze
  INTERVAL_TYPES = %w(distance time).freeze
  TIME_INTERVALS = %w(10 30 60 300 1800 3600 21600 86400).freeze
  DISTANCE_INTERVALS = %w(50 100 200 500 1000).freeze
  BATTERY_SAVING = %w(false true low high).freeze
  DELAY = [0, 5, 10, 30, 60, 360, 1440].freeze

  content do
    render "index", layout: "active_admin"
  end

  controller do
    def scoped_collection
      end_of_association_chain.active_devices
    end

    def index
      params[:booleans] = [
        { name: "Fogged", values: fogged_stats },
        { name: "Cloaked", values: cloaked_stats },
        { name: "Auto", values: active_stats },
        { name: "Smart", values: smart_stats }
      ]

      params[:interval_type] = interval_stats
      params[:time_interval] = time_stats
      params[:distance_interval] = distance_stats
      params[:battery_saver] = battery_stats
      params[:delay] = delay_stats
    end

    private

    def fogged_stats
      return { on: "n/a", off: "n/a" } if Device.active_devices.count.zero?

      {
        on: '%.2f %' % (num = Device.active_devices.where(fogged: true).count.to_f * 100 / Device.active_devices.count),
        off: '%.2f %' % (100 - num)
      }
    end

    def cloaked_stats
      return { on: "n/a", off: "n/a" } if Device.active_devices.count.zero?

      {
        on: '%.2f %' % (num = Device.active_devices.where(cloaked: true).count.to_f * 100 / Device.active_devices.count),
        off: '%.2f %' % (100 - num)
      }
    end

    def active_stats
      return { on: "n/a", off: "n/a" } if copo_mobile_devices.count.zero?

      {
        on: '%.2f %' % (
          num = copo_mobile_devices { |dev| dev.config.custom["active"].to_s == "true" }
            .size.to_f * 100 / copo_mobile_devices.count
        ),
        off: '%.2f %' % (100 - num)
      }
    end

    def smart_stats
      devices = copo_mobile_devices { |dev| !dev.config.custom["smartInterval"].nil? }
      return { on: "n/a", off: "n/a" } if devices.count.zero?

      {
        on: '%.2f %' % (
          num = devices
            .select { |dev| dev.config.custom["smartInterval"].to_s == "true" }
            .size.to_f * 100 / devices.count
        ),
        off: '%.2f %' % (100 - num)
      }
    end

    def interval_stats
      devices = copo_mobile_devices { |dev| !dev.config.custom["intervalType"].nil? }
      return ["n/a"] * INTERVAL_TYPES.size if devices.size.zero?

      INTERVAL_TYPES.map do |type|
        '%.2f %' % (
          devices
            .select { |dev| dev.config.custom["intervalType"].to_s == type }
            .size.to_f * 100 / devices.size
        )
      end
    end

    def time_stats
      devices = copo_mobile_devices { |dev| !dev.config.custom["timeInterval"].nil? }
      return ["n/a"] * TIME_INTERVALS.size if devices.size.zero?

      TIME_INTERVALS.map do |interval|
        '%.2f %' % (
          devices
            .select { |dev| dev.config.custom["timeInterval"].to_i == interval.to_i }
            .size.to_f * 100 / devices.size
        )
      end
    end

    def distance_stats
      devices = copo_mobile_devices { |dev| !dev.config.custom["distanceInterval"].nil? }
      return ["n/a"] * DISTANCE_INTERVALS.size if devices.size.zero?

      DISTANCE_INTERVALS.map do |interval|
        '%.2f %' % (
          devices
            .select { |dev| dev.config.custom["distanceInterval"].to_i == interval.to_i }
            .size.to_f * 100 / devices.size
        )
      end
    end

    def battery_stats
      devices = copo_mobile_devices { |dev| !dev.config.custom["batterySaving"].nil? }
      return ["n/a"] * BATTERY_SAVING.size if devices.size.zero?

      BATTERY_SAVING.map do |battery|
        '%.2f %' % (
          devices
            .select { |dev| dev.config.custom["batterySaving"].to_s == battery }
            .size.to_f * 100 / devices.size
        )
      end
    end

    def delay_stats
      return ["n/a"] * DELAY.size if Device.active_devices.count.zero?

      DELAY.map do |delay|
        '%.2f %' % (
          Device.active_devices.where(delayed: delay).count.to_f * 100 / Device.active_devices.count
        )
      end
    end

    def copo_mobile_devices
      @copo_mobile_devices ||= Device.active_devices.includes(:config)
        .select { |dev| dev.config && dev.config.custom && !dev.config.custom["active"].nil? }

      block_given? ? @copo_mobile_devices.select { |dev| yield dev } : @copo_mobile_devices
    end
  end
end