defmodule Core.Syndication.BlueskyClient do
  @middleware [
    Tesla.Middleware.Logger,
    {Tesla.Middleware.BaseUrl, "https://bsky.social/xrpc"},
    Tesla.Middleware.JSON
  ]

  def new(opts \\ []) do
    middleware = @middleware

    middleware =
      case Keyword.fetch(opts, :token) do
        {:ok, token} ->
          middleware ++ [{Tesla.Middleware.BearerAuth, token: token}]

        :error ->
          middleware
      end

    Tesla.client(middleware)
  end

  def create_session(identifier, password) do
    client = new()

    Tesla.post(client, "/com.atproto.server.createSession", %{
      identifier: identifier,
      password: password
    })
  end

  def refresh_session(%Schema.BlueskyAccount{refresh_jwt: token}) do
    client = new(token: token)

    Tesla.post(client, "/com.atproto.server.refreshSession", nil)
  end

  def post_status(%Schema.BlueskyAccount{} = bluesky_account, text) do
    client = new(token: bluesky_account.access_jwt)

    Tesla.post(client, "/com.atproto.repo.createRecord", %{
      repo: bluesky_account.did,
      collection: "app.bsky.feed.post",
      record: %{
        text: text,
        createdAt: DateTime.utc_now() |> DateTime.to_iso8601()
      }
    })
  end
end