lib/bbox/mix/tasks/setup.ex

defmodule Mix.Tasks.Setup do
  @moduledoc """
  Seeds module. Populate the database with data.
  """
  use Mix.Task
  alias Bbox.Parties
  alias Bbox.Candidates
  alias Bbox.Voters
  alias Bbox.Votes

  @parties [
    %{
      initials: "PT",
      name: "Partido dos Trabalhadores",
      description: "Partido dos Trabalhadores"
    },
    %{
      initials: "PSDB",
      name: "Partido da Social Democracia Brasileira",
      description: "Partido da Social Democracia Brasileira"
    },
    %{
      initials: "PSOL",
      name: "Partido Socialismo e Liberdade",
      description: "Partido Socialismo e Liberdade"
    },
    %{
      initials: "PCdoB",
      name: "Partido Comunista dos Direitos e Obrigacoes Brasileiros",
      description: "Partido Comunista dos Direitos e Obrigacoes Brasileiros"
    },
    %{
      initials: "PMDB",
      name: "Partido da Mulher",
      description: "Partido da Mulher"
    }
  ]

  @candidates [
    %{
      first_name: "João",
      last_name: "Silva",
      email: "joao@example.com"
    },
    %{
      first_name: "Maria",
      last_name: "Silva",
      email: "maria@example.com"
    },
    %{
      first_name: "José",
      last_name: "Silva",
      email: "jose@example.com"
    }
  ]

  @doc """
  Populate the database with data.
  """
  @spec run(any()) :: any()
  def run(_) do
    Mix.Task.run("ecto.drop")
    Mix.Task.run("ecto.create")
    Mix.Task.run("ecto.migrate")
    Mix.Task.run("app.start")

    {:ok, voter} = Voters.insert(%{email: "elioenaiferrari@gmail.com", username: "Eli"})

    parties =
      Enum.map(@parties, fn party ->
        {:ok, party} = Parties.insert(party)

        party
      end)

    Enum.map(@candidates, fn candidate ->
      party = Enum.random(parties)
      {:ok, candidate} = Candidates.insert(party, candidate)

      candidate
    end)

    IO.inspect(voter.private_key)

    Mix.Task.clear()
  end
end