lib/qr_nbu/validators/digital_signature.ex

defmodule QRNBU.Validators.DigitalSignature do
  @moduledoc """
  Validator for digital signature strings.

  Validates digital signatures used to authenticate invoices in V003 format.
  """

  @max_length 1000

  @doc """
  Validates digital signature.

  ## Rules
  - Maximum 1000 characters
  - Base64-encoded string format expected

  ## Examples

      iex> QRNBU.Validators.DigitalSignature.validate("SGVsbG8gV29ybGQ=")
      {:ok, "SGVsbG8gV29ybGQ="}

      iex> QRNBU.Validators.DigitalSignature.validate("")
      {:error, "Digital signature cannot be empty"}

      iex> QRNBU.Validators.DigitalSignature.validate(String.duplicate("A", 1001))
      {:error, "Digital signature must not exceed 1000 characters"}
  """
  @spec validate(String.t()) :: {:ok, String.t()} | {:error, String.t()}
  def validate(signature) when is_binary(signature) do
    cond do
      String.trim(signature) == "" ->
        {:error, "Digital signature cannot be empty"}

      String.length(signature) > @max_length ->
        {:error, "Digital signature must not exceed #{@max_length} characters"}

      true ->
        {:ok, signature}
    end
  end

  def validate(_), do: {:error, "Digital signature must be a string"}
end