"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.LayoutApiImpl = void 0;
const tslib_1 = require("tslib");
const LayoutRedux = tslib_1.__importStar(require("../../Redux/ActionsReducers/LayoutRedux"));
const LayoutRedux_1 = require("../../Redux/ActionsReducers/LayoutRedux");
const ModuleConstants = tslib_1.__importStar(require("../../Utilities/Constants/ModuleConstants"));
const ApiBase_1 = require("./ApiBase");
const StringExtensions_1 = tslib_1.__importDefault(require("../../Utilities/Extensions/StringExtensions"));
const ObjectFactory_1 = tslib_1.__importDefault(require("../../Utilities/ObjectFactory"));
const Helper_1 = tslib_1.__importDefault(require("../../Utilities/Helpers/Helper"));
const Uuid_1 = require("../../AdaptableState/Uuid");
const PopupRedux_1 = require("../../Redux/ActionsReducers/PopupRedux");
const LayoutInternalApi_1 = require("../Internal/LayoutInternalApi");
const LayoutHelpers_1 = require("./LayoutHelpers");
const GeneralConstants_1 = require("../../Utilities/Constants/GeneralConstants");
class LayoutApiImpl extends ApiBase_1.ApiBase {
    constructor(_adaptable) {
        super(_adaptable);
        this.internalApi = new LayoutInternalApi_1.LayoutInternalApi(_adaptable);
    }
    updateCurrentLayout(updateFn) {
        const currentLayout = this.getCurrentLayout();
        const updatedLayout = (0, LayoutHelpers_1.normalizeLayout)(updateFn(structuredClone(currentLayout)));
        this._adaptable.setLayout(updatedLayout);
    }
    isCurrentLayoutPivot() {
        return (0, LayoutHelpers_1.isPivotLayout)(this.getCurrentLayout());
    }
    getLayoutState() {
        return this.getAdaptableState().Layout;
    }
    getCurrentVisibleColumnIdsMapForTableLayout() {
        const layout = this.getCurrentLayout();
        if ((0, LayoutHelpers_1.isPivotLayout)(layout)) {
            return {};
        }
        return layout.TableColumns.reduce((acc, colId) => {
            acc[colId] = true;
            return acc;
        }, {});
    }
    getCurrentVisibleColumnIdsForTableLayout() {
        const layout = this.getCurrentLayout();
        if ((0, LayoutHelpers_1.isPivotLayout)(layout)) {
            return [];
        }
        return layout.TableColumns.filter((colId) => layout.ColumnVisibility?.[colId] !== false);
    }
    getCurrentRowGroupsColumnIds() {
        const layout = this.getCurrentLayout();
        if ((0, LayoutHelpers_1.isPivotLayout)(layout)) {
            return layout.PivotGroupedColumns;
        }
        return layout.RowGroupedColumns;
    }
    setLayout(layoutName) {
        if (StringExtensions_1.default.IsNullOrEmpty(layoutName)) {
            return;
        }
        if (layoutName === this.getCurrentLayoutName()) {
            return;
        }
        let layout = this.getLayoutByName(layoutName);
        if (this.checkItemExists(layout, layoutName, 'Layout')) {
            this.dispatchAction(LayoutRedux.LayoutSelect(layoutName));
        }
    }
    getCurrentLayout() {
        let layoutName = this.getLayoutState().CurrentLayout;
        return this.getLayoutByName(layoutName) ?? GeneralConstants_1.ERROR_LAYOUT;
    }
    getCurrentLayoutColumnSort(columnId) {
        const currentLayout = this.getCurrentLayout();
        return (currentLayout?.ColumnSorts?.find?.((sort) => sort.ColumnId === columnId)?.SortOrder ?? null);
    }
    getCurrentLayoutName() {
        return this.getAdaptableState().Layout.CurrentLayout;
    }
    getLayoutByName(layoutName) {
        if (StringExtensions_1.default.IsNotNullOrEmpty(layoutName)) {
            let layout = this.getLayouts().find((l) => l.Name == layoutName);
            if (this.checkItemExists(layout, layoutName, 'Layout')) {
                return layout;
            }
        }
    }
    getExtendedLayoutByName(layoutName) {
        const layout = this.getLayoutByName(layoutName);
        if (!layout) {
            return undefined;
        }
        const config = {
            includeLayoutNotAssociatedObjects: true,
            associatedWithLayout: layoutName,
        };
        // cannot see a better way than to go through this module by module...
        let extensions = [];
        this.getAlertApi()
            .getAlertDefinitions(config)
            .forEach((obj) => {
            extensions.push({ Module: 'Alert', Object: obj });
        });
        this.getCustomSortApi()
            .getCustomSorts(config)
            .forEach((obj) => {
            extensions.push({ Module: 'CustomSort', Object: obj });
        });
        this.getFlashingCellApi()
            .getFlashingCellDefinitions(config)
            .forEach((obj) => {
            extensions.push({ Module: 'FlashingCell', Object: obj });
        });
        this.getFormatColumnApi()
            .getFormatColumns(config)
            .forEach((obj) => {
            extensions.push({ Module: 'FormatColumn', Object: obj });
        });
        this.getPlusMinusApi()
            .getAllPlusMinus(config)
            .forEach((obj) => {
            extensions.push({ Module: 'PlusMinus', Object: obj });
        });
        this.getScheduleApi()
            .getReminderSchedules(config)
            .forEach((obj) => {
            extensions.push({ Module: 'Schedule', Object: obj });
        });
        this.getScheduleApi()
            .getReportSchedules(config)
            .forEach((obj) => {
            extensions.push({ Module: 'Schedule', Object: obj });
        });
        this.getShortcutApi()
            .getShortcuts(config)
            .forEach((obj) => {
            extensions.push({ Module: 'Shortcut', Object: obj });
        });
        this.getStyledColumnApi()
            .getStyledColumns(config)
            .forEach((obj) => {
            extensions.push({ Module: 'StyledColumn', Object: obj });
        });
        return {
            Layout: layout,
            Extensions: extensions,
        };
    }
    getLayouts() {
        return this.getAdaptableState().Layout.Layouts ?? [];
    }
    getLayoutById(id) {
        return this.getLayouts()?.find((layout) => layout?.Uuid === id);
    }
    saveCurrentLayout() {
        let currentLayout = this.getCurrentLayout();
        if (currentLayout) {
            this.createOrUpdateLayout(currentLayout);
        }
    }
    doesLayoutExist(layout) {
        if (layout == null) {
            return false;
        }
        let existingLayout = this.getLayouts().find((l) => l.Uuid == layout.Uuid || l.Name === layout.Name);
        return existingLayout != null;
    }
    createAndSetLayout(layoutToCreate) {
        const layout = this.createLayout(layoutToCreate);
        if (layout) {
            this.setLayout(layoutToCreate.Name);
        }
        return layout;
    }
    createLayout(layoutToCreate) {
        if (this.doesLayoutExist(layoutToCreate)) {
            this.logError("Cannot create layout with the Name: '" + layoutToCreate.Name + "' as it already exists");
            return false;
        }
        const newLayout = ObjectFactory_1.default.CreateEmptyLayout({ ...layoutToCreate });
        this.addUidToAdaptableObject(newLayout);
        this.dispatchAction(LayoutRedux.LayoutAdd(newLayout));
        return newLayout;
    }
    cloneAndSetLayout(layoutToClone, layoutName) {
        const newLayout = this.cloneLayout(layoutToClone, layoutName);
        if (newLayout) {
            this.setLayout(layoutName);
        }
        return newLayout;
    }
    cloneLayout(layoutToClone, layoutName) {
        if (!this.doesLayoutExist(layoutToClone)) {
            this.logError("Cannot clone layout with Name: '" + layoutName + "' as other Layout does not exist");
            return false;
        }
        const newLayout = Helper_1.default.cloneObject(layoutToClone);
        newLayout.Uuid = (0, Uuid_1.createUuid)();
        newLayout.Name = layoutName;
        this.dispatchAction(LayoutRedux.LayoutAdd(newLayout));
        return this.getLayoutById(newLayout.Uuid);
    }
    setColumnCaption(columnId, caption) {
        if (StringExtensions_1.default.IsNotNullOrEmpty(columnId) && StringExtensions_1.default.IsNotNullOrEmpty(caption)) {
            const currentLayoutName = this.getCurrentLayoutName();
            if (StringExtensions_1.default.IsNotNullOrEmpty(currentLayoutName)) {
                this.dispatchAction(LayoutRedux.LayoutSetColumnCaption(currentLayoutName, columnId, caption));
            }
        }
    }
    createOrUpdateLayout(layout) {
        if (!this.doesLayoutExist(layout)) {
            this.createLayout(layout);
        }
        else {
            this.dispatchAction(LayoutRedux.LayoutSave(layout));
        }
    }
    showChangeColumnCaption(column) {
        const customHeader = this.getCurrentLayout().ColumnHeaders?.[column.columnId] ?? column.friendlyName;
        this.dispatchAction((0, PopupRedux_1.PopupShowPrompt)({
            Header: `Change caption for '${column.friendlyName}'`,
            Msg: '',
            DefaultValue: customHeader,
            ConfirmActionCreator: (inputText) => inputText !== customHeader &&
                (0, LayoutRedux_1.LayoutSetColumnCaption)(this.getCurrentLayoutName(), column.columnId, inputText),
        }));
    }
    openLayoutSettingsPanel() {
        this.showModulePopup(ModuleConstants.LayoutModuleId);
    }
    showLayoutEditor(layoutName, layoutType, action = 'Edit') {
        let preparedAction = action;
        if (!['Edit', 'New', 'Clone'].includes(action)) {
            preparedAction = 'Edit';
            this.logError(`When opening the layout editor the action must be one of: New, Clone, Edit; given: ${action}`);
        }
        let layout = layoutName ? this.getLayoutByName(layoutName) : this.getCurrentLayout();
        if (preparedAction === 'New') {
            layout = null;
        }
        this.showModulePopup(ModuleConstants.LayoutModuleId, {
            source: 'Toolbar',
            action: preparedAction,
            value: layout,
            config: {
                layoutType,
            },
        });
    }
    isCurrentLayoutReadOnly() {
        const currentLayout = this.getCurrentLayout();
        if (currentLayout) {
            return currentLayout.IsReadOnly;
        }
        return true;
    }
    deleteLayout(layout) {
        const layoutCount = this.getLayouts().length;
        if (layoutCount === 1) {
            this.logWarn('You cannot delete the only Layout.  AdapTable always requires one layout');
            return;
        }
        this.dispatchAction(LayoutRedux.LayoutDelete(layout));
    }
    deleteLayoutByName(layoutName) {
        const layout = this.getLayoutByName(layoutName);
        if (!layout) {
            this.logWarn('No Layout exists with that name');
            return;
        }
        return this.deleteLayout(layout);
    }
    removeColumnFromCurrentLayout(columnId) {
        this.removeColumnFromLayout(columnId, this.getCurrentLayoutName());
    }
    removeColumnFromAllLayouts(columnId) {
        this.getLayouts().forEach((layout) => {
            this.removeColumnFromLayout(columnId, layout.Name);
        });
    }
    removeColumnFromLayout(columnId, layoutName) {
        const column = this.getColumnApi().getColumnWithColumnId(columnId);
        if (column) {
            const layout = this.getLayoutByName(layoutName);
            if (layout && !(0, LayoutHelpers_1.isPivotLayout)(layout)) {
                if (layout.TableColumns.includes(columnId)) {
                    this.dispatchAction(LayoutRedux.LayoutRemoveColumn(layoutName, columnId));
                    this.getColumnApi().hideColumn(columnId);
                }
            }
        }
    }
    addColumnToTableLayout(columnId, layoutName) {
        const column = this.getColumnApi().getColumnWithColumnId(columnId);
        if (column) {
            const layout = this.getLayoutByName(layoutName);
            if (layout && !(0, LayoutHelpers_1.isPivotLayout)(layout)) {
                if (!layout.TableColumns.includes(columnId)) {
                    this.dispatchAction(LayoutRedux.LayoutAddColumn(layoutName, columnId));
                    this.getColumnApi().showColumn(columnId);
                }
            }
        }
    }
    addColumnToCurrentTableLayout(columnId) {
        this.addColumnToTableLayout(columnId, this.getCurrentLayoutName());
    }
}
exports.LayoutApiImpl = LayoutApiImpl;
