# frozen_string_literal: true

Report.add_report("trust_level_growth") do |report|
  report.modes = [:stacked_chart]

  filters = %w[
    tl1_reached
    tl2_reached
    tl3_reached
    tl4_reached
  ]

  sql = <<~SQL
  SELECT
    date(created_at),
    (
      count(*) filter (WHERE previous_value::integer < 1 AND new_value = '1')
    )  as tl1_reached,
    (
      count(*) filter (WHERE previous_value::integer < 2 AND new_value = '2')
    )  as tl2_reached,
    (
      count(*) filter (WHERE previous_value::integer < 3  AND new_value = '3')
    )  as tl3_reached,
    (
      count(*) filter (WHERE previous_value::integer < 4  AND new_value = '4')
    )  as tl4_reached
  FROM user_histories
  WHERE (
    created_at >= '#{report.start_date}'
    AND created_at <= '#{report.end_date}'
  )
  AND (
    action = #{UserHistory.actions[:change_trust_level]}
    OR action = #{UserHistory.actions[:auto_trust_level_change]}
  )
  GROUP BY date(created_at)
  SQL

  data = Hash[ filters.collect { |x| [x, []] } ]

  builder = DB.build(sql)
  builder.query.each do |row|
    filters.each do |filter|
      data[filter] << {
        x: row.date.strftime("%Y-%m-%d"),
        y: row.instance_variable_get("@#{filter}")
      }
    end
  end

  tertiary = ColorScheme.hex_for_name('tertiary') || '0088cc'
  quaternary = ColorScheme.hex_for_name('quaternary') || 'e45735'

  requests = filters.map do |filter|
    color = report.rgba_color(quaternary)

    if filter == "tl1_reached"
      color = report.lighten_color(tertiary, 0.25)
    end
    if filter == "tl2_reached"
      color = report.rgba_color(tertiary)
    end
    if filter == "tl3_reached"
      color = report.lighten_color(quaternary, 0.25)
    end

    {
      req: filter,
      label: I18n.t("reports.trust_level_growth.xaxis.#{filter}"),
      color: color,
      data: data[filter]
    }
  end

  report.data = requests
end
