defmodule Mobilizon.Web.Email.Admin do
  @moduledoc """
  Handles emails sent to admins.
  """

  use Bamboo.Phoenix, view: Mobilizon.Web.EmailView

  import Bamboo.Phoenix

  import Mobilizon.Web.Gettext

  alias Mobilizon.Config
  alias Mobilizon.Reports.Report
  alias Mobilizon.Users.User

  alias Mobilizon.Web.Email

  @spec report(User.t(), Report.t()) :: Bamboo.Email.t()
  def report(%User{email: email} = user, %Report{} = report) do
    locale = Map.get(user, :locale, "en")
    Gettext.put_locale(locale)

    subject =
      gettext(
        "New report on Mobilizon instance %{instance}",
        instance: Config.instance_name()
      )

    Email.base_email(to: email, subject: subject)
    |> assign(:locale, locale)
    |> assign(:subject, subject)
    |> assign(:report, report)
    |> render(:report)
  end

  @spec user_email_change_old(User.t(), String.t()) :: Bamboo.Email.t()
  def user_email_change_old(
        %User{
          locale: user_locale,
          email: new_email
        },
        old_email
      ) do
    Gettext.put_locale(user_locale)

    subject =
      gettext(
        "An administrator manually changed the email attached to your account on %{instance}",
        instance: Config.instance_name()
      )

    Email.base_email(to: old_email, subject: subject)
    |> assign(:locale, user_locale)
    |> assign(:subject, subject)
    |> assign(:new_email, new_email)
    |> assign(:old_email, old_email)
    |> assign(:offer_unsupscription, false)
    |> render(:admin_user_email_changed_old)
  end

  @spec user_email_change_new(User.t(), String.t()) :: Bamboo.Email.t()
  def user_email_change_new(
        %User{
          locale: user_locale,
          email: new_email
        },
        old_email
      ) do
    Gettext.put_locale(user_locale)

    subject =
      gettext(
        "An administrator manually changed the email attached to your account on %{instance}",
        instance: Config.instance_name()
      )

    Email.base_email(to: new_email, subject: subject)
    |> assign(:locale, user_locale)
    |> assign(:subject, subject)
    |> assign(:old_email, old_email)
    |> assign(:new_email, new_email)
    |> assign(:offer_unsupscription, false)
    |> render(:admin_user_email_changed_new)
  end

  @spec user_role_change(User.t(), atom()) :: Bamboo.Email.t()
  def user_role_change(
        %User{
          locale: user_locale,
          email: email,
          role: new_role
        },
        old_role
      ) do
    Gettext.put_locale(user_locale)

    subject =
      gettext(
        "An administrator updated your role on %{instance}",
        instance: Config.instance_name()
      )

    Email.base_email(to: email, subject: subject)
    |> assign(:locale, user_locale)
    |> assign(:subject, subject)
    |> assign(:old_role, old_role)
    |> assign(:new_role, new_role)
    |> assign(:offer_unsupscription, false)
    |> render(:admin_user_role_changed)
  end

  @spec user_confirmation(User.t()) :: Bamboo.Email.t()
  def user_confirmation(%User{
        locale: user_locale,
        email: email
      }) do
    Gettext.put_locale(user_locale)

    subject =
      gettext(
        "An administrator confirmed your account on %{instance}",
        instance: Config.instance_name()
      )

    Email.base_email(to: email, subject: subject)
    |> assign(:locale, user_locale)
    |> assign(:subject, subject)
    |> assign(:offer_unsupscription, false)
    |> render(:admin_user_confirmation)
  end
end