class Tutors::TutoringSessionsController < ApplicationController
  before_filter :require_login, except: [:new, :reject]
  before_filter :require_tutor, only: [:respond, :create, :confirm, :accept_video_session]
  before_filter :find_tutor, only: [:new, :create, :video_session_request]

  # Intitalize the object for new tutoring session.
  def new
    if params[:start_time] and params[:end_time]
      @tutoring_session = @tutor.tutoring_sessions.new(start_time: params[:start_time], end_time: params[:end_time], date: params[:start_time].to_date)
    else
      @tutoring_session = @tutor.tutoring_sessions.new(tutoring_session_params)
    end
    @tutoring_session.attachments.build unless @tutoring_session.attachments.exists?
    if params[:resource_type]
      @tutoring_session.resource_id = params[:resource_id]
      @tutoring_session.resource_type = params[:resource_type]
    end
    render layout: false
  end

  # Create tutoring session.
  def create
    @tutoring_session = @tutor.tutoring_sessions.new(tutoring_session_params)
    respond_to do |format|
      format.js do
        if save!
          render 'create'
        else
          render partial: 'tutoring_sessions/form', locals: {tutoring_session: @tutoring_session}, replace: 'form#new_tutoring_session'
        end
      end
    end
  end

  # Retrieves all tutoring sessions for current tutor.
  def show
    @tutor = current_user
    @tutoring_session = @tutor.tutoring_sessions.find(params[:id])
    @invoice = @tutoring_session.invoice
  end

  # To find tutoring session of current user
  def respond
    @tutor = current_user
    @tutoring_session = @tutor.tutoring_sessions.find(params[:id])
    render layout: false
  end

  # Confirm the request for tutoring session.
  def confirm
    tutoring_session = current_user.tutoring_sessions.find(params[:id])
    unless tutoring_session.confirmed?
      unless tutoring_session.confirm!(params[:message])
        return redirect_via_turbolinks_to dashboard_path, alert: "Could not confirm Appointment. Cannot charge card."
      end
      TutoringSessionsMailer.delay(queue: :mailer).confirmed_email_student(tutoring_session.id)
      redirect_to dashboard_path, notice: "Session Confirmed"
    else
      redirect_to dashboard_path, alert: "This session has already been confirmed by you."
    end
  end

  # reject the request for tutoring session.
  def reject
    tutoring_session = current_user.tutoring_sessions.find(params[:id])
    unless tutoring_session.rejected?
      if tutoring_session.reject!(params[:message] , current_user)
         tutoring_session.invoice.destroy_schedule
        notice = "Session cancelled"
      else
        notice = "Could not cancel this session."
      end
      redirect_to dashboard_path, notice: notice
    else
      redirect_to dashboard_path, alert: "This Session is already in rejected state."
    end
  end

  private
  def find_tutor
    @tutor = Tutor.find(params[:tutor_id])
  end

  def save!
    if logged_in? and current_user.has_credit_card?
      if @tutoring_session.save
        TutoringSessionsMailer.delay(queue: :mailer).create_email(@tutoring_session.id)
      end
    else
      @tutoring_session.valid?
      @tutoring_session.errors.delete(:user_id)
      unless @tutoring_session.errors.any?
        session[:tutoring_session] = tutoring_session_params.merge(tutor_id: @tutor.id)
        if logged_in?
          @user = current_user
          @user.credit_cards.build unless @user.credit_cards.exists?
        end
        true
      end
    end
  end

  def tutoring_session_params
    permitted_params = params.required(:tutoring_session).permit(:start, :end, :date, :category_id, :on_site, :location, :resource_id, :resource_type, :message, attachments_attributes: [:attachment, :id, :_destroy]) rescue {}
    permitted_params.merge!(user_id: current_user.id) if logged_in?
    permitted_params
  end

end
