<script lang="ts" setup>
	import { debounce } from "lodash-es";
	import { useField } from "vee-validate";
	import { IUser } from "@models/user";
	const props = defineProps<{
		fieldName: string;
		multi: boolean;
		initialOption:
			| number
			| {
					label: string;
					value: number;
			  }
			| null;
	}>();

	let initO;
	if (typeof props.initialOption == "number") {
		const { data } = await useApiFetch<IUser>(`/user/${props.initialOption}`);
		initO = {
			label: data.value.username,
			value: data.value._id,
		};
	} else if (typeof props.initialOption == "object") {
		initO = props.initialOption;
	}

	const state = reactive<{
		data: { value: number; label: string }[];
		fetching: boolean;
	}>({
		data: props.initialOption ? [initO] : [],
		fetching: false,
	});
	let fieldo = useField<number | number[]>(props.fieldName, undefined, {
		// @ts-ignore
		initialValue: initO?.value || null,
	});

	const { value, errorMessage, name, setValue } = fieldo;

	const fetchUsers = debounce((value) => {
		state.fetching = true;
		useApiFetch<{ _id: number; username: string }[]>(`/all-users`, {
			query: {
				name: value,
			},
		}).then(({ data }) => {
			const blip = data.value?.map((a) => ({
				label: a.username,
				value: a._id,
			}));
			state.data = blip!;
			state.fetching = false;
		});
	}, 750);
</script>
<template>
	<a-select
		option-filter-prop="label"
		:show-search="true"
		@search="fetchUsers"
		:filter-option="true"
		style="width: 100%"
		placeholder="Find a user..."
		:mode="multi ? 'multiple' : undefined"
		:options="state.data"
		v-model:value="value"
		:allow-clear="true"
		v-bind="$attrs"
	>
		<template v-if="state.fetching" #notFoundContent>
			<a-spin size="small" />
		</template>
	</a-select>
</template>