defmodule BackendWeb.AdminController do
  alias Backend.{Api, Auth, Instance}
  use BackendWeb, :controller

  action_fallback BackendWeb.FallbackController

  def show(conn, _params) do
    [token] = get_req_header(conn, "token")

    with {:ok, domain} <- Auth.verify_token(token) do
      instance = Api.get_instance(domain)
      render(conn, "show.json", instance: instance)
    end
  end

  def update(conn, params) do
    [token] = get_req_header(conn, "token")

    with {:ok, domain} <- Auth.verify_token(token) do
      %{"optIn" => opt_in, "optOut" => opt_out} = params

      # Make sure to update ElasticSearch so that the instance is no longer returned in search results
      es_instance =
        Api.get_instance(domain)
        |> Map.put(:opt_in, opt_in)
        |> Map.put(:opt_out, opt_out)

      Elasticsearch.put_document!(Backend.Elasticsearch.Cluster, es_instance, "instances")

      ecto_instance = %Instance{
        domain: domain,
        opt_in: opt_in,
        opt_out: opt_out
      }

      with {:ok, updated_instance} <- Api.update_instance(ecto_instance) do
        render(conn, "show.json", instance: updated_instance)
      end
    end
  end
end
