lib/mix/tasks/wac.install.ex

defmodule Mix.Tasks.Wac.Install do
  @moduledoc """
  Generates schemas, migrations, and contexts for users with WebauthnComponents as the primary authentication mechanism.
  """
  @shortdoc "Generates a user schema."

  use Mix.Task
  alias Wac.Gen.Contexts
  alias Wac.Gen.Schemas
  alias Wac.Gen.Migrations
  alias Wac.Gen.Tests
  alias Wac.Gen.Fixtures

  @version Mix.Project.config()[:version]

  @mix_task "wac.install"
  @switches []

  @impl Mix.Task
  def run([version]) when version in ~w(-v --version) do
    Mix.shell().info("WebauthnComponents Schemas generator v#{@version}")
  end

  def run([version]) when version in ~w(-h --help) do
    Mix.Tasks.Help.run([@mix_task])
  end

  def run(args) do
    if Mix.Project.umbrella?() do
      Mix.shell().error("Sorry, umbrella projects are currently unsupported.")
    end

    case OptionParser.parse(args, strict: @switches) do
      {_parsed, _args, []} ->
        dirname = File.cwd!() |> Path.basename()
        dirname_camelized = Macro.camelize(dirname)

        assigns = [
          app_snake_case: dirname,
          app_pascal_case: Module.concat([dirname_camelized])
        ]

        Schemas.copy_templates(assigns)
        Migrations.copy_templates(assigns)
        Contexts.copy_templates(assigns)
        Tests.copy_templates(assigns)
        Fixtures.copy_templates(assigns)

      {_parsed, _args, errors} ->
        invalid_opts =
          errors
          |> Enum.map_join(", ", &elem(&1, 0))

        Mix.Tasks.Help.run([@mix_task])
        Mix.shell().error("Invalid option(s): #{invalid_opts}")
    end
  end
end