app/controllers/invitations_controller.rb
# frozen_string_literal: true

#   Copyright (c) 2010-2011, Diaspora Inc.  This file is
#   licensed under the Affero General Public License version 3 or later.  See
#   the COPYRIGHT file.

class InvitationsController < ApplicationController
  before_action :authenticate_user!
  before_action :check_invitations_available!, only: :create

  def new
    @invite_code = current_user.invitation_code

    @invalid_emails = html_safe_string_from_session_array(:invalid_email_invites)
    @valid_emails   = html_safe_string_from_session_array(:valid_email_invites)

    respond_to do |format|
      format.html do
        render "invitations/new", layout: false
      end
    end
  end

  def create
    emails = inviter_params[:emails].split(",").map(&:strip).uniq

    valid_emails, invalid_emails = emails.partition {|email| valid_email?(email) }

    session[:valid_email_invites] = valid_emails
    session[:invalid_email_invites] = invalid_emails

    unless valid_emails.empty?
      Workers::Mail::InviteEmail.perform_async(valid_emails.join(","), current_user.id, inviter_params.to_h)
    end

    if emails.empty?
      flash[:error] = t("invitations.create.empty")
    elsif invalid_emails.empty?
      flash[:notice] = t("invitations.create.sent", emails: valid_emails.join(", "))
    elsif valid_emails.empty?
      flash[:error] = t("invitations.create.rejected", emails: invalid_emails.join(", "))
    else
      flash[:error] = t("invitations.create.sent", emails: valid_emails.join(", ")) + ". " +
        t("invitations.create.rejected", emails: invalid_emails.join(", "))
    end

    redirect_back fallback_location: stream_path
  end

  private

  def check_invitations_available!
    return true if AppConfig.settings.enable_registrations? || current_user.invitation_code.can_be_used?

    flash[:error] = if AppConfig.settings.invitations.open?
                      t("invitations.create.no_more")
                    else
                      t("invitations.create.closed")
                    end
    redirect_back fallback_location: stream_path
  end

  def valid_email?(email)
    User.email_regexp.match(email).present?
  end

  def html_safe_string_from_session_array(key)
    return "" unless session[key].present?
    return "" unless session[key].respond_to?(:join)
    value = session[key].join(", ").html_safe
    session[key] = nil
    value
  end

  def inviter_params
    params.require(:email_inviter).permit(:message, :locale, :emails).to_h
  end
end
