// SPDX-License-Identifier: Apache-2.0
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
    if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
    return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
    if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
var __param = (this && this.__param) || function (paramIndex, decorator) {
    return function (target, key) { decorator(target, key, paramIndex); }
};
var HelmExecutionBuilder_1;
import { join } from 'node:path';
import { HelmExecution } from './helm-execution.js';
import { inject, injectable } from 'tsyringe-neo';
import { InjectTokens } from '../../../core/dependency-injection/inject-tokens.js';
import { patchInject } from '../../../core/dependency-injection/container-helper.js';
import { Templates } from '../../../core/templates.js';
import * as constants from '../../../core/constants.js';
let HelmExecutionBuilder = class HelmExecutionBuilder {
    static { HelmExecutionBuilder_1 = this; }
    osPlatform;
    logger;
    static NAME_MUST_NOT_BE_NULL = 'name must not be null';
    static VALUE_MUST_NOT_BE_NULL = 'value must not be null';
    /**
     * The path to the helm executable.
     */
    helmExecutable;
    /**
     * The list of subcommands to be used when execute the helm command.
     */
    _subcommands = [];
    /**
     * The arguments to be passed to the helm command.
     */
    _arguments = new Map();
    /**
     * The list of options and a list of their one or more values.
     */
    _optionsWithMultipleValues = [];
    /**
     * The flags to be passed to the helm command.
     */
    _flags = [];
    /**
     * The positional arguments to be passed to the helm command.
     */
    _positionals = [];
    /**
     * The environment variables to be set when executing the helm command.
     */
    _environmentVariables = new Map();
    /**
     * The working directory to be used when executing the helm command.
     */
    _workingDirectory;
    /**
     * Creates a new HelmExecutionBuilder instance.
     */
    constructor(osPlatform, logger) {
        this.osPlatform = osPlatform;
        this.logger = logger;
        this.osPlatform = patchInject(osPlatform, InjectTokens.OsPlatform, this.constructor.name);
        this.logger = patchInject(logger, InjectTokens.SoloLogger, this.constructor.name);
        try {
            this.helmExecutable = Templates.installationPath(constants.HELM, this.osPlatform);
        }
        catch (error) {
            this.logger?.error('Failed to find helm executable:', error);
            throw new Error('Failed to find helm executable. Please ensure helm is installed and in your PATH.');
        }
        const workingDirectoryString = process.env.PWD;
        this._workingDirectory =
            workingDirectoryString && workingDirectoryString.trim() !== ''
                ? workingDirectoryString
                : join(this.helmExecutable, '..');
    }
    /**
     * Adds the list of subcommands to the helm execution.
     * @param commands the list of subcommands to be added
     * @returns this builder
     */
    subcommands(...commands) {
        if (!commands) {
            throw new Error('commands must not be null');
        }
        this._subcommands.push(...commands);
        return this;
    }
    /**
     * Adds an argument to the helm execution.
     * @param name the name of the argument
     * @param value the value of the argument
     * @returns this builder
     */
    argument(name, value) {
        if (!name) {
            throw new Error(HelmExecutionBuilder_1.NAME_MUST_NOT_BE_NULL);
        }
        if (!value) {
            throw new Error(HelmExecutionBuilder_1.VALUE_MUST_NOT_BE_NULL);
        }
        this._arguments.set(name, value);
        return this;
    }
    /**
     * Adds an option with multiple values to the helm execution.
     * @param name the name of the option
     * @param value the list of values for the option
     * @returns this builder
     */
    optionsWithMultipleValues(name, value) {
        if (!name) {
            throw new Error(HelmExecutionBuilder_1.NAME_MUST_NOT_BE_NULL);
        }
        if (!value) {
            throw new Error(HelmExecutionBuilder_1.VALUE_MUST_NOT_BE_NULL);
        }
        this._optionsWithMultipleValues.push({ key: name, value });
        return this;
    }
    /**
     * Adds a positional argument to the helm execution.
     * @param value the value of the positional argument
     * @returns this builder
     */
    positional(value) {
        if (!value) {
            throw new Error(HelmExecutionBuilder_1.VALUE_MUST_NOT_BE_NULL);
        }
        this._positionals.push(value);
        return this;
    }
    /**
     * Adds an environment variable to the helm execution.
     * @param name the name of the environment variable
     * @param value the value of the environment variable
     * @returns this builder
     */
    environmentVariable(name, value) {
        if (!name) {
            throw new Error(HelmExecutionBuilder_1.NAME_MUST_NOT_BE_NULL);
        }
        if (!value) {
            throw new Error(HelmExecutionBuilder_1.VALUE_MUST_NOT_BE_NULL);
        }
        this._environmentVariables.set(name, value);
        return this;
    }
    /**
     * Sets the working directory for the helm execution.
     * @param workingDirectoryPath the path to the working directory
     * @returns this builder
     */
    workingDirectory(workingDirectoryPath) {
        if (!workingDirectoryPath) {
            throw new Error('workingDirectoryPath must not be null');
        }
        this._workingDirectory = workingDirectoryPath;
        return this;
    }
    /**
     * Adds a flag to the helm execution.
     * @param flag the flag to be added
     * @returns this builder
     */
    flag(flag) {
        if (!flag) {
            throw new Error('flag must not be null');
        }
        this._flags.push(flag);
        return this;
    }
    /**
     * Builds the HelmExecution instance.
     * @returns the HelmExecution instance
     */
    build() {
        const command = this.buildCommand();
        const environment = { ...process.env };
        for (const [key, value] of this._environmentVariables.entries()) {
            environment[key] = value;
        }
        return new HelmExecution(command, this._workingDirectory, environment);
    }
    /**
     * Builds the command array for the helm execution.
     * @returns the command array
     */
    buildCommand() {
        const command = [];
        command.push(this.helmExecutable, ...this._subcommands, ...this._flags);
        for (const [key, value] of this._arguments.entries()) {
            command.push(`--${key}`, value);
        }
        for (const entry of this._optionsWithMultipleValues) {
            for (const value of entry.value) {
                command.push(`--${entry.key}`, value);
            }
        }
        command.push(...this._positionals);
        this.logger.debug(`Helm command: helm ${command.slice(1).join(' ')}`);
        return command;
    }
};
HelmExecutionBuilder = HelmExecutionBuilder_1 = __decorate([
    injectable()
    /**
     * A builder for creating a helm command execution.
     */
    ,
    __param(0, inject(InjectTokens.OsPlatform)),
    __param(1, inject(InjectTokens.SoloLogger)),
    __metadata("design:paramtypes", [String, Object])
], HelmExecutionBuilder);
export { HelmExecutionBuilder };
//# sourceMappingURL=helm-execution-builder.js.map