import type { ValidationRule } from '@/composables/validation/useValidation' import { computed, toValue, type ComputedRef, type MaybeRefOrGetter } from 'vue' export function useLunarCalendarRules( successMessage: MaybeRefOrGetter, required: MaybeRefOrGetter, minYear: MaybeRefOrGetter, maxYear: MaybeRefOrGetter, ): { rules: ComputedRef } { const rules = computed(() => { const rules: ValidationRule[] = [] if (toValue(required)) { const requiredRule: ValidationRule = { type: 'required', options: { message: 'Ce champ est requis.', successMessage: toValue(successMessage), }, } rules.push(requiredRule) } rules.push({ type: 'custom', options: { validate: (value: string) => { // Validate format DD/MM/YYYY const regex = /^\d{2}\/\d{2}\/\d{4}$/ return regex.test(value) }, message: 'La date est invalide.', successMessage: toValue(successMessage), }, }) if (toValue(minYear) && toValue(maxYear)) { const rule: ValidationRule = { type: 'custom', options: { validate: (value: string) => { const year = getYearFromModel(value) if (year === null) { return true } return year >= toValue(minYear as number) && year <= toValue(maxYear as number) }, message: `L'année doit être comprise entre ${toValue(minYear)} et ${toValue(maxYear)}.`, successMessage: toValue(successMessage), }, } rules.push(rule) } else if (toValue(minYear)) { const rule: ValidationRule = { type: 'custom', options: { validate: (value: string) => { const year = getYearFromModel(value) if (year === null) { return true } return year >= toValue(minYear as number) }, message: `L'année doit être supérieure ou égale à ${toValue(minYear)}.`, successMessage: toValue(successMessage), }, } rules.push(rule) } else if (toValue(maxYear)) { const rule: ValidationRule = { type: 'custom', options: { validate: (value: string) => { const year = getYearFromModel(value) if (year === null) { return true } return year <= toValue(maxYear as number) }, message: `L'année doit être inférieure ou égale à ${toValue(maxYear)}.`, successMessage: toValue(successMessage), }, } rules.push(rule) } return rules }) return { rules: rules } } function getYearFromModel(model: string): number | null { const parts = model.split('/') if (parts.length !== 3 || parts[2]?.length !== 4 || isNaN(Number(parts[2]))) { return null } return Number(parts[2]) }