defmodule Mobilizon.ConfigProvider do
  @moduledoc """
  Module to provide configuration from a custom file
  """
  @behaviour Config.Provider

  @spec init(String.t()) :: String.t()
  def init(path) when is_binary(path), do: path

  @spec load(Keyword.t(), String.t()) :: Keyword.t()
  def load(config, path) do
    config_path = System.get_env("MOBILIZON_CONFIG_PATH") || path

    cond do
      File.exists?(config_path) ->
        runtime_config = Config.Reader.read!(config_path)

        Config.Reader.merge(config, runtime_config)

      is_nil(System.get_env("MOBILIZON_DOCKER")) ->
        warning = [
          IO.ANSI.red(),
          IO.ANSI.bright(),
          "!!! #{config_path} not found! Please ensure it exists and that MOBILIZON_CONFIG_PATH is unset or points to an existing file",
          IO.ANSI.reset()
        ]

        IO.puts(warning)
        config

      true ->
        IO.puts("No runtime config file found, but using environment variables for Docker")
        config
    end
  end
end
