defmodule Wabanex.Training do
  @moduledoc """
  Schema of a training routine for a given period of time.
  """
  use Ecto.Schema

  import Ecto.Changeset

  alias PgRanges.DateRange
  alias Wabanex.{Exercise, User}

  @primary_key {:id, :binary_id, autogenerate: true}
  @foreign_key_type :binary_id

  @fields [:period, :user_id]

  schema "trainings" do
    field :period, DateRange, default: DateRange.new(Date.utc_today(), nil)

    belongs_to :user, User

    has_many :exercises, Exercise

    timestamps()
  end

  def changeset(params) do
    %__MODULE__{}
    |> cast(params, @fields)
    |> validate_required(@fields)
    |> exclusion_constraint(:period, name: :non_overlap_period)
    |> cast_assoc(:exercises)
  end
end