defmodule PhilomenaWeb.ScraperPlug do
  def init(opts), do: opts

  def call(conn, opts) do
    params_name = Keyword.get(opts, :params_name, "image")
    params_key = Keyword.get(opts, :params_key, "image")

    case conn.params do
      %{^params_name => %{^params_key => %Plug.Upload{}}} ->
        conn

      %{"scraper_cache" => url} when not is_nil(url) ->
        Philomena.Http.get!(url, [], max_body_length: 30_000_000)
        |> maybe_fixup_params(opts, conn)

      _ ->
        conn
    end
  end

  defp maybe_fixup_params(%HTTPoison.Response{body: body, status_code: 200}, opts, conn) do
    params_name = Keyword.get(opts, :params_name, "image")
    params_key = Keyword.get(opts, :params_key, "image")
    file = Briefly.create!()
    now = DateTime.utc_now() |> DateTime.to_unix(:microsecond)

    File.write!(file, body)

    fake_upload = %Plug.Upload{
      path: file,
      content_type: "application/octet-stream",
      filename: "scraper-#{now}"
    }

    updated_form = Map.put(conn.params[params_name], params_key, fake_upload)

    updated_params = Map.put(conn.params, params_name, updated_form)

    %{conn | params: updated_params}
  end

  defp maybe_fixup_params(_response, _opts, conn), do: conn
end