# frozen_string_literal: true

class DiscoursePoll::PollsController < ::ApplicationController
  requires_plugin DiscoursePoll::PLUGIN_NAME

  before_action :ensure_logged_in, except: %i[voters grouped_poll_results]

  def vote
    post_id = params.require(:post_id)
    poll_name = params.require(:poll_name)
    options = params.require(:options)

    begin
      poll, options = DiscoursePoll::Poll.vote(current_user, post_id, poll_name, options)
      render json: { poll: poll, vote: options }
    rescue DiscoursePoll::Error => e
      render_json_error e.message
    end
  end

  def remove_vote
    post_id = params.require(:post_id)
    poll_name = params.require(:poll_name)

    begin
      poll = DiscoursePoll::Poll.remove_vote(current_user, post_id, poll_name)
      render json: { poll: poll }
    rescue DiscoursePoll::Error => e
      render_json_error e.message
    end
  end

  def toggle_status
    post_id = params.require(:post_id)
    poll_name = params.require(:poll_name)
    status = params.require(:status)

    begin
      poll = DiscoursePoll::Poll.toggle_status(current_user, post_id, poll_name, status)
      render json: { poll: poll }
    rescue DiscoursePoll::Error => e
      render_json_error e.message
    end
  end

  def voters
    post_id = params.require(:post_id)
    poll_name = params.require(:poll_name)
    opts = params.permit(:limit, :page, :option_id)

    raise Discourse::InvalidParameters.new(:post_id) if !Post.where(id: post_id).exists?

    poll = Poll.find_by(post_id: post_id, name: poll_name)
    raise Discourse::InvalidParameters.new(:poll_name) if !poll&.can_see_voters?(current_user)

    render json: { voters: DiscoursePoll::Poll.serialized_voters(poll, opts) }
  end

  def grouped_poll_results
    post_id = params.require(:post_id)
    poll_name = params.require(:poll_name)
    user_field_name = params.require(:user_field_name)

    poll = Poll.find_by(post_id: post_id, name: poll_name)

    if poll.nil?
      render json: { error: I18n.t("poll.errors.poll_not_found") }, status: :not_found
    elsif poll.ranked_choice?
      render json: {
               error: I18n.t("poll.ranked_choice.no_group_results_support"),
             },
             status: :unprocessable_entity
    else
      begin
        render json: {
                 grouped_results:
                   DiscoursePoll::Poll.grouped_poll_results(
                     current_user,
                     post_id,
                     poll_name,
                     user_field_name,
                   ),
               }
      rescue DiscoursePoll::Error => e
        render_json_error e.message
      end
    end
  end
end