import BaseApplicationGenerator from '../base-application/index.js';
import { mutateData } from '../base/support/index.js';
import writeElasticsearchFilesTask from './files.js';
import cleanupElasticsearchFilesTask from './cleanup.js';
import writeElasticsearchEntityFilesTask, { cleanupElasticsearchEntityFilesTask } from './entity-files.js';
export default class ElasticsearchGenerator extends BaseApplicationGenerator {
    async beforeQueue() {
        if (!this.fromBlueprint) {
            await this.composeWithBlueprints();
        }
        if (!this.delegateToBlueprint) {
            await this.dependsOnBootstrapApplication();
        }
    }
    get preparingEachEntity() {
        return this.asPreparingEachEntityTaskGroup({
            prepareEntity({ entity }) {
                mutateData(entity, {
                    entitySearchLayer: true,
                });
            },
        });
    }
    get [BaseApplicationGenerator.PREPARING_EACH_ENTITY]() {
        return this.delegateTasksToBlueprint(() => this.preparingEachEntity);
    }
    get writing() {
        return {
            cleanupElasticsearchFilesTask,
            writeElasticsearchFilesTask,
        };
    }
    get [BaseApplicationGenerator.WRITING]() {
        return this.delegateTasksToBlueprint(() => this.writing);
    }
    get writingEntities() {
        return {
            cleanupElasticsearchEntityFilesTask,
            writeElasticsearchEntityFilesTask,
        };
    }
    get [BaseApplicationGenerator.WRITING_ENTITIES]() {
        return this.delegateTasksToBlueprint(() => this.writingEntities);
    }
    get postWriting() {
        return this.asPostWritingTaskGroup({
            addTestSpringFactory({ source, application }) {
                source.addTestSpringFactory({
                    key: 'org.springframework.test.context.ContextCustomizerFactory',
                    value: `${application.packageName}.config.TestContainersSpringContextCustomizerFactory`,
                });
            },
            addDependencies({ source }) {
                source.addJavaDependencies?.([
                    { groupId: 'org.springframework.boot', artifactId: 'spring-boot-starter-data-elasticsearch' },
                    { scope: 'test', groupId: 'org.awaitility', artifactId: 'awaitility' },
                    { groupId: 'org.apache.commons', artifactId: 'commons-collections4' },
                    { scope: 'test', groupId: 'org.testcontainers', artifactId: 'elasticsearch' },
                    { scope: 'test', groupId: 'org.testcontainers', artifactId: 'junit-jupiter' },
                    { scope: 'test', groupId: 'org.testcontainers', artifactId: 'testcontainers' },
                ]);
            },
        });
    }
    get [BaseApplicationGenerator.POST_WRITING]() {
        return this.delegateTasksToBlueprint(() => this.postWriting);
    }
}
