# frozen_string_literal: true

module Mutations
  module UserMutations
    class VerifyTwoFactorSetup < Mutations::BaseMutation
      argument :userId, ID, required: true
      argument :code, String, required: true

      field :data, Types::UserType, null: true
      field :backup_codes, [ String ], null: true
      field :errors, [ String ], null: false
      field :message, String, null: true
      field :http_status, Integer, null: false

      def resolve(userId:, code:)
        Rails.logger.info "Starting 2FA verification for user #{userId}"

        user = User.find_by(id: userId)
        unless user
          Rails.logger.error "User not found with ID: #{userId}"
          return {
            data: nil,
            backup_codes: nil,
            errors: [ "User not found" ],
            message: "User not found",
            http_status: 404
          }
        end

        Rails.logger.info "Found user: #{user.email}"

        two_factor = user.two_factor
        unless two_factor
          Rails.logger.error "TwoFactor record not found for user #{user.id}"
          return {
            data: nil,
            backup_codes: nil,
            errors: [ "Two-factor authentication not set up" ],
            message: "2FA setup required",
            http_status: 400
          }
        end

        begin
          if two_factor.verify_totp(code)
            Rails.logger.info "TOTP code verified successfully for user #{user.id}"

            two_factor.enabled = true
            backup_codes = two_factor.generate_backup_codes
            two_factor.save!

            Rails.logger.info "Successfully enabled 2FA and generated backup codes for user #{user.id}"

            {
              data: user,
              backup_codes: backup_codes,
              errors: [],
              message: "2FA setup completed successfully",
              http_status: 200
            }
          else
            Rails.logger.error "Invalid TOTP code for user #{user.id}"
            {
              data: nil,
              backup_codes: nil,
              errors: [ "Invalid verification code" ],
              message: "Verification failed",
              http_status: 400
            }
          end
        rescue => e
          Rails.logger.error "Error verifying 2FA setup for user #{user.id}: #{e.message}"
          Rails.logger.error e.backtrace.join("\n")
          {
            data: nil,
            backup_codes: nil,
            errors: [ e.message ],
            message: "Verification failed",
            http_status: 500
          }
        end
      end
    end
  end
end
