defmodule Core.Syndication do
  alias __MODULE__

  @mastodon_instance Application.compile_env!(:sloanely_but_surely, [
                       Core.Syndication,
                       :mastodon_instance
                     ])

  def get_mastodon_account(user) do
    Core.Repo.get_by(Schema.MastodonAccount, user_id: user.id)
  end

  def save_mastodon_account(user, attrs) do
    user
    |> Ecto.build_assoc(:mastodon_account)
    |> Syndication.MastodonAccount.changeset(attrs)
    |> Core.Repo.insert()
  end

  def syndicate_to_mastodon(%Schema.Post{} = post) do
    post = Core.Repo.preload(post, [:mastodon_post])

    if post.syndicate_to_mastodon and is_nil(post.mastodon_post) do
      conn = build_mastodon_client_conn()

      {:ok, resp} = MastodonClient.post(conn, "/api/v1/statuses", %{status: post.body})

      post
      |> Ecto.build_assoc(:mastodon_post)
      |> Syndication.MastodonPost.changeset(%{
        status_id: resp.body["id"],
        url: resp.body["url"]
      })
      |> Core.Repo.insert()

      post
    else
      post
    end
  end

  defp get_mastodon_access_token do
    mastodon_account = Core.Repo.one!(Schema.MastodonAccount)
    mastodon_account.access_token
  end

  defp build_mastodon_client_conn do
    %MastodonClient.Conn{
      instance: @mastodon_instance,
      access_token: get_mastodon_access_token()
    }
  end
end