class TargetedUserLink < ApplicationRecord
  belongs_to :user, optional: true
  belongs_to :target_model, polymorphic: true, optional: false

  enum target_context: { avis: 'avis', invite: 'invite' }

  def invalid_signed_in_user?(signed_in_user)
    signed_in_user && signed_in_user.email != target_email
  end

  def target_email
    case target_context
    when 'avis'
      user.email
    when 'invite'
      invite = find_invite!
      invite.user&.email || invite.email
    else
      raise 'invalid target_context'
    end
  end

  def redirect_url(url_helper)
    case target_context
    when "invite"
      invite = find_invite!

      user = User.find_by(email: target_email)
      user&.active? ?
        url_helper.invite_path(invite) :
        url_helper.invite_path(invite, params: { email: invite.email })
    when "avis"
      avis = target_model
      avis.expert.user.active? ?
        url_helper.expert_avis_path(avis.procedure, avis) :
        url_helper.sign_up_expert_avis_path(avis.procedure, avis, email: avis.expert.email)
    end
  end

  private

  def find_invite!
    target_model || (fail ActiveRecord::RecordNotFound.new("Could not find Invite with id `#{target_model_id}`"))
  end
end