module CamaleonCms
  module EmailHelper
    include CamaleonCms::HooksHelper
    # send and email
    # email: email to
    # subject: Subject of the email
    # content: content of the email
    # from: email figured as from
    # attachs: array of files to be attached to the email
    # layout_name: path of the template to render
    # template_name: template name to render in template_path
    def send_email(email, subject = 'Notification', content = '', from = nil, attachs = [], template_name = nil,
                   layout_name = nil, extra_data = {})
      args = { attachs: attachs, extra_data: extra_data }
      args[:template_name] = template_name if template_name.present?
      args[:layout_name] = layout_name if layout_name.present?
      args[:from] = from if from.present?
      args[:content] = content if content.present?
      cama_send_email(email, subject, args)
    end

    # short method of send_email
    # args: content='', from=nil, attachs=[], url_base='', current_site, template_name, layout_name, extra_data, format, cc_to
    def cama_send_email(email_to, subject, args = {})
      args = { url_base: cama_root_url, current_site: current_site, subject: subject }.merge(args)
      args[:attachments] = args[:attachs] if args[:attachs].present?
      args[:current_site] = args[:current_site].id

      # run hook "email" to customize values
      hooks_run('email', args)
      CamaleonCms::HtmlMailer.sender(email_to, args[:subject], args).deliver_later
    end

    def send_user_confirm_email(user_to_confirm)
      user_to_confirm.send_confirm_email
      confirm_email_url = cama_admin_confirm_email_url({ h: user_to_confirm.confirm_email_token })
      Rails.logger.debug "Camaleon CMS - Sending email verification to #{user_to_confirm}"
      extra_data = { url: confirm_email_url, fullname: user_to_confirm.fullname }
      send_email(user_to_confirm.email, t('camaleon_cms.admin.login.confirm.text'), '', nil, [], 'confirm_email',
                 'camaleon_cms/mailer', extra_data)
    end

    def send_password_reset_email(user_to_send)
      user_to_send.send_password_reset
      reset_url = cama_admin_forgot_url({ h: user_to_send.password_reset_token })
      extra_data = {
        url: reset_url,
        fullname: user_to_send.fullname,
        user: user_to_send
      }
      send_email(user_to_send.email, t('camaleon_cms.admin.login.message.subject_email'), '', nil, [],
                 'password_reset', 'camaleon_cms/mailer', extra_data)
    end

    # send email to the first administrator
    # args: same arguments than cama_send_email
    def cama_send_mail_to_admin(subject, args = {})
      cama_send_email(current_site.get_option('system_email', current_site.users.admin_scope.first.email), subject,
                      args)
    end
  end
end
