# frozen_string_literal: true

class Admin::EmojisController < Admin::AdminController
  def index
    render_serialized(Emoji.custom, EmojiSerializer, root: false)
  end

  # TODO (martin) Figure out a way that this kind of custom logic can
  # be run in the ExternalUploadManager when a direct S3 upload is completed,
  # related to preventDirectS3Uploads in the UppyUploadMixin.
  def create
    file = params[:file] || params[:files].first
    name = params[:name] || File.basename(file.original_filename, ".*")
    group = params[:group] ? params[:group].downcase : nil

    hijack do
      # fix the name
      name = File.basename(name, ".*")
      name = name.gsub(/[^a-z0-9]+/i, "_").gsub(/_{2,}/, "_").downcase

      upload =
        UploadCreator.new(file.tempfile, file.original_filename, type: "custom_emoji").create_for(
          current_user.id,
        )

      good = true

      data =
        if upload.persisted?
          custom_emoji = CustomEmoji.new(name: name, upload: upload, group: group)

          if custom_emoji.save
            Emoji.clear_cache
            { name: custom_emoji.name, url: custom_emoji.upload.url, group: group }
          else
            good = false
            failed_json.merge(errors: custom_emoji.errors.full_messages)
          end
        else
          good = false
          failed_json.merge(errors: upload.errors.full_messages)
        end

      render json: data.as_json, status: good ? 200 : 422
    end
  end

  def destroy
    name = params.require(:id)

    # NOTE: the upload will automatically be removed by the 'clean_up_uploads' job
    CustomEmoji.find_by(name: name)&.destroy!

    Emoji.clear_cache

    Jobs.enqueue(:rebake_custom_emoji_posts, name: name)

    render json: success_json
  end
end