defmodule EndToEndSeed do
  alias Mobilizon.Users

  def delete_user(email) do
    with {:ok, user} <- Users.get_user_by_email(email) do
      Users.delete_user(user, reserve_email: false)
    end
  end
end

alias Mobilizon.Users
alias Mobilizon.Users.User
alias Mobilizon.Actors
alias Mobilizon.Actors.Actor

if Application.get_env(:mobilizon, :env) != :e2e do
  exit(:shutdown)
end

# An user that has just been registered
test_user_unconfirmed = %{email: "unconfirmed@email.com", password: "some password"}

# An user that has registered and has confirmed their account, but no attached identity
test_user_confirmed = %{email: "confirmed@email.com", password: "some password"}

# An user that has registered and has confirmed their account, with a profile
test_user = %{email: "user@email.com", password: "some password"}
test_actor = %{preferred_username: "test_user", name: "I'm a test user", domain: nil}

EndToEndSeed.delete_user(test_user_unconfirmed.email)
EndToEndSeed.delete_user(test_user_confirmed.email)
EndToEndSeed.delete_user(test_user.email)

{:ok, %User{} = _user_unconfirmed} = Users.register(test_user_unconfirmed)

{:ok, %User{} = user_confirmed} = Users.register(test_user_confirmed)

Users.update_user(user_confirmed, %{
  "confirmed_at" => Timex.shift(user_confirmed.confirmation_sent_at, hours: -3),
  "confirmation_sent_at" => nil,
  "confirmation_token" => nil
})

{:ok, %User{} = user} = Users.register(test_user)

Users.update_user(user, %{
  "confirmed_at" => Timex.shift(user.confirmation_sent_at, hours: -3),
  "confirmation_sent_at" => nil,
  "confirmation_token" => nil
})

{:ok, %Actor{}} =
  Actors.new_person(%{
    user_id: user.id,
    preferred_username: test_actor.preferred_username,
    name: test_actor.name
  })