lib/unleash/strategy/gradual_rollout_user_id.ex

defmodule Unleash.Strategy.GradualRolloutUserId do
  @moduledoc """
  Requires `:user_id` in `t:Unleash.context/0`

  Based on the
  [`gradualRolloutUserId`](https://unleash.github.io/docs/activation_strategy#gradualrolloutuserid)
  strategy.
  """

  use Unleash.Strategy, name: "GradualRolloutUserId"
  alias Unleash.Strategy.Utils

  def enabled?(_params, %{user_id: ""}), do: false

  def enabled?(_params, %{user_id: nil}), do: false

  def enabled?(%{"percentage" => percentage, "groupId" => group_id}, %{user_id: user_id})
      when is_binary(group_id) and is_binary(user_id) do
    result =
      percentage
      |> Utils.parse_int()
      |> (&(&1 > 0 and Utils.normalize(user_id, group_id) <= &1)).()

    {result, %{group: group_id, user: user_id, percentage: percentage}}
  end

  def enabled?(%{"percentage" => _p} = params, %{user_id: _s} = context) do
    enabled?(%{params | "groupId" => ""}, context)
  end

  def enabled?(_params, _context), do: false
end