module Barometer
  module WeatherService
    class WundergroundV1
      class Response
        class CurrentWeather
          def initialize(payload)
            @payload = payload
            @current = Barometer::Response::Current.new
          end

          def parse
            current.observed_at = observed_at, '%B %e, %l:%M %p %Z'
            current.stale_at = stale_at
            current.humidity = humidity
            current.condition = condition
            current.icon = icon
            current.temperature = temperature
            current.dew_point = dew_point
            current.wind_chill = wind_chill
            current.heat_index = heat_index
            current.wind = wind
            current.visibility = visibility
            current.pressure = pressure

            current
          end

          private

          attr_reader :payload, :current

          def units
            payload.units
          end

          def observed_at
            payload.fetch('local_time')
          end

          def stale_at
            return unless current.observed_at
            utc_observed_at = current.observed_at.utc
            Time.utc(
              utc_observed_at.year, utc_observed_at.month, utc_observed_at.day,
              utc_observed_at.hour + 1, 0, 0
            )
          end

          def humidity
            payload.fetch('relative_humidity')
          end

          def condition
            payload.fetch('weather')
          end

          def icon
            payload.fetch('icon')
          end

          def temperature
            [units, payload.fetch('temp_c'), payload.fetch('temp_f')]
          end

          def dew_point
            [units, payload.fetch('dewpoint_c'), payload.fetch('dewpoint_f')]
          end

          def wind_chill
            [units, payload.fetch('windchill_c'), payload.fetch('windchill_f')]
          end

          def heat_index
            [units, payload.fetch('heat_index_c'), payload.fetch('heat_index_f')]
          end

          def wind
            [:imperial, payload.fetch('wind_mph').to_i, payload.fetch('wind_degrees').to_i]
          end

          def visibility
            [units, payload.fetch('visibility_km'), payload.fetch('visibility_mi')]
          end

          def pressure
            [units, payload.fetch('pressure_mb'), payload.fetch('pressure_in')]
          end
        end
      end
    end
  end
end