lib/core/apply_driven_adapter_template.ex

defmodule ScaffoldCa.Core.ApplyDrivenAdapterTemplate do

  alias ScaffoldCa.Utils.StringContent
  alias ScaffoldCa.Utils.FileGenerator
  alias ScaffoldCa.Utils.Injector

  @project_da_path "lib/driven_adapters"
  @poject_mix_file "mix.exs"

  def create_driven_adapter(app_name, da_name, type) do

    with {:ok, _app_snake_name, app_camel_name} <- StringContent.format_name(app_name),
         {:ok, da_snake_name, da_camel_name} <- StringContent.format_name(da_name) do

      {:ok, project_da_path, template_path, token_list} = create(app_camel_name, da_camel_name, da_snake_name, type)

      FileGenerator.create_file(project_da_path, template_path, token_list)
    else
      err -> Mix.raise("Invalid name indicated: " <> elem(err, 2))
    end
  end

  defp create(app_camel_name, _da_camel_name, _da_snake_name, :secretsmanager) do
    folder_secrets_path = "#{@project_da_path}/secrets/"
    file_secrets_path = "#{folder_secrets_path}secrets_manager.ex"

    token_list = [
      %{name: "{module_name}", value: app_camel_name},
      %{name: "{da_name}", value: "secrets_manager"}
    ]

    template_path = "/priv/create_structure/templates/secret_adapter.txt"

    if !File.exists?(@project_da_path) do
      File.mkdir!(@project_da_path)
    end

    if !File.exists?(folder_secrets_path) do
      File.mkdir!(folder_secrets_path)
    end

    inject_dependencies(~s|{:ex_aws_secretsmanager, "~> 2.0"}|)
    Mix.shell().info("Dependency ex_aws_secretsmanager added")

    {:ok, file_secrets_path, template_path, token_list}
  end

  defp create(_app_camel_name, _da_camel_name, _da_snake_name, _invalid_da) do
    Mix.raise("Invalid driven adapter parameter. Please verify de documentation to see the diferent driven adapters types")

  end

  defp inject_dependencies(dependency) do
    Injector.inject_dependency(@poject_mix_file, dependency)
  end
end