require 'earth/fuel/data_miner'
AutomobileMakeYear.class_eval do
  data_miner do
    process "Start from scratch" do
      delete_all
    end
    
    process "Ensure AutomobileMakeModelYearVariant and AutomobileMakeYearFleet are populated" do
      AutomobileMakeModelYearVariant.run_data_miner!
      AutomobileMakeYearFleet.run_data_miner!
    end
    
    process "Derive manufacturer names and years from automobile make model year variants" do
      ::Earth::Utils.insert_ignore(
        :src => AutomobileMakeModelYearVariant,
        :dest => AutomobileMakeYear,
        :cols => {
          [:make_name, :year] => :name,
          :make_name => :make_name,
          :year => :year
        }
      )
    end
    
    process "Calculate fuel efficiency and sales volume from make year fleets for makes with CAFE data" do
      make_years = arel_table
      year_fleets = AutomobileMakeYearFleet.arel_table
      conditional_relation = make_years[:make_name].eq(year_fleets[:make_name]).and(make_years[:year].eq(year_fleets[:year]))
      fuel_efficiency_relation = AutomobileMakeYearFleet.weighted_average_relation(:fuel_efficiency, :weighted_by => :volume).where(conditional_relation)
      volume_relation = year_fleets.project(year_fleets[:volume].sum).where(conditional_relation)
      update_all(%{
        fuel_efficiency = (#{fuel_efficiency_relation.to_sql}),
        fuel_efficiency_units = 'kilometres_per_litre',
        volume = (#{volume_relation.to_sql})
      })
    end
    
    process "Calculate fuel effeciency from automobile make model year variants for makes without CAFE data" do
      make_years = arel_table
      variants = AutomobileMakeModelYearVariant.arel_table
      conditional_relation = make_years[:make_name].eq(variants[:make_name]).and(make_years[:year].eq(variants[:year]))
      relation = variants.project(variants[:fuel_efficiency].average).where(conditional_relation)
      where(:fuel_efficiency => nil).update_all(%{
        fuel_efficiency = (#{relation.to_sql}),
        fuel_efficiency_units = 'kilometres_per_litre'
      })
    end
  end
end