import { useCallback, useContext } from "react";
import { uid } from "@tachybase/schema";
import { cloneDeep } from "lodash";
import { useAPIClient } from "../api-client/index.mjs";
import { useCollectionManager_deprecated } from "../collection-manager/index.mjs";
import { DEFAULT_DATA_SOURCE_KEY } from "../data-source/index.mjs";
import { SchemaTemplateManagerContext, regenerateUid } from "./SchemaTemplateManagerProvider.mjs";
const useSchemaTemplateManager = ()=>{
    const { getInheritCollections } = useCollectionManager_deprecated();
    const { refresh, templates = [] } = useContext(SchemaTemplateManagerContext);
    const api = useAPIClient();
    return {
        templates,
        refresh,
        async getTemplateSchemaByMode (options) {
            const { mode, template } = options;
            if ('copy' === mode) {
                const { data } = await api.request({
                    url: "/uiSchemas:getJsonSchema/".concat(template.uid, "?includeAsyncNode=true")
                });
                const s = (null == data ? void 0 : data.data) || {};
                regenerateUid(s);
                return cloneDeep(s);
            }
            if ('reference' === mode) return {
                type: 'void',
                'x-component': 'BlockTemplate',
                'x-component-props': {
                    templateId: template.key
                }
            };
        },
        async copyTemplateSchema (template) {
            const { data } = await api.request({
                url: "/uiSchemas:getJsonSchema/".concat(template.uid, "?includeAsyncNode=true")
            });
            const s = (null == data ? void 0 : data.data) || {};
            regenerateUid(s);
            return cloneDeep(s);
        },
        async saveAsTemplate (values) {
            const { uid: schemaId } = values;
            const key = uid();
            await api.resource('uiSchemas').saveAsTemplate({
                filterByTk: schemaId,
                values: {
                    key,
                    ...values
                }
            });
            await refresh();
            return {
                key
            };
        },
        getTemplateBySchema: useCallback((schema)=>{
            if (!schema) return;
            const templateKey = schema['x-template-key'];
            if (templateKey) return null == templates ? void 0 : templates.find((template)=>template.key === templateKey);
            const schemaId = schema['x-uid'];
            if (schemaId) return null == templates ? void 0 : templates.find((template)=>template.uid === schemaId);
        }, [
            templates
        ]),
        getTemplateBySchemaId (schemaId) {
            if (!schemaId) return null;
            return null == templates ? void 0 : templates.find((template)=>template.uid === schemaId);
        },
        getTemplateById (key) {
            return null == templates ? void 0 : templates.find((template)=>template.key === key);
        },
        getTemplatesByCollection (dataSource, collectionName) {
            var _templates_filter;
            const parentCollections = getInheritCollections(collectionName, dataSource);
            const totalCollections = parentCollections.concat([
                collectionName
            ]);
            const items = null == templates ? void 0 : null == (_templates_filter = templates.filter) ? void 0 : _templates_filter.call(templates, (template)=>(template.dataSourceKey || DEFAULT_DATA_SOURCE_KEY) === dataSource && totalCollections.includes(template.collectionName));
            return items || [];
        },
        getTemplatesByComponentName (componentName) {
            var _templates_filter;
            const items = null == templates ? void 0 : null == (_templates_filter = templates.filter) ? void 0 : _templates_filter.call(templates, (template)=>template.componentName === componentName);
            return items || [];
        }
    };
};
export { useSchemaTemplateManager };
