import dayjs from "dayjs";
import {useReducer} from "react";
import {DPassCreateForm} from "../models/DPass/NewInvitation";

interface Action {
    type: 'add_date' | 'remove_date' | 'array' | 'property' | 'add_visitors' | 'remove_visitor' | 'reset' | 'remove_all_visitors'
    property?: string
    index?: number
    value?: any
}

const useDpassForm = (FormInit:DPassCreateForm) => {

    function reducer(state: DPassCreateForm, action: Action) {
        const {type, property, value, index = -1} = action
        //DEEP COPY PREVIOUS STATE
        // const newState: DPassCreateForm = JSON.parse(JSON.stringify(state));
        const newState: DPassCreateForm =  {...state};

        switch (type) {
            case "add_date":
                const lastDay = newState.visits_dates[newState.visits_dates.length - 1]
                newState.visits_dates.push(lastDay.add(1, 'day'));
                newState.visits_from.push(dayjs().hour(8).minute(0));
                newState.visits_to.push(dayjs().hour(20).minute(0));
                break;

            case "remove_date":
                newState.visits_dates.splice(index, 1);
                newState.visits_from.splice(index, 1);
                newState.visits_to.splice(index, 1);
                break;

            case "remove_visitor":
                newState.visitors_emails.splice(index, 1);
                break;

            case "remove_all_visitors":
                newState.visitors_emails= [];
                break;

            case "array":
                // @ts-ignore
                newState[property][index] = value
                break;

            case 'property':
                // @ts-ignore
                newState[property] = value
                break;

            case 'add_visitors':
                // @ts-ignore
                newState.visitors_emails.unshift(...value)
                break;
            case 'reset':
                // @ts-ignore
                return FormInit;

        }
        return newState
    }

    const [formData, dispatch] = useReducer(reducer, FormInit);

    return [formData, dispatch] as const
}
export default useDpassForm
