require_relative './base_controller.rb'

class RailsPerformanceController < BaseController

  if RailsPerformance.enabled
    def index
      @datasource                = RP::DataSource.new(**prepare_query, type: :requests, klass: RP::Models::Record)
      db                         = @datasource.db

      @throughput_report         = RP::Reports::ThroughputReport.new(db)
      @throughput_report_data    = @throughput_report.data

      @response_time_report      = RP::Reports::ResponseTimeReport.new(db)
      @response_time_report_data = @response_time_report.data
    end

    def summary
      @datasource                = RP::DataSource.new(**prepare_query, type: :requests, klass: RP::Models::Record)
      db                         = @datasource.db

      @throughput_report         = RP::Reports::ThroughputReport.new(db)
      @throughput_report_data    = @throughput_report.data

      @response_time_report      = RP::Reports::ResponseTimeReport.new(db)
      @response_time_report_data = @response_time_report.data

      @report                    = RP::Reports::BreakdownReport.new(db, title: "Requests")
      @data                      = @report.data

      respond_to do |format|
        format.js {}
        format.any { render plain: "Doesn't open in new window. Wait until full page load." }
      end
    end

    def trace
      @record = RP::Models::Record.find_by(request_id: params[:id])
      @report = RP::Reports::TraceReport.new(request_id: params[:id])
      @data   = @report.data
      respond_to do |format|
        format.js {}
        format.any { render plain: "Doesn't open in new window. Wait until full page load." }
      end
    end

    def crashes
      @datasource   = RP::DataSource.new(**prepare_query({status_eq: 500}), type: :requests, klass: RP::Models::Record)
      db            = @datasource.db
      @report       = RP::Reports::CrashReport.new(db)
      @data         = @report.data
    end

    def requests
      @datasource = RP::DataSource.new(**prepare_query, type: :requests, klass: RP::Models::Record)
      db          = @datasource.db
      @report     = RP::Reports::RequestsReport.new(db, group: :controller_action_format, sort: :count)
      @data       = @report.data
    end

    def recent
      @datasource = RP::DataSource.new(**prepare_query, type: :requests, klass: RP::Models::Record)
      db          = @datasource.db
      @report     = RP::Reports::RecentRequestsReport.new(db)
      @data       = @report.data
    end

    def jobs
      @datasource                = RP::DataSource.new(**prepare_query, type: :jobs, klass: RP::Models::JobRecord)
      db                         = @datasource.db

      @throughput_report         = RP::Reports::ThroughputReport.new(db)
      @throughput_report_data    = @throughput_report.data

      @response_time_report      = RP::Reports::ResponseTimeReport.new(db)
      @response_time_report_data = @response_time_report.data

      @recent_report             = RP::Reports::RecentRequestsReport.new(db)
      @recent_report_data        = @recent_report.data(:jobs)
    end

    private

    def prepare_query(query = params)
      RP::Rails::QueryBuilder.compose_from(query)
    end
  end

end