import { comparePassword, hashPassword, isAdminEmail, validatePassword } from '../lib/auth.js'
import { prisma } from '../lib/prisma.js'

export async function registerAuthPasswordRoutes(fastify) {
  fastify.post('/api/me/password', { preHandler: [fastify.authenticate] }, async (request, reply) => {
    const userId = request.user.sub
    if (isAdminEmail(request.user.email)) {
      return reply.code(403).send({ error: 'Администратор не может устанавливать пароль' })
    }

    const user = await prisma.user.findUnique({ where: { id: userId } })
    if (!user) return reply.code(404).send({ error: 'Пользователь не найден' })
    if (user.passwordHash) return reply.code(409).send({ error: 'Пароль уже установлен' })

    const password = String(request.body?.password || '')
    const passwordErr = validatePassword(password)
    if (passwordErr) return reply.code(400).send({ error: passwordErr })

    const passwordHash = await hashPassword(password)
    await prisma.user.update({ where: { id: userId }, data: { passwordHash } })

    return { ok: true }
  })

  fastify.post('/api/me/change-password', { preHandler: [fastify.authenticate] }, async (request, reply) => {
    const userId = request.user.sub
    if (isAdminEmail(request.user.email)) {
      return reply.code(403).send({ error: 'Администратор не может менять пароль' })
    }

    const user = await prisma.user.findUnique({ where: { id: userId } })
    if (!user) return reply.code(404).send({ error: 'Пользователь не найден' })
    if (!user.passwordHash)
      return reply.code(400).send({ error: 'Пароль не установлен. Используйте установку пароля.' })

    const oldPassword = String(request.body?.oldPassword || '')
    const valid = await comparePassword(oldPassword, user.passwordHash)
    if (!valid) return reply.code(401).send({ error: 'Неверный текущий пароль' })

    const newPassword = String(request.body?.newPassword || '')
    const passwordErr = validatePassword(newPassword)
    if (passwordErr) return reply.code(400).send({ error: passwordErr })

    const passwordHash = await hashPassword(newPassword)
    await prisma.user.update({ where: { id: userId }, data: { passwordHash } })

    return { ok: true }
  })
}
