defmodule Ash.Resource.Transformers.ValidatePrimaryKey do
  @moduledoc "Validates and caches the primary key of a resource"
  use Spark.Dsl.Transformer
  alias Spark.Dsl.Transformer
  alias Spark.Error.DslError
  def after_compile?, do: true
  def transform(dsl_state) do
    primary_key = Transformer.get_persisted(dsl_state, :primary_key)
    case primary_key do
      [] ->
        {:ok, dsl_state}
      [_] ->
        {:ok, dsl_state}
      _ ->
        data_layer = Transformer.get_persisted(dsl_state, :data_layer)
        resource = Transformer.get_persisted(dsl_state, :module)
        if data_layer && data_layer.can?(resource, :composite_primary_key) do
          {:ok, dsl_state}
        else
          {:error,
           DslError.exception(
             module: resource,
             message: "Data layer does not support composite primary keys"
           )}
        end
    end
  end
end