class Favorite < ApplicationRecord
  belongs_to :user
  belongs_to :travel

  has_one :event, as: :resource, dependent: :destroy

  validates :user_id, uniqueness: { scope: :travel_id }

  validate :validate_travel_readable

  after_create_commit :create_event!

  ##
  # Devuelve si el favorito puede ser accedido por un determinado usuario.
  #
  delegate :readable?, to: :travel

  private

  ##
  # Valida si el favorito puede ser accedido por un determinado usuario.
  #
  def validate_travel_readable
    return if readable?(user)

    errors.add(:user_id, :unauthorized_travel)
  end

  ##
  # Crea el evento de la creación del favorito.
  #
  def create_event!
    noficable_user = travel.user unless travel.user == user

    EventCreationJob.new.perform(
      source: user,
      resource: self,
      notify_to: noficable_user
    )
  end
end
