import { __esDecorate, __runInitializers } from "tslib";
import { html, nothing } from 'lit';
import { property, state } from 'lit/decorators.js';
import { ApiEditor } from './ApiEditor.js';
import { apiActionKindToIcon } from '../lib/ui_mapping.js';
import { renderHelp } from '../../help/render.js';
let ApiDeleteActionEditor = (() => {
    let _classSuper = ApiEditor;
    let _exposed_decorators;
    let _exposed_initializers = [];
    let _exposed_extraInitializers = [];
    let _entity_decorators;
    let _entity_initializers = [];
    let _entity_extraInitializers = [];
    let _action_decorators;
    let _action_initializers = [];
    let _action_extraInitializers = [];
    let _showCloseButton_decorators;
    let _showCloseButton_initializers = [];
    let _showCloseButton_extraInitializers = [];
    let _activeTab_decorators;
    let _activeTab_initializers = [];
    let _activeTab_extraInitializers = [];
    return class ApiDeleteActionEditor extends _classSuper {
        static {
            const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
            _exposed_decorators = [state()];
            _entity_decorators = [state()];
            _action_decorators = [state()];
            _showCloseButton_decorators = [property({ type: Boolean })];
            _activeTab_decorators = [state()];
            __esDecorate(this, null, _exposed_decorators, { kind: "accessor", name: "exposed", static: false, private: false, access: { has: obj => "exposed" in obj, get: obj => obj.exposed, set: (obj, value) => { obj.exposed = value; } }, metadata: _metadata }, _exposed_initializers, _exposed_extraInitializers);
            __esDecorate(this, null, _entity_decorators, { kind: "accessor", name: "entity", static: false, private: false, access: { has: obj => "entity" in obj, get: obj => obj.entity, set: (obj, value) => { obj.entity = value; } }, metadata: _metadata }, _entity_initializers, _entity_extraInitializers);
            __esDecorate(this, null, _action_decorators, { kind: "accessor", name: "action", static: false, private: false, access: { has: obj => "action" in obj, get: obj => obj.action, set: (obj, value) => { obj.action = value; } }, metadata: _metadata }, _action_initializers, _action_extraInitializers);
            __esDecorate(this, null, _showCloseButton_decorators, { kind: "accessor", name: "showCloseButton", static: false, private: false, access: { has: obj => "showCloseButton" in obj, get: obj => obj.showCloseButton, set: (obj, value) => { obj.showCloseButton = value; } }, metadata: _metadata }, _showCloseButton_initializers, _showCloseButton_extraInitializers);
            __esDecorate(this, null, _activeTab_decorators, { kind: "accessor", name: "activeTab", static: false, private: false, access: { has: obj => "activeTab" in obj, get: obj => obj.activeTab, set: (obj, value) => { obj.activeTab = value; } }, metadata: _metadata }, _activeTab_initializers, _activeTab_extraInitializers);
            if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
        }
        #exposed_accessor_storage = __runInitializers(this, _exposed_initializers, void 0);
        /**
         * Computed exposed entity being edited.
         */
        get exposed() { return this.#exposed_accessor_storage; }
        set exposed(value) { this.#exposed_accessor_storage = value; }
        #entity_accessor_storage = (__runInitializers(this, _exposed_extraInitializers), __runInitializers(this, _entity_initializers, void 0));
        /**
         * Computed domain entity that corresponds to the exposed entity being edited.
         */
        get entity() { return this.#entity_accessor_storage; }
        set entity(value) { this.#entity_accessor_storage = value; }
        #action_accessor_storage = (__runInitializers(this, _entity_extraInitializers), __runInitializers(this, _action_initializers, void 0));
        /**
         * Computed delete action definition being edited.
         */
        get action() { return this.#action_accessor_storage; }
        set action(value) { this.#action_accessor_storage = value; }
        #showCloseButton_accessor_storage = (__runInitializers(this, _action_extraInitializers), __runInitializers(this, _showCloseButton_initializers, false
        /**
         * The currently active tab index.
         */
        ));
        /**
         * When true, shows a close button in the editor header.
         * @attribute
         */
        get showCloseButton() { return this.#showCloseButton_accessor_storage; }
        set showCloseButton(value) { this.#showCloseButton_accessor_storage = value; }
        #activeTab_accessor_storage = (__runInitializers(this, _showCloseButton_extraInitializers), __runInitializers(this, _activeTab_initializers, 0));
        /**
         * The currently active tab index.
         */
        get activeTab() { return this.#activeTab_accessor_storage; }
        set activeTab(value) { this.#activeTab_accessor_storage = value; }
        setupModel(model, domainKey) {
            this.exposed = undefined;
            this.entity = undefined;
            this.action = undefined;
            if (!model || !domainKey) {
                return;
            }
            const exposed = model.exposes.find((exposed) => exposed.key === domainKey);
            this.exposed = exposed;
            if (!exposed) {
                return;
            }
            const domain = model.domain;
            if (!domain) {
                return;
            }
            const entity = domain.findEntity(exposed.entity.key, exposed.entity.domain);
            if (!entity) {
                return;
            }
            this.entity = entity;
            const action = exposed.actions.find((action) => action.kind === 'delete');
            this.action = action;
        }
        handleCloseButtonClick() {
            this.dispatchEvent(new Event('close'));
        }
        /**
         * Handles tab change events.
         */
        handleTabChange(e) {
            this.activeTab = e.detail.index;
        }
        handleConfigurationChange() {
            this.notifyChange();
        }
        handleDeleteStrategyChange(e) {
            const { value } = e.detail;
            if (!value) {
                return;
            }
            this.updateDeleteStrategy(value);
        }
        updateDeleteStrategy(strategy) {
            if (!['soft', 'hard'].includes(strategy)) {
                throw new Error(`Invalid delete strategy: ${strategy}.`);
            }
            if (!this.action) {
                throw new Error('No action is set.');
            }
            this.action.strategy = strategy;
            this.notifyChange();
            this.requestUpdate();
        }
        handleRetentionPeriodChange(e) {
            const input = e.target;
            const value = input.valueAsNumber;
            if (isNaN(value)) {
                return;
            }
            this.updateRetentionPeriod(value);
        }
        updateRetentionPeriod(retentionPeriod) {
            if (retentionPeriod < 1) {
                throw new Error('Retention period must be at least 1 day.');
            }
            if (!this.action) {
                throw new Error('No action is set.');
            }
            this.action.retentionPeriod = retentionPeriod;
            this.notifyChange();
            this.requestUpdate();
        }
        render() {
            if (!this.exposed || !this.entity || !this.action) {
                return nothing;
            }
            return html `<div class="container">${this.renderHeader()} ${this.renderTabs()} ${this.renderTabContent()}</div>`;
        }
        /**
         * Renders a template of the editor header.
         */
        renderHeader() {
            const { entity } = this;
            let label = 'Delete action';
            if (entity) {
                label = entity.info.getLabel() + ': Delete action';
            }
            return html `<div class="intro">
      <div class="header">
        <ui-icon>${apiActionKindToIcon('delete')}</ui-icon>
        <span class="headline-medium">${label}</span>
        ${this.renderCloseButton()}
      </div>
      <div class="body-medium description">Delete action allows removing a resource from the collection.</div>
    </div>`;
        }
        /**
         * Renders the tabs navigation.
         */
        renderTabs() {
            return html `<ui-tabs
      class="tabs"
      .activeTabIndex="${this.activeTab}"
      @change="${this.handleTabChange}"
      priority="secondary"
    >
      <ui-tab>Configuration</ui-tab>
      <ui-tab>Access</ui-tab>
      <ui-tab>Limits</ui-tab>
    </ui-tabs>`;
        }
        /**
         * Renders the content for the currently active tab.
         */
        renderTabContent() {
            if (!this.action) {
                return nothing;
            }
            switch (this.activeTab) {
                case 0:
                    return this.renderConfigurationTab();
                case 1:
                    return this.renderAccessTab();
                case 2:
                    return this.renderLimitsTab();
                default:
                    return nothing;
            }
        }
        /**
         * Renders the Configuration tab content.
         */
        renderConfigurationTab() {
            if (!this.action) {
                return nothing;
            }
            return html `<div class="configuration-tab">${this.renderUpdateConfiguration(this.action)}</div>`;
        }
        /**
         * Renders the Access tab content.
         */
        renderAccessTab() {
            return html `<div class="config-section">
      <api-modeling-access-configuration
        .model="${this.model}"
        domainKey="${this.exposed?.key || ''}"
        operation="delete"
        target="action"
        class="access-configuration"
        @change="${this.handleConfigurationChange}"
      ></api-modeling-access-configuration>
    </div>`;
        }
        /**
         * Renders the Limits tab content.
         */
        renderLimitsTab() {
            return html `<div class="config-section">
      <api-modeling-rate-limiting
        .model="${this.model}"
        domainKey="${this.exposed?.key || ''}"
        operation="delete"
        target="action"
        class="rate-limiting-configuration"
        @change="${this.handleConfigurationChange}"
      ></api-modeling-rate-limiting>
    </div>`;
        }
        /**
         * Renders the close button if the `showCloseButton` flag is set.
         */
        renderCloseButton() {
            if (!this.showCloseButton) {
                return nothing;
            }
            return html `<ui-icon-button
      color="outlined"
      class="close-button"
      aria-label="Close editor"
      @click="${this.handleCloseButtonClick}"
    >
      <ui-icon icon="close"></ui-icon>
    </ui-icon-button>`;
        }
        renderUpdateConfiguration(action) {
            return html `<div class="delete-configuration config-section">
      <div class="config-intro">
        <div class="section-header">
          <span class="title-large">Delete mode</span>
          ${renderHelp('modeling', 'api:delete-mode')}
        </div>
        <div class="section-description body-medium">Configure the delete mode of the resource.</div>
      </div>

      <div class="row input-row">
        <ui-select
          class="input"
          label="Deletion mode"
          .value="${action.strategy}"
          @change="${this.handleDeleteStrategyChange}"
        >
          <ui-option value="soft">Soft delete</ui-option>
          <ui-option value="hard">Hard delete</ui-option>
        </ui-select>
      </div>

      <div class="row input-row">
        <ui-outlined-text-field
          class="input"
          label="Retention period (days)"
          type="number"
          .value="${String(action.retentionPeriod || '30')}"
          min="1"
          @change="${this.handleRetentionPeriodChange}"
        ></ui-outlined-text-field>
        ${renderHelp('modeling', 'api:delete-action:retention-period')}
      </div>
    </div>`;
        }
        constructor() {
            super(...arguments);
            __runInitializers(this, _activeTab_extraInitializers);
        }
    };
})();
export default ApiDeleteActionEditor;
//# sourceMappingURL=ApiDeleteActionEditor.js.map