# frozen_string_literal: true

class OneboxController < ApplicationController
  requires_login

  def show
    unless params[:refresh] == 'true'
      preview = Oneboxer.cached_preview(params[:url])
      preview = preview.strip if preview.present?
      return render(plain: preview) if preview.present?
    end

    # only 1 outgoing preview per user
    return render(body: nil, status: 429) if Oneboxer.is_previewing?(current_user.id)

    user_id = current_user.id
    category_id = params[:category_id].to_i
    topic_id = params[:topic_id].to_i
    invalidate = params[:refresh] == 'true'
    url = params[:url]

    return render(body: nil, status: 404) if Oneboxer.recently_failed?(url)

    hijack(info: "#{url} topic_id: #{topic_id} user_id: #{user_id}") do
      Oneboxer.preview_onebox!(user_id)

      preview = Oneboxer.preview(url,
        invalidate_oneboxes: invalidate,
        user_id: user_id,
        category_id: category_id,
        topic_id: topic_id
      )

      preview = preview.strip if preview.present?

      Oneboxer.onebox_previewed!(user_id)

      if preview.blank?
        Oneboxer.cache_failed!(url)
        render body: nil, status: 404
      else
        render plain: preview
      end
    end
  end

end