class VideoSessionsController < ApplicationController
  before_filter :require_login
  before_filter :find_video_session_room, only: [:show, :update, :close]

  # To initialize video session
  def new
    @tutor = Tutor.find(params[:session][:tutor_id])
    if current_user.has_credit_card?
      if !@tutor.related_sessions.ongoing_sessions.exists? and !current_user.related_sessions.ongoing_sessions.exists? and @tutor.available_for_video? and @tutor.online?
        @available = true
        unless params[:session][:resource_id].blank?
          resource = params[:session][:resource_type].constantize.find(params[:session][:resource_id])
          ActsAsTenant.current_tenant.pusher_configuration.client["private-user-#{@tutor.id}"].trigger_async(
            'video-session-requested',
            user: {
              id: current_user.id,
              name: current_user.name,
              image: view_context.image_path(current_user.image_url(:medium))},
            resource_name: resource.name,
            resource_type: params[:session][:resource_type],
            resource_id: params[:session][:resource_id],
            accept_url: accept_video_sessions_path(user_id: current_user.id, resource_type: params[:session][:resource_type], resource_id: params[:session][:resource_id]),
            reject_url: reject_video_sessions_path(user_id: current_user.id, resource_type: params[:session][:resource_type], resource_id: params[:session][:resource_id])
          )
        end
      end
      respond_to do |format|
        format.html {render layout: false}
        format.js {}
      end
    else
      @user = current_user
      @user.credit_cards.build unless @user.credit_cards.exists?
      @redirect_url = request.url
      render 'settings/payment_details', layout: false
    end
  end

  # Method for tutor to accept the request for video session.
  def accept
    user = User.find(params[:user_id])
    resource = params[:resource_type].constantize.find(params[:resource_id])
    @tutoring_session = current_user.tutoring_sessions.build(
      user: user,
      resource: resource,
      start_time: Time.now,
      date: Date.today_in_time_zone,
      session_type: TutoringSession::TYPES.assoc('Video').last
    )
    @tutoring_session.save!
    @video_session_room = @tutoring_session.find_or_create_video_session_room
    ActsAsTenant.current_tenant.pusher_configuration.client["private-user-#{user.id}"].trigger_async('video-session-accepted-user', video_session_url: video_session_path(@video_session_room))
    ActsAsTenant.current_tenant.pusher_configuration.client["private-user-#{user.id}"].trigger_async('video-session-accepted-tutor', user_id: user.id, resource_id: params[:resource_id], resource_type: params[:resource_type])
    respond_to do |format|
      format.js
    end
  end

  # Method for tutor to reject the request for video session.
  def reject
    if params[:user_id]
      user = User.find(params[:user_id])
      tutor = current_user
    else
      user = current_user
      tutor = Tutor.find(params[:tutor_id])
    end
    data = {tutor_id: tutor.id, user_id: user.id, resource_id: params[:resource_id], resource_type: params[:resource_type], message: 'Your request for video session has been rejected by the tutor'}
    ActsAsTenant.current_tenant.pusher_configuration.client["private-user-#{user.id}"].trigger_async('video-session-request-rejected',  data)
    ActsAsTenant.current_tenant.pusher_configuration.client["private-user-#{tutor.id}"].trigger_async('video-session-request-rejected',  data)
    render nothing: true
  end

  # Shows the video session window.
  def show
    unless @video_session_room.closed?
      @conversation = ChatConversation.find_or_create_conversation_for(current_user, [@video_session_room.tutoring_session.other_user(current_user).id])
    end
    respond_to do |format|
      format.html {render layout: false}
      format.json {render json: @video_session_room.to_json(only: [], methods: [:canvas_data])}
    end
  end

  # To update video sessions.
  def update
    canvas = @video_session_room.canvas || @video_session_room.build_canvas
    canvas.data = params[:canvas_json]
    if canvas.save
      client = ActsAsTenant.current_tenant.pusher_configuration.client
      client["private-user-#{@video_session_room.tutoring_session.other_user(current_user).id}"].trigger_async('video_session_canvas_data', {action: 'reload'})
      render json: {status: 200}
    else
      render json: {status: 400, error: 'Unable to update canvas'}
    end
  end

  # It closes video session by student or by tutor.
  def close
    @video_session_room.close!
    @tutoring_session = @video_session_room.tutoring_session
    @tutoring_session.build_review unless @tutoring_session.review
    client = ActsAsTenant.current_tenant.pusher_configuration.client
    if current_user == @tutoring_session.tutor
      client["private-user-#{@tutoring_session.other_user(current_user).id}"].trigger_async('video_session_ended', {session_id: @tutoring_session.id, rating_url: rating_tutoring_session_path(@tutoring_session), message: "Video session has been closed by #{current_user.name}"})
    else
      client["private-user-#{@tutoring_session.other_user(current_user).id}"].trigger_async('video_session_ended', {session_id: @tutoring_session.id, message: "Video session has been closed by #{current_user.name}"})
    end
    respond_to do |format|
      format.js
      format.html {redirect_to dashboard_path, notice: 'Video Session has been closed successfully.'}
    end
  end

  private
  def find_video_session_room
    @video_session_room = current_user.video_session_rooms.where(closed: false).find(params[:id])
  end

end
