import { fail } from '@sveltejs/kit';
import type { PageServerLoad } from './$types';
import type { Actions } from './$types';
import auth from '$lib/server/auth';
import prisma from '$lib/server/prisma';
import { sendEmail } from '$lib/server/mailService';
import { RECAPTCHA_SECRET_KEY } from '$env/static/private';
import { validateRegistration } from '$lib/validations';

export const load = (async ({ locals }) => {
	// if (locals.user) { throw redirect(303, '/') }
}) satisfies PageServerLoad;

export const actions: Actions = {
	default: async ({ request, url, fetch }) => {
		const formData = Object.fromEntries(await request.formData() as any);
		const validation = validateRegistration(formData);

		if (!validation.success) {
			return fail(400, {
				data: formData,
				errors: validation.errors
			});
		}

		const {
			name,
			email,
			phoneNumber,
			idNumber,
			password,
			postalCode,
			address,
			'g-recaptcha-response': recaptchaToken
		} = validation.data!; // or = validation.data ?? {}

		try {
			const secret = RECAPTCHA_SECRET_KEY;
			if (!secret) {
				console.error('No reCAPTCHA secret found in environment variables.');
				return fail(500, {
					data: { name, email, phoneNumber, idNumber },
					errors: { _errors: ['reCAPTCHA Error'] }
				});
			}

			const user = await prisma.user.findUnique({
				where: { email: email.toString() }
			});
			if (user) {
				return fail(400, {
					data: { name, email, phoneNumber, idNumber },
					errors: { email: ['Email is already in use. Please log in.'] }
				});
			}

			const verificationURL = 'https://www.google.com/recaptcha/api/siteverify';
			const response = await fetch(verificationURL, {
				method: 'POST',
				body: new URLSearchParams({
					secret,
					response: recaptchaToken
				})
			});
			const verificationRes = await response.json();
			console.log('reCAPTCHA verification data: \n ', verificationRes);

			// if (!verificationRes.success) {
			// 	return fail(400, {
			// 		data: { name, email, phoneNumber, idNumber },
			// 		errors: { 'g-recaptcha-response': ['reCAPTCHA verification failed.'] }
			// 	});
			// }

			const hashedPassword = await auth.hash(password.toString());
			const newUser = await prisma.user.create({
				data: {
					name: name.toString(),
					email: email.toString(),
					idNumber: parseInt(idNumber),
					phoneNumber: phoneNumber.toString(),
					password: hashedPassword,
					postalCode: postalCode.toString(),
					address: address.toString(),
					role: { connect: { name: 'USER' } }
				}
			});

			//Send email verification
			const token = auth.generateEmailVerificationToken(newUser.email);
			const link = url.origin + `/verify?token=${token}`;
			const isEmailSent = await sendEmail(newUser.email, `${newUser.name}, Verify Your Email`, 'verify-email', {
				username: name,
				origin: url.origin,
				link
			});
			console.log('Email Sent?: ', isEmailSent);

			return { status: 200, body: { message: 'User created successfully', isEmailSent } };

			// Register user and Login immediately
			// const token = auth.sign(newUser);
			// const refreshToken = await auth.generateRefreshToken(newUser);

			// cookies.set('token', token, { httpOnly: true, secure: secure, path: '/', maxAge });
			// cookies.set('refreshToken', refreshToken, {
			// 	httpOnly: true,
			// 	secure: secure,
			// 	path: '/',
			// 	maxAge: refreshTokenMaxAge
			// });

			// console.log(
			// 	'is Email Sent: --\n',
			// 	await sendEmail(newUser.email, `Welcome ${newUser.name}`, 'welcome', { username: name, email })
			// );
		} catch (e) {
			console.log(e);
			return fail(500, {
				data: { name, email, phoneNumber, idNumber, address, postalCode },
				errors: { _errors: ['An unexpected error occurred'] }
			});
		}
	}
};
