# frozen_string_literal: true
class QuizController < ApplicationController
  before_action :authorize_candidate

  def question
    qid = prep_status.current_question_id || params[:question_id]
    redirect_to :summary and return if qid.nil?
    prep_question qid
    @answer = prep_answer qid
    prep_instance_answer @question
  end

  def update_answer
    @answer = prep_answer answer_params[:question_id]
    prep_status
    prep_question(answer_params[:question_id])
    @answer.update(process_answer_params)
    route_answer_xhr and return if request.xhr?
    route_answer_html
  end

  def summary
    @quiz = current_candidate.my_quiz
    redirect_to :question and return unless prep_status.current_question_id.nil?
  end

  def submit_summary
    not_completed_error = 'You must complete all questions to submit your test.'
    redirect_to :summary, flash: { error: not_completed_error } and return unless prep_status.can_submit

    complete_and_email
    redirect_to :thankyou
  end

  private

    def complete_and_email
      if current_candidate.update_attributes(completed: true)
        current_candidate.build_reviews
        CandidateMailer.submitted(current_candidate).deliver_later
        RecruiterMailer.candidate_submitted(current_candidate).deliver_later
        ReviewerMailer.candidate_submission(current_candidate).deliver_later
        return true
      end
    end

    def prep_question qid
      @question = current_candidate.fetch_question(qid)
    end

    def prep_status
      @status ||= QuizStatus.new(current_candidate)
    end

    def prep_instance_answer question
      @answer = question.answer.nil? ? Answer.new : Answer.find(question.answer_id)
    end

    def answer_params
      params.require(:answer).permit(
        :question_id,
        :answer,
        :answer_id,
        answer_array: [],
        answer_hash: [:later, :html, :css, :js, :text, :other, options: []]
      )
    end

    def process_answer_params
      answer = answer_params
      answer[:saved] = params.key?(:save)
      answer[:submitted] = params.key?(:submit)
      answer[:answer] = answer_params[:answer_array] unless answer_params[:answer_array].nil?
      answer[:answer] = answer_params[:answer_hash].to_h unless answer_params[:answer_hash].nil?
      answer
    end

    def prep_answer qid = answer_params[:question_id]
      answer_ids = { question_id: qid, candidate_id: current_candidate.to_i }
      answer = Answer.find_or_create_by(answer_ids)
      answer
    end

    def route_answer_html
      if @answer.errors.present?
        prep_question answer_params[:question_id]
        flash[:error] = answer_params[:question_id].to_i
        render :question
      else
        redirect_to :saved and return if params.key?(:save)
        redirect_to :question
      end
    end

    def route_answer_xhr
      if @answer.errors.present?
        render json: @answer.errors["answer"].to_json, status: 400
      else
        results = {
          message: "Your answer has been updated successfully!",
          can_submit: prep_status.can_submit,
          progress: prep_status.progress
        }
        render json: results.to_json
      end
    end
end
