module Account::Onboarding::UserEmail::ControllerBase
  extend ActiveSupport::Concern

  included do
    layout "devise"
    load_and_authorize_resource class: "User"

    # this is because cancancan doesn't let us set the instance variable name above.
    before_action do
      @user = @user_email
    end
  end

  # GET /users/1/edit
  def edit
    flash[:notice] = nil
    if @user.email_is_oauth_placeholder?
      @user.email = nil
    end
  end

  # PATCH/PUT /users/1
  # PATCH/PUT /users/1.json
  def update
    respond_to do |format|
      if @user.update(user_params)
        # if you update your own user account, devise will normally kick you out, so we do this instead.
        bypass_sign_in current_user.reload

        if !@user.email_is_oauth_placeholder?
          @user.send_welcome_email
          format.html { redirect_to account_team_path(@user.teams.first), notice: "" }
        else
          format.html {
            flash[:error] = I18n.t("global.notifications.all_fields_required")
            redirect_to edit_account_onboarding_user_detail_path(@user)
          }
        end

        format.json { render :show, status: :ok, location: [:account, @user] }
      else

        # this is just checking whether the error on the email field is taking the email
        # address is already taken.
        @email_taken = begin
          @user.errors.details[:email].select { |error| error[:error] == :taken }.any?
        rescue
          false
        end

        format.html { render :edit, status: :unprocessable_entity }
        format.json { render json: @user.errors, status: :unprocessable_entity }
      end
    end
  end

  private

  # Never trust parameters from the scary internet, only allow the white list through.
  def user_params
    params.require(:user).permit(
      :email,
      # 🚅 super scaffolding will insert new fields above this line.
      # 🚅 super scaffolding will insert new arrays above this line.
    )

    # 🚅 super scaffolding will insert processing for new fields above this line.
  end
end
