lib/exfake.ex

defmodule Exfake do
  @moduledoc """
  Documentation for `Exfake`.
  """

  alias Datasets.{Names, Phones, Lorem, Company, Xss, Internet}

  @doc """
  Generates first name.

  ## Examples

      iex> Exfake.gen_first_name()
      "Jake"
      iex> Exfake.gen_first_name()
      "Rosemary"
  """
  @spec gen_first_name :: String.t()
  def gen_first_name() do
    Enum.random(Names.first_names())
  end

  @doc """
  Generates last name.

  ## Examples

      iex> Exfake.gen_last_name()
      "Nitzsche"
      iex> Exfake.gen_last_name()
      "Adams"
  """
  @spec gen_last_name :: String.t()
  def gen_last_name() do
    Enum.random(Names.last_names())
  end

  @doc """
  Generates first name + last name combination.

  ## Examples

      iex> Exfake.gen_person()
      "Jake Nitzsche"
      iex> Exfake.gen_person()
      "Luciano Eichmann"
  """
  @spec gen_person :: String.t()
  def gen_person() do
    "#{gen_first_name()} #{gen_last_name()}"
  end

  @doc """
  Generates phone number which formatted randomly.

  ## Examples

      iex> Exfake.gen_phone_number()
      "684-126-0269"
      iex> Exfake.gen_phone_number()
      "1-319-098-3384 x06095"
  """
  @spec gen_phone_number :: String.t()
  def gen_phone_number() do
    Phones.formats()
    |> Enum.random()
    |> String.replace("#", fn _ -> Integer.to_string(Enum.random(0..9)) end)
  end

  @doc """
  Generates random english word.

  ## Examples

      iex> Exfake.gen_word()
      "burn"
      iex> Exfake.gen_word()
      "language"
  """
  @spec gen_word :: String.t()
  def gen_word() do
    Enum.random(Lorem.en_words())
  end

  @doc """
  Generates random english sentence with specified words count.
  Words count must be greater than 1.
  Default words count is 5.

  ## Examples

      iex> Exfake.gen_sentence()
      "Judge taste page porter harmony."
      iex> Exfake.gen_sentece(3)
      "Event minute view."
  """
  @spec gen_sentence(pos_integer) :: String.t()
  def gen_sentence(count \\ 5) when count > 1 do
    beg = gen_word() |> String.capitalize()
    body = 1..(count - 1) |> Enum.map(fn _ -> gen_word() end) |> Enum.join(" ")

    "#{beg} #{body}."
  end

  @doc """
  Generates random lorem paragraph with specified sentence count and sentence words count which randoms between 2 and 5.
  Sentence count must be greater than 0.
  Default sentence count is 3.
  Default words count between 2 and 5.

  ## Examples

      iex> Exfake.gen_paragraphs()
      "Statement waste mind. Verse sugar answer adjustment behavior. Soup attempt."
      iex> Exfake.gen_paragraphs(3, 2)
      "Smoke ink. Cry day. Company stop."
      iex> Exfake.gen_paragraphs(3, 2)
      "Nation wind. Sea stone. Minute comparison."
  """
  @spec gen_paragraphs(pos_integer, pos_integer()) :: String.t()
  def gen_paragraphs(n \\ 3, limit \\ 5) when n > 0 do
    1..n |> Enum.map(fn _ -> gen_sentence(Enum.random(2..limit)) end) |> Enum.join(" ")
  end

  @doc """
  Generates a random company suffix.

  ## Examples

      iex> Exfake.gen_company_suffix()
      "Inc"
      iex> Exfake.gen_company_suffix()
      "LLC"
  """
  @spec gen_company_suffix() :: String.t()
  def gen_company_suffix() do
    Enum.random(Company.suffixes())
  end

  @doc """
  Generates a random company catch phrase.

  ## Examples

      iex> Exfake.gen_catch_phrase()
      "Re-engineered maximized productivity"
      iex> Exfake.gen_catch_phrase()
      "Right-sized hybrid complexity"
  """
  @spec gen_catch_phrase() :: String.t()
  def gen_catch_phrase() do
    Enum.map(Company.catch_phrase_words(), &Enum.random/1) |> Enum.join(" ")
  end

  @doc """
  Generates a random company BS goals.

  ## Examples

      iex> Exfake.gen_bs()
      "reintermediate granular niches"
      iex> Exfake.gen_bs()
      "unleash user-centric markets"
  """
  @spec gen_bs :: String.t()
  def gen_bs() do
    Enum.map(Company.bs_words(), &Enum.random/1) |> Enum.join(" ")
  end

  @doc """
  Generates a random company name.

  ## Examples

      iex> Exfake.gen_company_name()
      "Klein, Mueller and Windler"
      iex> Exfake.gen_company_name()
      "Zion Kerluke LLC"
      iex> Exfake.gen_company_name()
      "Legros-Yundt"
  """
  @spec gen_company_name :: String.t()
  def gen_company_name() do
    [
      "#{gen_person()} #{gen_company_suffix()}",
      "#{gen_last_name()}-#{gen_last_name()}",
      "#{gen_last_name()}, #{gen_last_name()} and #{gen_last_name()}"
    ]
    |> Enum.random()
  end

  @doc """
  Generates a random XSS string.

  ## Examples

      iex> Exfake.gen_xss_string()
      "<BODY BACKGROUND=\"javascript:alert('XSS')\">"
      iex> Exfake.gen_xss_string()
      "<A HREF=\"http://0102.0146.0007.00000223/\">XSS</A>"
  """
  @spec gen_xss_string :: String.t()
  def gen_xss_string() do
    Enum.random(Xss.data())
  end

  @doc """
  Generates a random XSS file.

  ## Examples

      iex> Exfake.gen_xss_file()
      "<TABLE><TD BACKGROUND=\"javascript:alert('XSS')\">.txt"
      iex> Exfake.gen_xss_file()
      "<IMG SRC=\"javascript:alert('XSS');\">.txt"
  """
  @spec gen_xss_file :: String.t()
  def gen_xss_file() do
    Enum.random(Xss.files())
  end

  @doc """
  Generates a random IPv4 address.

  ## Examples

      iex> Exfake.gen_ipv4()
      "145.77.91.223"
      iex> Exfake.gen_ipv4()
      "17.94.49.5"
  """
  @spec gen_ipv4 :: String.t()
  def gen_ipv4() do
    head = [Enum.random(1..255)]
    body = 1..3 |> Enum.map(fn _ -> Enum.random(0..255) end)
    (head ++ body) |> Enum.join(".")
  end

  @doc """
  Generates a random email.

  ## Examples

      iex> Exfake.gen_email()
      "dallas@gmail.com"
      iex> Exfake.gen_email()
      "miller@hotmail.com"
  """
  @spec gen_email :: String.t()
  def gen_email() do
    "#{String.downcase(gen_first_name())}@#{Enum.random(Internet.free_domains())}"
  end

  @doc """
  Generates a random domain.

  ## Examples

      iex> Exfake.gen_domain()
      "www.laboriosam.me"
      iex> Exfake.gen_email()
      "www.nihil.biz"
  """
  @spec gen_domain :: String.t()
  def gen_domain() do
    "www.#{String.downcase(gen_word())}.#{Enum.random(Internet.suffixes())}"
  end

  @doc """
  Generates a random USA zip code.

  ## Examples

      iex> Exfake.gen_zip_code()
      "32107-6766"
      iex> Exfake.gen_zip_code()
      "9152"
  """
  @spec gen_zip_code :: String.t()
  def gen_zip_code() do
    without_dash = 0..3 |> Enum.map(fn _ -> Enum.random(0..9) end) |> Enum.join()
    with_dash = "#{without_dash}-#{Enum.map(0..3, fn _ -> Enum.random(0..9) end) |> Enum.join()}"

    [with_dash, without_dash] |> Enum.random()
  end
end