# frozen_string_literal: true

# Notifica a les usuaries cuando un sitio se generó con éxito
#
# XXX: No será mejor enviarles un correo con copia?
# TODO: Agregar headers de desuscripción de notificaciones cuando
# tengamos opciones de usuarie
# TODO: Agregar firma GPG y header Autocrypt
# TODO: Cifrar con GPG si le usuarie nos dio su llave
class DeployMailer < ApplicationMailer
  include ActionView::Helpers::NumberHelper
  include ActionView::Helpers::DateHelper

  # rubocop:disable Metrics/AbcSize
  def deployed(deploys = {})
    usuarie = Usuarie.find(params[:usuarie])
    site = usuarie.sites.find(params[:site])
    hostname = site.hostname
    deploys ||= {}

    # Informamos a cada quien en su idioma y damos una dirección de
    # respuesta porque a veces les usuaries nos escriben
    I18n.with_locale(usuarie.lang) do
      subject = t('.subject', site: site.name)

      @hi = t('.hi')
      @explanation = t('.explanation', fqdn: hostname)
      @help = t('.help')

      @headers = %w[type status url seconds size].map do |header|
        t(".th.#{header}")
      end

      @table = deploys.each_pair.map do |deploy, value|
        {
          title: t(".#{deploy}.title"),
          status: t(".#{deploy}.#{value[:status] ? 'success' : 'error'}"),
          urls: value[:urls],
          seconds: {
            human: distance_of_time_in_words(value[:seconds].seconds),
            machine: "PT#{value[:seconds]}S"
          },
          size: number_to_human_size(value[:size], precision: 2)
        }
      end

      @terminal_table = Terminal::Table.new do |t|
        t << @headers
        t.add_separator
        @table.each do |row|
          row[:urls].each do |url|
            t << (row.map do |k, v|
              case k
              when :seconds then v[:human]
              when :urls then url
              else v
              end
            end)
          end
        end
      end

      mail(to: usuarie.email, reply_to: "sutty@#{Site.domain}", subject: subject)
    end
  end
  # rubocop:enable Metrics/AbcSize

  private

  def t(key, **args)
    I18n.t("deploy_mailer.deployed#{key}", **args)
  end
end