// 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 KindExecutionBuilder_1;
import { KindExecution } from './kind-execution.js';
import { InjectTokens } from '../../../core/dependency-injection/inject-tokens.js';
import { patchInject } from '../../../core/dependency-injection/container-helper.js';
import { inject, injectable } from 'tsyringe-neo';
import { ExecutionBuilder } from '../../execution-builder.js';
/**
 * A builder for creating a kind command execution.
 */
let KindExecutionBuilder = class KindExecutionBuilder extends ExecutionBuilder {
    static { KindExecutionBuilder_1 = this; }
    kindInstallationDirectory;
    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 kind executable.
     */
    kindExecutable;
    /**
     * The list of subcommands to be used when execute the kind command.
     */
    _subcommands = [];
    /**
     * The arguments to be passed to the kind 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 kind command.
     */
    _flags = [];
    /**
     * The positional arguments to be passed to the kind command.
     */
    _positionals = [];
    /**
     * The environment variables to be set when executing the kind command.
     */
    _environmentVariables = new Map();
    /**
     * Creates a new KindExecutionBuilder instance.
     */
    constructor(kindInstallationDirectory) {
        super();
        this.kindInstallationDirectory = kindInstallationDirectory;
        this.kindInstallationDirectory = patchInject(kindInstallationDirectory, InjectTokens.KindInstallationDirectory, KindExecutionBuilder_1.name);
    }
    executable(kindExecutable) {
        if (!kindExecutable) {
            throw new Error('kindExecutable must not be null');
        }
        this.kindExecutable = kindExecutable;
        return this;
    }
    /**
     * Adds the list of subcommands to the kind execution.
     * @param commands the list of subcommands to be added
     * @returns this builder
     */
    subcommands(...commands) {
        if (!commands || commands.length === 0) {
            throw new Error('commands must not be null');
        }
        this._subcommands.push(...commands);
        return this;
    }
    /**
     * Adds an argument to the kind 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(KindExecutionBuilder_1.NAME_MUST_NOT_BE_NULL);
        }
        if (!value) {
            throw new Error(KindExecutionBuilder_1.VALUE_MUST_NOT_BE_NULL);
        }
        this._arguments.set(name, value);
        return this;
    }
    /**
     * Adds an option with multiple values to the kind 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(KindExecutionBuilder_1.NAME_MUST_NOT_BE_NULL);
        }
        if (!value) {
            throw new Error(KindExecutionBuilder_1.VALUE_MUST_NOT_BE_NULL);
        }
        this._optionsWithMultipleValues.push({ key: name, value });
        return this;
    }
    /**
     * Adds a positional argument to the kind execution.
     * @param value the value of the positional argument
     * @returns this builder
     */
    positional(value) {
        if (!value) {
            throw new Error(KindExecutionBuilder_1.VALUE_MUST_NOT_BE_NULL);
        }
        this._positionals.push(value);
        return this;
    }
    /**
     * Adds an environment variable to the kind 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(KindExecutionBuilder_1.NAME_MUST_NOT_BE_NULL);
        }
        if (!value) {
            throw new Error(KindExecutionBuilder_1.VALUE_MUST_NOT_BE_NULL);
        }
        this._environmentVariables.set(name, value);
        return this;
    }
    /**
     * Adds a flag to the kind 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 KindExecution instance.
     * @returns the KindExecution instance
     */
    build() {
        const command = this.buildCommand();
        const environment = { ...process.env };
        for (const [key, value] of this._environmentVariables.entries()) {
            environment[key] = value;
        }
        this.prefixPath(environment, this.kindInstallationDirectory);
        return new KindExecution(command, environment);
    }
    /**
     * Builds the command array for the kind execution.
     * @returns the command array
     */
    buildCommand() {
        const command = [`${this.kindExecutable}`, ...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);
        return command;
    }
};
KindExecutionBuilder = KindExecutionBuilder_1 = __decorate([
    injectable(),
    __param(0, inject(InjectTokens.KindInstallationDirectory)),
    __metadata("design:paramtypes", [String])
], KindExecutionBuilder);
export { KindExecutionBuilder };
//# sourceMappingURL=kind-execution-builder.js.map