# frozen_string_literal: true

class PostActionsController < ApplicationController
  requires_login

  before_action :fetch_post_from_params
  before_action :fetch_post_action_type_id_from_params

  def create
    raise Discourse::NotFound if @post.blank?

    creator =
      PostActionCreator.new(
        current_user,
        @post,
        @post_action_type_id,
        is_warning: params[:is_warning],
        message: params[:message],
        take_action: params[:take_action] == "true",
        flag_topic: params[:flag_topic] == "true",
        queue_for_review: params[:queue_for_review] == "true",
      )
    result = creator.perform

    if result.failed?
      render_json_error(result)
    else
      # We need to reload or otherwise we are showing the old values on the front end
      @post.reload

      if @post_action_type_id == PostActionType.types[:like]
        limiter = result.post_action.post_action_rate_limiter
        response.headers["Discourse-Actions-Remaining"] = limiter.remaining.to_s
        response.headers["Discourse-Actions-Max"] = limiter.max.to_s
      end
      render_post_json(@post, add_raw: false)
    end
  end

  def destroy
    result =
      PostActionDestroyer.new(
        current_user,
        Post.find_by(id: params[:id].to_i),
        @post_action_type_id,
      ).perform

    if result.failed?
      render_json_error(result)
    else
      render_post_json(result.post, add_raw: false)
    end
  end

  private

  def fetch_post_from_params
    params.require(:id)

    flag_topic = params[:flag_topic]
    flag_topic = flag_topic && (flag_topic == true || flag_topic == "true")

    post_id =
      if flag_topic
        begin
          Topic.find(params[:id]).posts.first.id
        rescue StandardError
          raise Discourse::NotFound
        end
      else
        params[:id]
      end

    finder = Post.where(id: post_id)

    # Include deleted posts if the user is a staff
    finder = finder.with_deleted if guardian.is_staff?

    @post = finder.first
  end

  def fetch_post_action_type_id_from_params
    params.require(:post_action_type_id)
    @post_action_type_id = params[:post_action_type_id].to_i
  end
end