app/controllers/two_factor_authentications_controller.rb
# frozen_string_literal: true

class TwoFactorAuthenticationsController < ApplicationController
  before_action :authenticate_user!
  before_action :verify_otp_required, only: [:create]

  def show
    @user = current_user
  end

  def create
    current_user.otp_secret = User.generate_otp_secret(32)
    current_user.save!
    redirect_to confirm_two_factor_authentication_path
  end

  def confirm_2fa
    redirect_to two_factor_authentication_path if current_user.otp_required_for_login?
  end

  def confirm_and_activate_2fa
    if current_user.validate_and_consume_otp!(params[:user][:code])
      current_user.otp_required_for_login = true
      current_user.save!

      flash[:notice] = t("two_factor_auth.flash.success_activation")
      redirect_to recovery_codes_two_factor_authentication_path
    else
      flash[:alert] = t("two_factor_auth.flash.error_token")
      redirect_to confirm_two_factor_authentication_path
    end
  end

  def recovery_codes
    @recovery_codes = current_user.generate_otp_backup_codes!
    current_user.save!
  end

  def destroy
    if current_user.valid_password?(params[:two_factor_authentication][:password])
      current_user.otp_required_for_login = false
      current_user.save!
      flash[:notice] = t("two_factor_auth.flash.success_deactivation")
    else
      flash[:alert] = t("users.destroy.wrong_password")
    end
    redirect_to two_factor_authentication_path
  end

  private

  def verify_otp_required
    redirect_to two_factor_authentication_path if current_user.otp_required_for_login?
  end
end
