class Slot < ActiveRecord::Base
  include NotifyWith::NotificationAttachedObject

  belongs_to :reservation
  belongs_to :availability

  attr_accessor :is_reserved, :machine, :title, :can_modify, :is_reserved_by_current_user

  after_update :set_ex_start_end_dates_attrs, if: :dates_were_modified?
  after_update :notify_member_and_admin_slot_is_modified, if: :dates_were_modified?

  after_update :notify_member_and_admin_slot_is_canceled, if: :canceled?

  private
  def notify_member_and_admin_slot_is_modified
    NotificationCenter.call type: 'notify_member_slot_is_modified',
                            receiver: reservation.user,
                            attached_object: self
    NotificationCenter.call type: 'notify_admin_slot_is_modified',
                            receiver: User.admins,
                            attached_object: self
  end

  def notify_member_and_admin_slot_is_canceled
    NotificationCenter.call type: 'notify_member_slot_is_canceled',
                            receiver: reservation.user,
                            attached_object: self
    NotificationCenter.call type: 'notify_admin_slot_is_canceled',
                            receiver: User.admins,
                            attached_object: self
  end

  def can_be_modified?
    return false if (start_at - Time.now) / 1.day < 1
    return true
  end

  def dates_were_modified?
    start_at_changed? or end_at_changed?
  end

  def canceled?
    canceled_at_changed?
  end

  def set_ex_start_end_dates_attrs
    update_columns(ex_start_at: start_at_was, ex_end_at: end_at_was)
  end
end