class PollVotesController < ApplicationController
  #在开始回答和提交问卷的时候,已经做了判断用户的身份权限
  before_action :require_login, :check_auth
  before_action :get_poll_question
  before_action :check_answer_in_question


  def create  #每一次答案的点击,请求一次
    begin
      question_votes = @poll_question.poll_votes
      question_type = @poll_question.question_type
      question_answer_id = params[:poll_answer_id] ? params[:poll_answer_id] : -1 #该答案的id
      question_answer_text = params[:vote_text].present? ? params[:vote_text] : nil    #其他选项的内容
      user_votes = question_votes.find_current_vote("user_id",current_user.id) #当前用户的答案,可能有多个
      # 当前用户的当前答案,如果已存在,当再次点击的时候,取消答案,即删除该答案
      current_vote_text = nil

      # if user_votes.find_vote_text.present?
      #   current_vote_text = user_votes.find_vote_text.first
      # end

        vote_answer_params = {
            :user_id => current_user.id,
            :poll_question_id => @poll_question.id,
            :poll_answer_id => question_answer_id,
            :vote_text => question_answer_text
        }
      #begin
      if question_type == 1
        if user_votes.present?  #用户曾经回答过的,答案选择不一样,否则新建
          current_user_answer = user_votes.first
          if current_user_answer&.poll_answer_id != question_answer_id   #如果说更换了答案,则以前的答案删除,并新建记录
            current_user_answer.destroy
            PollVote.create(vote_answer_params)
          else

            if question_answer_text.present?
              current_user_answer.update_attribute("vote_text", question_answer_text)
            end
          end
        else
          PollVote.create(vote_answer_params)
        end
      elsif question_type == 2   #多选题的话,答案应该是1个以上
        question_answer_ids = params[:poll_answer_id] ? params[:poll_answer_id] : [] #该答案的id
        if question_answer_ids.present?
          if question_answer_text.present?   #有文字输入,但是不存在其他选项的
            ques_vote_id = question_answer_ids.map(&:to_i).max
            if user_votes.find_vote_text.present?
              current_vote_text = user_votes.find_vote_text.first
              current_vote_text.update_attribute("vote_text", question_answer_text)
            else
              answer_option = {
                :user_id => current_user.id,
                :poll_question_id => @poll_question.id,
                :poll_answer_id => ques_vote_id,
                :vote_text => question_answer_text
              }
              PollVote.create(answer_option)
            end
            # if current_vote_text.present?   #已有其他输入文字的选项
            #   current_vote_text.update_attribute("vote_text", question_answer_text)
            # else
            #
            # end
          end

          ea_ids = user_votes.pluck(:poll_answer_id)
          common_answer_ids = question_answer_ids & ea_ids   #已经存在的试卷选项id
          new_ids = question_answer_ids - common_answer_ids   # 新增的id
          old_ids = ea_ids - common_answer_ids  #没有选择的,则删掉
          if new_ids.size > 0
            new_ids.each do |e|
              answer_option = {
                  :user_id => current_user.id,
                  :poll_question_id => @poll_question.id,
                  :poll_answer_id => e,
                  :vote_text => nil
              }
              ex_a = PollVote.new(answer_option)
              ex_a.save!
            end
          end
          if old_ids.size > 0
            ea_answer = user_votes.find_current_vote("poll_answer_id",old_ids)
            ea_answer.destroy_all
          end
        else
          user_votes.destroy_all
        end
      else   #主观题的输入
        # current_vote_text = user_votes.find_vote_text
        if user_votes.present?
          user_votes.first.update_attribute("vote_text", question_answer_text)
          # if question_answer_text.present?
          #   user_votes.first.update_attribute("vote_text", question_answer_text)
          # else
          #   user_votes.destroy_all
          # end
        else
          PollVote.create(vote_answer_params)
        end
      end
      @current_question_number = @poll_question.question_number
      @current_question_necessary = @poll_question.is_necessary
      #问答记录存在,且有值,才会有返回值。
      @current_question_status = 0
      new_user_votes = question_votes.where(user_id: current_user.id)
      if new_user_votes.present?
        vote_answer_id = new_user_votes.pluck(:poll_answer_id).reject(&:blank?).size
        vote_text_count = new_user_votes.pluck(:vote_text).reject(&:blank?).size
        if vote_text_count > 0 || vote_answer_id > 0
          @current_question_status = 1
        end
      end
    rescue Exception => e
      uid_logger_error(e.message)
      tip_exception("页面调用失败!")
      raise ActiveRecord::Rollback
    end
  end


  private

  def get_poll_question
    @poll_question = PollQuestion.find_by_id(params[:poll_question_id])
    if @poll_question.blank?
      normal_status(-1,"问卷试题不存在!")
    else
      @poll = @poll_question.poll
      @course = @poll.course
      if @poll.blank?
        normal_status(-1,"问卷不存在!")
      elsif @course.blank?
        normal_status(-1,"课堂不存在!")
      end
    end
  end

  def check_answer_in_question
    poll_user_status = @poll.get_poll_status(current_user)
    poll_user = @poll.poll_users.find_by(user_id: current_user.id) #当前用户

    question_type = @poll_question&.question_type
    if (question_type == 1) && params[:poll_answer_id].blank?
      normal_status(-1,"答案ID错误!")
    elsif question_type == 2
      user_vote_count = params[:poll_answer_id].size
      if @poll_question.max_choices.present?
        question_max_choices = @poll_question.max_choices
      else
        question_max_choices = 0
      end
      if question_max_choices > 0 && (user_vote_count > question_max_choices)
        normal_status(-1,"多选题答案超过最大限制!")
      end
    elsif (poll_user.present? && poll_user.commit_status == 1) || poll_user_status == 3
      normal_status(-1,"已提交/已结束的问卷不允许修改!")
    end
  end

end