defmodule Mobilizon.Conversations.ConversationParticipant do
  @moduledoc """
  Represents a conversation participant
  """

  use Ecto.Schema

  import Ecto.Changeset

  alias Mobilizon.Actors.Actor
  alias Mobilizon.Conversations.Conversation

  @type t :: %__MODULE__{
          conversation: Conversation.t(),
          actor: Actor.t(),
          unread: boolean()
        }

  @required_attrs [:actor_id, :conversation_id]
  @optional_attrs [:unread]
  @attrs @required_attrs ++ @optional_attrs

  schema "conversation_participants" do
    belongs_to(:conversation, Conversation)
    belongs_to(:actor, Actor)
    field(:unread, :boolean, default: true)

    timestamps(type: :utc_datetime)
  end

  @doc false
  @spec changeset(t | Ecto.Schema.t(), map) :: Ecto.Changeset.t()
  def changeset(%__MODULE__{} = conversation, attrs) do
    conversation
    |> cast(attrs, @attrs)
    |> validate_required(@required_attrs)
    |> foreign_key_constraint(:conversation_id)
    |> foreign_key_constraint(:actor_id)
  end
end