<script lang="ts" setup>
	import { Field as veeField, useField, useForm } from "vee-validate";
	import * as yup from "yup";
	import { useRecaptchaProvider } from "vue-recaptcha";

	import { useChallengeV2 } from "vue-recaptcha";
	import { notification } from "ant-design-vue";
	import termsOfServices from "~/components/tos.vue";
	import Recaptcha from "~/components/recaptcha.vue";
	useRecaptchaProvider();

	interface FormState {
		username: string;
		password: string;
		email: string;
		recaptcha?: string | null;
		agree: boolean;
	}
	definePageMeta({
		auth: {
			unauthenticatedOnly: true,
			navigateAuthenticatedTo: "/",
		},
	});
	// const { execute } = useChallengeV3('submit');
	const vschema = yup.object<FormState>().shape({
		username: yup.string().ensure().trim().min(1).required("Username is required!"),
		password: yup.string().ensure().trim().min(8).required("Password is required!"),
		email: yup.string().ensure().trim().email().required("Email is required!"),
		// recaptcha: yup.string().required('Please verify you are human.'),
		agree: yup.boolean().oneOf([true], "Please agree to the terms.").required("Please agree to the terms."),
	});
	const dv: FormState = {
		username: "",
		password: "",
		email: "",
		agree: false,
	};

	const dark = inject<boolean>("dark");

	const { setValues, values, handleSubmit, setFieldValue } = useForm({
		validationSchema: vschema,
		keepValuesOnUnmount: true,
	});

	const onFinish = handleSubmit(async (values: any, actions: any) => {
		// log.debug(values, widgetID);
		// log.debug(widgetID);
		const { signUp } = useAuth();
		let reso;
		try {
			reso = await signUp(values, { callbackUrl: "/" });
		} catch (e: any) {
			// log.debug(e.data);
			if (e.data) {
				notification["error"]({
					message: h("div", { innerHTML: e.data.message }),
				});
			}
		}
	});
	const ts = ref(Date.now());
</script>

<template>
	<form @submit="onFinish">
		<vee-field name="username" v-slot="{ field, errorMessage, value }">
			<a-form-item label="Username" :name="field.name" :validate-status="!!errorMessage ? 'error' : ''" :help="errorMessage">
				<a-input v-bind="field" v-model:value="field.value" />
			</a-form-item>
		</vee-field>
		<vee-field name="email" v-slot="{ field, errorMessage, value }">
			<a-form-item label="Email address" :name="field.name" :validate-status="!!errorMessage ? 'error' : ''" :help="errorMessage">
				<a-input v-bind="field" v-model:value="field.value" />
			</a-form-item>
		</vee-field>
		<vee-field name="password" v-slot="{ field, errorMessage, value }">
			<a-form-item label="Password" :name="field.name" :validate-status="!!errorMessage ? 'error' : ''" :help="errorMessage">
				<a-input-password v-bind="field" v-model:value="field.value" />
			</a-form-item>
		</vee-field>

		<a-typography-title :level="4" :style="{ textAlign: 'center' }">Terms</a-typography-title>
		<div class="maxHeightScroller">
			<div style="height: 100%">
				<terms-of-services />
				<vee-field name="agree" :unchecked-value="false" type="checkbox" v-slot="{ field, value, errorMessage }">
					<a-checkbox
						@update:checked="
							(n) => {
								setValues({ agree: n });
								ts = Date.now();
							}
						"
					>
						I agree to the Terms and am <b>18 years of age or older.</b>
					</a-checkbox>
					<div style="color: red">{{ errorMessage }}</div>
				</vee-field>
			</div>
		</div>
		<recaptcha v-model:ts="ts" @verify="(res) => setFieldValue('recaptcha', res)" />
		<a-row :align="'middle'" justify="center">
			<a-col>
				<a-button size="large" type="primary" html-type="submit">Sign me up!</a-button>
			</a-col>
		</a-row>
	</form>
</template>
<style scoped>
	.maxHeightScroller {
		max-height: 400px;
		overflow-y: scroll;
		display: block;
	}
</style>