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

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

  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()) :: Swoosh.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()
      )

    [to: email, subject: subject]
    |> Email.base_email()
    |> render_body(:report, %{locale: locale, subject: subject, report: report})
  end

  @spec user_email_change_old(User.t(), String.t()) :: Swoosh.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()
      )

    [to: old_email, subject: subject]
    |> Email.base_email()
    |> render_body(:admin_user_email_changed_old, %{
      locale: user_locale,
      subject: subject,
      new_email: new_email,
      old_email: old_email,
      offer_unsupscription: false
    })
  end

  @spec user_email_change_new(User.t(), String.t()) :: Swoosh.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()
      )

    [to: old_email, subject: subject]
    |> Email.base_email()
    |> render_body(:admin_user_email_changed_new, %{
      locale: user_locale,
      subject: subject,
      new_email: new_email,
      old_email: old_email,
      offer_unsupscription: false
    })
  end

  @spec user_role_change(User.t(), atom()) :: Swoosh.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()
      )

    [to: email, subject: subject]
    |> Email.base_email()
    |> render_body(:admin_user_role_changed, %{
      locale: user_locale,
      subject: subject,
      old_role: old_role,
      new_role: new_role,
      offer_unsupscription: false
    })
  end

  @spec user_confirmation(User.t()) :: Swoosh.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()
      )

    [to: email, subject: subject]
    |> Email.base_email()
    |> render_body(:admin_user_confirmation, %{
      locale: user_locale,
      subject: subject,
      offer_unsupscription: false
    })
  end
end
