import { prisma } from '~/server/utils/prisma'

export default defineEventHandler(async (event) => {
  const config = useRuntimeConfig()
  const query = getQuery(event)
  const code = String(query.code || '')

  if (!code) {
    throw createError({ statusCode: 400, statusMessage: 'Code manquant' })
  }

  const tokenRes = await $fetch<{ access_token: string }>('https://oauth2.googleapis.com/token', {
    method: 'POST',
    body: {
      code,
      client_id: config.googleClientId,
      client_secret: config.googleClientSecret,
      redirect_uri: config.googleRedirectUri,
      grant_type: 'authorization_code',
    },
  })

  const profile = await $fetch<{ sub: string; email: string; name: string }>('https://www.googleapis.com/oauth2/v3/userinfo', {
    headers: { Authorization: `Bearer ${tokenRes.access_token}` },
  })

  let user = await prisma.user.findFirst({ where: { OR: [{ googleId: profile.sub }, { email: profile.email }] } })

  if (!user) {
    user = await prisma.user.create({
      data: { email: profile.email, name: profile.name, googleId: profile.sub, role: 'candidat' },
    })
  } else if (!user.googleId) {
    user = await prisma.user.update({ where: { id: user.id }, data: { googleId: profile.sub } })
  }

  await setUserSession(event, {
    user: { id: user.id, email: user.email, name: user.name, role: user.role, memberId: user.memberId },
  })

  return sendRedirect(event, '/')
})
