defmodule Mobilizon.Invitations do
  @moduledoc """
  The Invitations context.
  """

  alias Mobilizon.Invitation
  alias Mobilizon.Storage.Repo
  import Ecto.Query

  def get_invitation(id), do: Repo.get(Invitation, id)

  def create_invitation(attrs \\ %{}) do
    %Invitation{}
    |> Invitation.changeset(attrs)
    |> Repo.insert()
  end

  def update_invitation_by_token(group_id, token, attrs) do
    case Repo.get_by(Mobilizon.Invitation, token: token, group_id: group_id) do
      nil ->
        {:error, "Invitation not found"}

      %Mobilizon.Invitation{} = invitation ->
        invitation
        |> Invitation.changeset(attrs)
        |> Repo.update()
    end
  end

  def delete_invitation_by_token(group_id, token) do
    case Repo.get_by(Mobilizon.Invitation, token: token, group_id: group_id) do
      nil -> {:error, "Invitation not found"}
      invitation -> Repo.delete(invitation)
    end
  end

  def list_invitations(group_id) do
    Invitation
    |> where([i], i.group_id == ^group_id)
    |> Repo.all()
  end

  def find_invitation(group_id, token) do
    Repo.get_by(Invitation, group_id: group_id, token: token)
  end
end