import { filterEntitiesForClient, filterEntityPropertiesForClient, loadClientConfig, loadDerivedClientConfig, preparePostEntityClientDerivedProperties, } from '../client/support/index.js';
import BaseApplicationGenerator from '../base-application/index.js';
import { loadStoredAppOptions } from '../app/support/index.js';
import clientCommand from '../client/command.js';
import { loadConfig, loadDerivedConfig } from '../../lib/internal/index.js';
import { getFrontendAppName } from '../base/support/index.js';
export default class BootStrapApplicationClient extends BaseApplicationGenerator {
    constructor(args, options, features) {
        super(args, options, { jhipsterBootstrap: false, ...features });
        if (this.options.help)
            return;
        loadStoredAppOptions.call(this);
    }
    async beforeQueue() {
        if (!this.fromBlueprint) {
            await this.composeWithBlueprints();
        }
        if (this.delegateToBlueprint) {
            throw new Error('Only sbs blueprint is supported');
        }
        await this.dependsOnBootstrapApplicationBase();
    }
    get loading() {
        return this.asLoadingTaskGroup({
            loadApplication({ application }) {
                loadConfig(clientCommand.configs, { config: this.jhipsterConfigWithDefaults, application });
                loadClientConfig({ config: this.jhipsterConfigWithDefaults, application });
            },
        });
    }
    get [BaseApplicationGenerator.LOADING]() {
        return this.loading;
    }
    get preparing() {
        return this.asPreparingTaskGroup({
            prepareApplication({ application }) {
                loadDerivedConfig(clientCommand.configs, { application });
                loadDerivedClientConfig({ application });
            },
            prepareForTemplates({ application }) {
                application.frontendAppName = getFrontendAppName({ baseName: application.baseName });
            },
        });
    }
    get [BaseApplicationGenerator.PREPARING]() {
        return this.preparing;
    }
    get default() {
        return this.asDefaultTaskGroup({
            control({ control }) {
                control.filterEntitiesForClient ??= filterEntitiesForClient;
                control.filterEntityPropertiesForClient ??= filterEntityPropertiesForClient;
                control.filterEntitiesAndPropertiesForClient ??= entities => {
                    entities = control.filterEntitiesForClient(entities);
                    entities.forEach(control.filterEntityPropertiesForClient);
                    return entities;
                };
            },
            async postPreparingEntity({ entities }) {
                for (const entity of entities) {
                    await preparePostEntityClientDerivedProperties(entity);
                }
            },
        });
    }
    get [BaseApplicationGenerator.DEFAULT]() {
        return this.default;
    }
}
