import { z } from "zod";
import {
	checkboxGroup,
	customField,
	datetimeOptional,
	datetimeRequired,
	dayMonthYearRequired,
	dualSelectOptional,
	image,
	numberFieldOptional,
	radioGroup,
	select,
	selectDynamicOptional,
	selectOptional,
	stageSelect,
	textAreaOptional,
	textAreaRequired,
	textFieldOptional,
	textFieldRequired,
	timeRangeOptional,
	toggle,
	userSearchOptional,
	weaponPool,
	weaponSelectOptional,
} from "~/form/fields";

export const formFieldsShowcaseSchema = z.object({
	// Text fields
	requiredText: textFieldRequired({
		label: "labels.name",
		maxLength: 100,
	}),
	optionalText: textFieldOptional({
		label: "labels.bio",
		maxLength: 200,
	}),
	optionalNumber: numberFieldOptional({
		label: "labels.vodTeamSize",
	}),

	// Text areas
	requiredTextArea: textAreaRequired({
		label: "labels.description",
		maxLength: 500,
	}),
	optionalTextArea: textAreaOptional({
		label: "labels.text",
		maxLength: 1000,
	}),

	// Toggles
	isPublic: toggle({
		label: "labels.buildPrivate",
	}),
	enableNotifications: toggle({
		label: "labels.isEstablished",
	}),

	// Selects
	requiredSelect: select({
		label: "labels.voiceChat",
		items: [
			{ label: "options.voiceChat.yes", value: "YES" },
			{ label: "options.voiceChat.no", value: "NO" },
			{ label: "options.voiceChat.listenOnly", value: "LISTEN_ONLY" },
		],
	}),
	optionalSelect: selectOptional({
		label: "labels.type",
		items: [
			{ label: "vodTypes.TOURNAMENT", value: "TOURNAMENT" },
			{ label: "vodTypes.CAST", value: "CAST" },
			{ label: "vodTypes.SCRIM", value: "SCRIM" },
		],
	}),
	dynamicSelect: selectDynamicOptional({
		label: "labels.orgSeries",
	}),
	divisionRange: dualSelectOptional({
		fields: [
			{
				label: "labels.scrimMaxDiv",
				items: [
					{ label: () => "S+", value: "S+" },
					{ label: () => "S", value: "S" },
					{ label: () => "A", value: "A" },
					{ label: () => "B", value: "B" },
				],
			},
			{
				label: "labels.scrimMinDiv",
				items: [
					{ label: () => "S+", value: "S+" },
					{ label: () => "S", value: "S" },
					{ label: () => "A", value: "A" },
					{ label: () => "B", value: "B" },
				],
			},
		],
	}),

	// Radio & Checkbox groups
	matchType: radioGroup({
		label: "labels.scrimMaps",
		items: [
			{ label: "options.scrimMaps.noPreference", value: "NO_PREFERENCE" },
			{ label: "options.scrimMaps.szOnly", value: "SZ_ONLY" },
			{ label: "options.scrimMaps.rankedOnly", value: "RANKED_ONLY" },
		],
	}),
	selectedModes: checkboxGroup({
		label: "labels.buildModes",
		items: [
			{ label: "modes.SZ", value: "SZ" },
			{ label: "modes.TC", value: "TC" },
			{ label: "modes.RM", value: "RM" },
			{ label: "modes.CB", value: "CB" },
		],
	}),

	// Date & Time
	requiredDatetime: datetimeRequired({
		label: "labels.startTime",
	}),
	optionalDatetime: datetimeOptional({
		label: "labels.vodDate",
	}),
	birthDate: dayMonthYearRequired({
		label: "labels.banUserExpiresAt",
	}),
	availableTime: timeRangeOptional({
		label: "labels.weekdayTimes",
		startLabel: "labels.start",
		endLabel: "labels.end",
	}),

	// Game-specific fields
	weapons: weaponPool({
		label: "labels.weaponPool",
		maxCount: 5,
		minCount: 0,
	}),
	stage: stageSelect({
		label: "labels.vodStage",
	}),
	weapon: weaponSelectOptional({
		label: "labels.vodWeapon",
	}),
	user: userSearchOptional({
		label: "labels.player",
	}),

	// Image fields
	logo: image({
		label: "labels.logo",
	}),
	banner: image({
		label: "labels.banner",
		dimensions: "thick-banner",
	}),

	// Custom field
	customValue: customField(
		{ initialValue: "custom initial value" },
		z.string().optional(),
	),
});
