import { createContext, useState, useCallback, useMemo } from 'react';
import { createUID, hasProp, useAfterInitialEffect } from '@pega/cosmos-react-core';
export const FileServiceContext = createContext({
    files: [],
    setFiles: () => { },
    attachFile: () => { },
    cancelFile: () => { },
    deleteFile: () => { }
});
const postFile = ({ file, onProgress, onLoad, currentProgress }) => {
    onProgress(file, currentProgress);
    setTimeout(() => {
        const progress = currentProgress + 5;
        if (progress <= 100)
            postFile({ file, onProgress, onLoad, currentProgress: progress });
        else
            onLoad(file);
    }, 100);
};
const getMockPriorDate = (h) => {
    const d = new Date();
    return d.setHours(d.getHours() - h);
};
export const mockCategories = [
    'HR',
    'Marketing',
    'Sales',
    'Accounting',
    'Engineering'
];
export const mockAttachmentListRequest = () => {
    return new Promise(resolve => {
        setTimeout(() => {
            resolve([
                {
                    id: createUID(),
                    name: 'File.doc',
                    category: mockCategories[0],
                    createDate: getMockPriorDate(1)
                },
                {
                    id: createUID(),
                    name: 'File.ppt',
                    category: mockCategories[1],
                    createDate: getMockPriorDate(4)
                },
                {
                    id: createUID(),
                    name: 'File.xls',
                    category: mockCategories[2],
                    createDate: getMockPriorDate(30)
                },
                {
                    id: createUID(),
                    name: 'emptyFile',
                    category: '',
                    createDate: getMockPriorDate(144)
                }
            ]);
        }, 1000);
    });
};
const Provider = ({ children }) => {
    const [files, setFiles] = useState([]);
    const attachFile = useCallback((file) => {
        if (files.some(f => f.id === file.id))
            return;
        setFiles(current => [file, ...current]);
    }, [files]);
    const cancelFile = (id) => {
        setFiles(current => current.filter(f => f.id !== id));
    };
    const deleteFile = useCallback(async (id) => {
        const file = files.find(f => f.id === id);
        setFiles(current => current.filter(f => f.id !== file.id));
    }, [files]);
    const setProgress = useCallback((file, progress) => {
        setFiles(current => current.map(f => {
            if (file.id === f.id) {
                f.progress = progress;
            }
            return f;
        }));
    }, []);
    useAfterInitialEffect(() => {
        files.forEach(file => {
            if (!hasProp(file, 'File') || typeof file.progress === 'number')
                return;
            postFile({
                file,
                onProgress: setProgress,
                currentProgress: 0,
                onLoad(loadedFile) {
                    setFiles(cur => {
                        return cur.map(f => {
                            if (f.id === loadedFile.id) {
                                return {
                                    ...loadedFile,
                                    createDate: Date.now()
                                };
                            }
                            return f;
                        });
                    });
                }
            });
        });
    }, [files.length, setProgress]);
    const value = useMemo(() => ({
        files,
        setFiles,
        attachFile,
        cancelFile,
        deleteFile
    }), [files, attachFile, cancelFile, deleteFile]);
    return <FileServiceContext.Provider value={value}>{children}</FileServiceContext.Provider>;
};
export default Provider;
//# sourceMappingURL=FileService.mock.jsx.map