BathHacked/energy-sparks

View on GitHub
app/services/schools/advice_page_benchmarks/school_benchmark_generator.rb

Summary

Maintainability
A
0 mins
Test Coverage
module Schools
  module AdvicePageBenchmarks
    class SchoolBenchmarkGenerator
      def initialize(advice_page:, school:, aggregate_school:)
        @advice_page = advice_page
        @school = school
        @aggregate_school = aggregate_school
      end

      def self.can_benchmark?(advice_page:)
        generator_for_advice_page(advice_page: advice_page).present?
      end

      def self.generator_for(advice_page:, school:, aggregate_school:)
        generator_class = generator_for_advice_page(advice_page: advice_page)
        return nil unless generator_class.present?
        generator_class.new(advice_page: advice_page, school: school, aggregate_school: aggregate_school)
      end

      private_class_method def self.generator_for_advice_page(advice_page:)
        case advice_page.key.to_sym
        when :baseload
          BaseloadBenchmarkGenerator
        when :electricity_long_term, :gas_long_term
          LongTermUsageBenchmarkGenerator
        when :electricity_out_of_hours, :gas_out_of_hours
          OutOfHoursUsageBenchmarkGenerator
        when :electricity_intraday
          PeakUsageBenchmarkGenerator
        when :thermostatic_control
          ThermostaticControlBenchmarkGenerator
        when :heating_control
          HeatingControlBenchmarkGenerator
        end
      end

      def perform
        return nil unless school_has_fuel_type?
        begin
          benchmarked_as = benchmark_school
          @school_benchmark = @school.advice_page_school_benchmarks.find_or_create_by(advice_page: @advice_page)
          if benchmarked_as.nil?
            @school_benchmark.destroy
            return nil
          end
          @school_benchmark.update!(benchmarked_as: benchmarked_as)
          @school_benchmark
        rescue => e
          Rollbar.error(e, scope: :advice_page_benchmarks, school_id: @school.id, school: @school.name, advice_page: @advice_page.key)
        end
      end

      protected

      def school_has_fuel_type?
        @advice_page.school_has_fuel_type?(@school)
      end

      def advice_page_fuel_type
        @advice_page.fuel_type&.to_sym
      end

      def benchmark_school
        nil
      end
    end
  end
end