defmodule Mobilizon.Events.EventMetadata do
  @moduledoc """
  Participation stats on event
  """

  use Ecto.Schema
  import Ecto.Changeset
  import EctoEnum

  defenum(EventMetadataTypeEnum, string: 0, integer: 1, boolean: 2, float: 3)

  @type t :: %__MODULE__{
          key: String.t(),
          value: String.t()
        }

  @required_attrs [
    :key,
    :value
  ]

  @optional_attrs [
    :title,
    :type
  ]

  @attrs @required_attrs ++ @optional_attrs

  @primary_key false
  @derive Jason.Encoder
  embedded_schema do
    field(:key, :string)
    field(:title, :string)
    field(:value, :string)
    field(:type, EventMetadataTypeEnum, default: :string)
  end

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