import {useState} from 'react';
import {toastWarn} from "../services/toaster";

export interface FORM_RULES {
    [key: string]: {
        condition: (e: any) => boolean,
        message: string
    }
}
interface VALID_FIELDS {
    [key: string]: VALIDITY
}
type VALIDITY = 'valid' | 'invalid' | 'error'
const initValidField = (rules: FORM_RULES, initialForm?: any): VALID_FIELDS => {
    const newValidFields: VALID_FIELDS = {}
    Object.keys(rules).forEach(field => {
        // @ts-ignore
        let validity: VALIDITY = 'invalid'
        /*
            IF FORM HAS INITIAL VALUES CHECK WHICH ARE VALID
         */
        if (initialForm) {
            const value = initialForm[field];
            // @ts-ignore
            const valid = rules[field].condition(value)
            if (valid) validity = "valid"
            // @ts-ignore
        }
        newValidFields[field] = validity;
    })
    return newValidFields

}

const WOLD_useFormValidate = (form_rules: FORM_RULES, initialForm?: any) => {
    const [validFields, setValidFields] = useState<VALID_FIELDS>(initValidField(form_rules, initialForm))
    const validateField = (field: string, value: any) => {
        // @ts-ignore
        const valid = form_rules[field].condition(value)
        setValidFields({
            ...validFields,
            [field]: valid ? 'valid' : 'error'
        })
    }
    const validateForm = (form: any) => {
        let isValid = true
        const newValidFields: VALID_FIELDS = {}
        Object.keys(form_rules).forEach(field => {
            const value = form[field];
            // @ts-ignore
            const valid = form_rules[field].condition(value)
            if (!valid) isValid = false
            newValidFields[field] = valid ? 'valid' : 'error'

        })
        setValidFields(newValidFields)
        if(!isValid){
            toastWarn('Παρακαλώ ελέγξτε τα πεδία της φόρμας')
        }
        return isValid;
    }
    return [validFields, validateField, validateForm] as const
}
export default WOLD_useFormValidate;