class City < ApplicationRecord
  extend FriendlyId
  friendly_id :slug_candidates, use: :slugged
  belongs_to :country

  has_many :weather_arts, dependent: :destroy

  delegate :region, to: :country

  validates :name, presence: true
  validates :latitude, presence: true
  validates :longitude, presence: true

  delegate :region, to: :country

  scope :by_region, ->(region_id) { joins(:country).where(countries: { region_id: region_id }) }
  scope :by_country, ->(country_id) { where(country_id: country_id) }
  scope :active, -> { where(active: true) }

  def to_s
    name
  end

  def slug_candidates
    [
      :name,
      [ :country, :name ]
    ]
  end

  def localized_name
    I18n.t("cities.#{name.parameterize.underscore}")
  end

  def full_name
    "#{name}, #{country}"
  end

  def should_generate_new_friendly_id?
    name_changed? || super
  end

  def self.ransackable_associations(auth_object = nil)
    [ "weather_arts" ]
  end

  def self.ransackable_attributes(auth_object = nil)
    [ "active", "country", "created_at", "id", "id_value", "last_image_generation", "last_weather_fetch", "latitude", "longitude", "name", "priority", "region", "slug", "timezone", "updated_at" ]
  end

  def last_weather_fetch
    # latest_weather_art&.created_at
    Rails.cache.fetch("city/#{id}/last_weather_fetch", expires_in: 1.hour) do
      latest_weather_art&.created_at
    end
  end

  def last_image_generation
    # latest_weather_art&.image&.created_at
    Rails.cache.fetch("city/#{id}/last_image_generation", expires_in: 1.hour) do
      latest_weather_art&.image&.created_at
    end
  end

  def latest_weather_art
    weather_arts.order(weather_date: :desc).first
  end
end