class Users::FavoritesController < ApplicationController
  before_filter :require_login
  before_filter :find_user, except: [:index, :accept, :reject]

  add_breadcrumb 'Dashboard', :dashboard_path

  # To mark as friend.
  def mark
    current_user.mark_favorite(@user)
    pusher_data = {user: {id: @user.id, full_name: @user.full_name, type: @user.type, image: self.class.helpers.image_path(@user.image_url(:thumb)), common_group_ids: current_user.groups.where(id: @user.groups).pluck(:id)}}
    if @user.tutor?
      pusher_data[:user].merge!(in_person_session_url: new_tutor_tutoring_session_path(@user)) if @user.available_for_in_person?
      pusher_data[:user].merge!(video_session_url: new_video_session_path(session: {tutor_id: @user.id})) if @user.available_for_video?
    end
    pusher_data[:user].merge!(unfriend_url: unmark_user_favorites_path(@user.id)) if current_user.is_favorite_users?(@user)
    pusher_data[:user].merge!(friend_url: mark_user_favorites_path(@user.id)) if !current_user.is_favorite_users?(@user)
  end

  # To unfriend the friend.
  def unmark
    current_user.unmark_favorite(@user)
    ActsAsTenant.current_tenant.pusher_configuration.client.trigger_async("private-user-#{current_user.id}", 'remove-from-favorite', {id: @user.id, name: @user.name, type: @user.type, image: self.class.helpers.image_path(@user.image_url(:thumb)), common_group_ids: current_user.groups.where(id: @user.groups).pluck(:id)})
  end

  # List all the friends.
  def index
    add_breadcrumb 'Favorites'
    @favorites = current_user.friends.includes(:profile_image)
    if params[:query].present?
      @favorites = @favorites.where("LOWER(name) Like :query OR LOWER(email) LIKE :query", query: "%#{params[:query]}%").where.not(email: current_user.email)
    end
    @favorites = @favorites.page(params[:page]).per(20)
    respond_to do |format|
      format.html
      format.json do
        render json: @favorites.as_json(only: [:id, :email], methods: [:name_with_email])
      end
    end
  end

  # To accept the friend request
  def accept
    @friend =  ActsAsFriendable::Friendship.find(params[:user_id])
    @friend.update(approved: true)
    FriendMailer.delay(queue: :mailer).friendship_request_status_email(@friend.id)
    respond_to do |format|
      format.js {render 'accept'}
    end
  end

  # To reject the friend request
  def reject
    @friend = ActsAsFriendable::Friendship.find(params[:user_id])
    @friend.update(approved: false)
    ActsAsTenant.current_tenant.pusher_configuration.client.trigger_async("private-user-#{@friend.user_id}", 'friendship-rejected', {id: @friend.friend_id, common_group_ids: current_user.groups.where(id: @friend.friend.groups).pluck(:id)})
    current_user.unmark_favorite(@friend.user)
    FriendMailer.delay(queue: :mailer).friendship_request_status_email(@friend)
    respond_to do |format|
      format.js {render 'reject'}
    end
  end

  private
  def find_user
    @user = User.find(params[:user_id])
  end
end
