import { useRef } from "react";
import { FILE_TYPES } from "./FileInput.register";
import { MemoDataProvider } from "../MemoDataProvider/MemoDataProvider";
export function FileInput({ name, onChange, onInvalidFileInput, types, multiple, maxSize, children, }) {
    const inputRef = useRef(null);
    const resolvedTypes = resolveTypes(types);
    function handleFilesChange(e) {
        const fileList = e.target.files;
        if (!fileList)
            return;
        const files = Array.from(fileList);
        const { valid, invalid } = validateFiles(files, resolvedTypes, maxSize);
        if (valid.length)
            onChange?.(valid);
        if (invalid.length)
            onInvalidFileInput?.(invalid);
        if (inputRef.current) {
            inputRef.current.value = "";
        }
    }
    function handleClick() {
        inputRef.current?.click();
    }
    const accept = getAccept(resolvedTypes);
    return (<>
      <input type="file" ref={inputRef} accept={accept} multiple={multiple} onChange={handleFilesChange} hidden/>
      <MemoDataProvider name={name} data={{
            openFilePicker: handleClick,
        }} deps={[]}>
        {children}
      </MemoDataProvider>
    </>);
}
function resolveTypes(types) {
    return (types?.flatMap((type) => type in FILE_TYPES ? FILE_TYPES[type] : [type]) ?? []);
}
function getAccept(types) {
    if (!types.length)
        return undefined;
    return types.join(",");
}
function validateFiles(files, types, maxSize) {
    const valid = [];
    const invalid = [];
    for (const file of files) {
        if (!isFileSizeValid(file, maxSize)) {
            invalid.push({ fileName: file.name, reason: "File is too large" });
            continue;
        }
        if (!isFileFormatValid(file, types)) {
            invalid.push({ fileName: file.name, reason: "Unsupported file format" });
            continue;
        }
        valid.push(file);
    }
    return { valid, invalid };
}
function isFileSizeValid(file, maxSize) {
    if (maxSize && file.size > maxSize) {
        return false;
    }
    return true;
}
function isFileFormatValid(file, allowedFormats) {
    if (!allowedFormats.length)
        return true;
    const normalizedFileFormats = allowedFormats.map((format) => format.trim().toLowerCase());
    const mimeType = file.type.toLowerCase();
    const fileNameParts = file.name.toLowerCase().split(".");
    const fileExtension = fileNameParts.length > 1 ? `.${fileNameParts.pop()}` : "";
    return normalizedFileFormats.some((format) => format === fileExtension ||
        format === mimeType ||
        (format.endsWith("/*") &&
            mimeType.startsWith(format.split("/")[0] + "/")));
}
//# sourceMappingURL=FileInput.jsx.map