import { ComplianceStatus, type FormElementDto } from '~~/.api-client' import { complianceCheckableElementTypes, complianceMap } from './complianceMap' import type { FormElementId } from '~~/types/formElement' import { useLogger } from './useLogger' const formElementComplianceMap = ref(new Map()) export function useApplicationFormValidator() { const logger = useLogger().withTag('validator') function getHighestComplianceStatus(): ComplianceStatus { const complianceStatusValues = Array.from(formElementComplianceMap.value.values()) const highestComplianceNumber = Math.max( ...complianceStatusValues.map((complianceStatus) => Object.values(ComplianceStatus).indexOf(complianceStatus)) ) return Object.values(ComplianceStatus)[highestComplianceNumber] ?? ComplianceStatus.NonCritical } function validateFormElements( formElements: FormElementDto[], visibilityMap?: Map ): Map { formElementComplianceMap.value.clear() formElements.forEach((formElement, index) => { const elementKey = formElement.id || formElement.reference || `element-${index}` if (visibilityMap && visibilityMap.get(elementKey) === false) { return } if (!complianceCheckableElementTypes.includes(formElement.type)) return // Reset any previously set compliance status when all options are false const hasAtLeastOneOptionSet = formElement.options.some((option) => option.value && option.value !== 'false') if (!hasAtLeastOneOptionSet) { // No value set, continue with next form element return } formElement.options.forEach((option) => { if (!option.value) { logger.debug(`Value missing for ${formElement.type}`) return } // Value not set to true, continue with next option if (option.value === 'false') { return } const currentHighestComplianceStatus = complianceMap?.get(option.processingPurpose)?.get(option.employeeDataCategory) ?? ComplianceStatus.NonCritical const currentHighestComplianceStatusPos = Object.values(ComplianceStatus).indexOf(currentHighestComplianceStatus) if (formElementComplianceMap.value.has(elementKey)) { const newComplianceStatus = formElementComplianceMap.value.get(elementKey)! const newComplianceStatusPos = Object.values(ComplianceStatus).indexOf(newComplianceStatus) if (newComplianceStatusPos > currentHighestComplianceStatusPos) { formElementComplianceMap.value.set(elementKey, newComplianceStatus) } } else { formElementComplianceMap.value.set(elementKey, currentHighestComplianceStatus) } }) }) return formElementComplianceMap.value } return { getHighestComplianceStatus, validateFormElements } }