lib/qr_nbu/validators/unique_recipient_id.ex

defmodule QRNBU.Validators.UniqueRecipientID do
  @moduledoc """
  Validator for unique recipient identifier.

  Validates unique identifiers used to distinguish recipients in V003 format.
  """

  @max_length 35

  @doc """
  Validates unique recipient ID.

  ## Rules
  - Maximum 35 characters
  - Alphanumeric characters allowed

  ## Examples

      iex> QRNBU.Validators.UniqueRecipientID.validate("RECIP-001")
      {:ok, "RECIP-001"}

      iex> QRNBU.Validators.UniqueRecipientID.validate("")
      {:error, "Unique recipient ID cannot be empty"}

      iex> QRNBU.Validators.UniqueRecipientID.validate(String.duplicate("A", 36))
      {:error, "Unique recipient ID must not exceed 35 characters"}
  """
  @spec validate(String.t()) :: {:ok, String.t()} | {:error, String.t()}
  def validate(id) when is_binary(id) do
    cond do
      String.trim(id) == "" ->
        {:error, "Unique recipient ID cannot be empty"}

      String.length(id) > @max_length ->
        {:error, "Unique recipient ID must not exceed #{@max_length} characters"}

      true ->
        {:ok, id}
    end
  end

  def validate(_), do: {:error, "Unique recipient ID must be a string"}
end