import type { FastifyReply, FastifyRequest } from 'fastify'
import { env } from '../config/env.js'
import { getCredentials, getSession } from '../services/auth/session-manager.js'
import type { CurrentUser, MailCredentials } from '../types/mail.js'

declare module 'fastify' {
  interface FastifyRequest {
    currentUser?: CurrentUser
    mailCredentials?: MailCredentials
    sessionToken?: string
  }
}

export async function requireAuth(request: FastifyRequest, reply: FastifyReply): Promise<void> {
  const token = request.cookies[env.SESSION_COOKIE_NAME]
  const session = getSession(token)
  if (!session) {
    await reply.status(401).send({ kind: 'unauthorized', message: 'Not authenticated.' })
    return
  }
  request.currentUser = session.user
  request.mailCredentials = getCredentials(session.token)
  request.sessionToken = session.token
}
