import { SessionInfo } from '@core/types'
import { Injectable } from '@nestjs/common'
import { JwtService } from '@nestjs/jwt'
import { FastifyRequest } from 'fastify'
import { AuthStrategy } from '../types'

/**
 * Validate JWT tokens in incoming requests and extracts the user session information.
 */
@Injectable()
export class JWTAuthStrategy implements AuthStrategy {
	constructor(private readonly _jwtService: JwtService) {}

	async validate(request: FastifyRequest): Promise<SessionInfo | null> {
		const token = this.extractToken(request)
		if (!token) return null

		try {
			const user = await this._jwtService.verifyAsync<SessionInfo>(token)
			if (!user) return null
			;(request as any)['user'] = user

			return user
		} catch {
			return null
		}
	}

	private extractToken(request: FastifyRequest): string | null {
		const authHeader = request.headers.authorization

		if (!authHeader || !authHeader.startsWith('Bearer ')) {
			return null
		}

		return authHeader.slice(7) // Remove 'Bearer '
	}
}
