import { AbstractFormField, FormModel } from '../interfaces'
import { createDefaultFormField  } from '../data'
import { FormState } from '../reducers'
import { FORM_REDUCER_KEY } from '../reducers'

/**
 * Return all the data in a named form
 *
 * @param state
 * @param formKey
 */
export const getForm = (state: any, formKey: string) =>
    state[FORM_REDUCER_KEY][formKey] || {}

/**
 * Get the data for a single form field
 *
 * @param state
 * @param formKey
 * @param fieldKey
 */
export const getFormField = (state: any, formKey: string, fieldKey: string) => {
    const form = state[FORM_REDUCER_KEY][formKey]
    if (form) {
        return form[fieldKey] || {}
    } else {
        return state[FORM_REDUCER_KEY][fieldKey] || {}
    }
}

/**
 * Either return an existing form field
 * Or initialize a new one via a custom function
 *
 * @param state
 * @param ownProps
 * @param initializeField
 */
export const mapStateToField = (
    state: FormState,
    ownProps: any,
    initializeField: (ownProps: any) => AbstractFormField<any> = createDefaultFormField) => {
        if (ownProps.formName) {
            // eg. state.forms.formName.fieldName
            const form = (state[ownProps.formName] as FormModel)
            return form ? form[ownProps.name] : initializeField(ownProps)
        }
        // eg state.forms.fieldName
        return state[ownProps.name] ? state[ownProps.name] : initializeField(ownProps)
    }