defmodule Mv.Membership.Helpers.VisibilityConfig do
  @moduledoc """
  Helper functions for normalizing member field visibility configuration.

  Handles conversion between string keys (from JSONB) and atom keys (Elixir convention).
  JSONB in PostgreSQL converts atom keys to string keys when storing.
  This module provides functions to normalize these back to atoms for Elixir usage.
  """

  @doc """
  Normalizes visibility config map keys from strings to atoms.

  JSONB in PostgreSQL converts atom keys to string keys when storing.
  This function converts them back to atoms for Elixir usage.

  ## Parameters

    - `config` - A map with either string or atom keys

  ## Returns

    A map with atom keys (where possible)

  ## Examples

      iex> normalize(%{"first_name" => true, "email" => false})
      %{first_name: true, email: false}

      iex> normalize(%{first_name: true, email: false})
      %{first_name: true, email: false}

      iex> normalize(%{"invalid_field" => true})
      %{}
  """
  @spec normalize(map()) :: map()
  def normalize(config) when is_map(config) do
    Enum.reduce(config, %{}, fn
      {key, value}, acc when is_atom(key) ->
        Map.put(acc, key, value)

      {key, value}, acc when is_binary(key) ->
        try do
          atom_key = String.to_existing_atom(key)
          Map.put(acc, atom_key, value)
        rescue
          ArgumentError -> acc
        end

      _, acc ->
        acc
    end)
  end

  def normalize(_), do: %{}
end
