import User from '#models/user'
import UserPref from '#models/user_pref'
import { signupValidator } from '#validators/user'
import type { HttpContext } from '@adonisjs/core/http'
import UserTransformer from '#transformers/user_transformer'
import EmailVerificationController from '#controllers/email_verification_controller'
import { DateTime } from 'luxon'
import logger from '@adonisjs/core/services/logger'
import { v7 as uuidv7 } from 'uuid'

export default class NewAccountController {
  async store({ request, serialize }: HttpContext) {
    const { email, username, password, dateOfBirth, sex, locale } =
      await request.validateUsing(signupValidator)

    const userId = uuidv7()
    const user = await User.create({
      id: userId,
      email,
      username,
      password,
      dateOfBirth,
      sex,
      agreedToTos: DateTime.now(),
      status: 'pending',
    })
    user.id = userId // Lucid overwrites id with lastInsertId after insert; restore the correct UUID

    await UserPref.create({ id: uuidv7(), userId, locale, profileVisibility: 'public' })
    await user.related('roles').attach({
      '00000000-0000-7000-a000-000000000000': { assigned_at: DateTime.now().toUTC().toFormat('yyyy-MM-dd HH:mm:ss') },
    })

    await EmailVerificationController.sendVerificationEmail(user, locale).catch((err) => {
      logger.error({ err }, 'Failed to send verification email to %s', user.email)
    })

    return serialize({ user: UserTransformer.transform(user) })
  }
}
