"use strict";
var __assign = (this && this.__assign) || function () {
    __assign = Object.assign || function(t) {
        for (var s, i = 1, n = arguments.length; i < n; i++) {
            s = arguments[i];
            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
                t[p] = s[p];
        }
        return t;
    };
    return __assign.apply(this, arguments);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.DockviewSolid = void 0;
var solid_js_1 = require("solid-js");
var dockview_core_1 = require("dockview-core");
var solidHeaderActionsRendererPart_1 = require("./solidHeaderActionsRendererPart");
var solidContentPart_1 = require("./solidContentPart");
var solidHeaderPart_1 = require("./solidHeaderPart");
var solidWatermarkPart_1 = require("./solidWatermarkPart");
var DEFAULT_SOLID_TAB = "props.defaultTabComponent";
function createGroupControlPart(component) {
    return component
        ? function (groupPanel) {
            return new solidHeaderActionsRendererPart_1.SolidHeaderActionsRendererPart(component, groupPanel);
        }
        : undefined;
}
function extractCoreOptions(props) {
    var coreOptions = {};
    dockview_core_1.PROPERTY_KEYS_DOCKVIEW.forEach(function (key) {
        if (key in props) {
            coreOptions[key] = props[key];
        }
    });
    return coreOptions;
}
var DockviewSolid = function (props) {
    var container;
    var api;
    (0, solid_js_1.onMount)(function () {
        if (!container)
            return;
        var frameworkTabComponents = props.tabComponents || {};
        if (props.defaultTabComponent) {
            frameworkTabComponents[DEFAULT_SOLID_TAB] = props.defaultTabComponent;
        }
        var frameworkOptions = {
            createLeftHeaderActionComponent: createGroupControlPart(props.leftHeaderActionsComponent),
            createRightHeaderActionComponent: createGroupControlPart(props.rightHeaderActionsComponent),
            createPrefixHeaderActionComponent: createGroupControlPart(props.prefixHeaderActionsComponent),
            createComponent: function (options) {
                return new solidContentPart_1.SolidPanelContentPart(options.id, props.components[options.name]);
            },
            createTabComponent: function (options) {
                return new solidHeaderPart_1.SolidPanelHeaderPart(options.id, frameworkTabComponents[options.name]);
            },
            createWatermarkComponent: props.watermarkComponent
                ? function () { return new solidWatermarkPart_1.SolidWatermarkPart("watermark", props.watermarkComponent); }
                : undefined,
            defaultTabComponent: props.defaultTabComponent
                ? DEFAULT_SOLID_TAB
                : undefined,
        };
        api = (0, dockview_core_1.createDockview)(container, __assign(__assign({}, extractCoreOptions(props)), frameworkOptions));
        api.layout(container.clientWidth, container.clientHeight);
        props.onReady({ api: api });
    });
    (0, solid_js_1.onCleanup)(function () {
        if (api)
            api.dispose();
    });
    (0, solid_js_1.createEffect)(function () {
        if (!api)
            return;
        var frameworkTabComponents = props.tabComponents || {};
        if (props.defaultTabComponent) {
            frameworkTabComponents[DEFAULT_SOLID_TAB] = props.defaultTabComponent;
        }
        api.updateOptions({
            createTabComponent: function (options) {
                return new solidHeaderPart_1.SolidPanelHeaderPart(options.id, frameworkTabComponents[options.name]);
            },
            defaultTabComponent: props.defaultTabComponent
                ? DEFAULT_SOLID_TAB
                : undefined,
        });
    });
    (0, solid_js_1.createEffect)(function () {
        if (api) {
            var changes_1 = {};
            dockview_core_1.PROPERTY_KEYS_DOCKVIEW.forEach(function (key) {
                if (key in props) {
                    // cast changes to any to allow dynamic property assignment
                    changes_1[key] = props[key];
                }
            });
            api.updateOptions(changes_1);
        }
    });
    (0, solid_js_1.createEffect)(function () {
        if (api && props.onDidDrop) {
            var disp_1 = api.onDidDrop(function (event) { return props.onDidDrop(event); });
            (0, solid_js_1.onCleanup)(function () { return disp_1.dispose(); });
        }
    });
    (0, solid_js_1.createEffect)(function () {
        if (api && props.onWillDrop) {
            var disp_2 = api.onWillDrop(function (event) { return props.onWillDrop(event); });
            (0, solid_js_1.onCleanup)(function () { return disp_2.dispose(); });
        }
    });
    return (<div style={{ height: "100%", width: "100%" }} ref={function (el) { return (container = el); }}/>);
};
exports.DockviewSolid = DockviewSolid;
exports.default = exports.DockviewSolid;
