"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    var desc = Object.getOwnPropertyDescriptor(m, k);
    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
      desc = { enumerable: true, get: function() { return m[k]; } };
    }
    Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
    Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
    o["default"] = v;
});
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 __importStar = (this && this.__importStar) || function (mod) {
    if (mod && mod.__esModule) return mod;
    var result = {};
    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
    __setModuleDefault(result, mod);
    return result;
};
var __metadata = (this && this.__metadata) || function (k, v) {
    if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.ElseIfAction = void 0;
const index_js_1 = require("../model/index.js");
const util = __importStar(require("../util/index.js"));
const Flow_if_1 = require("./Flow.if");
class ElseIfAction extends index_js_1.Action {
    hasChildren() {
        return true;
    }
    async exec() {
        const chain = this.getChain();
        util.assertScript(chain.length, 'else-if must immediately follow if or another else-if');
        for (const action of chain) {
            util.assertPlayback(action.$runtime.bypassed != null, 'Cannot execute else-if: previous actions need to be executed first');
            if (!action.$runtime.bypassed) {
                this.$runtime.bypassed = true;
                return;
            }
        }
        await this.retry(async () => {
            const el = await this.selectSingle(this.pipeline, false);
            const condition = el.value;
            util.checkType(condition, 'boolean');
            this.$runtime.bypassed = !condition;
        });
    }
    afterRun() {
        if (this.$runtime.bypassed) {
            this.skip();
        }
        else {
            this.enter();
        }
    }
    getChain() {
        return Array.from((0, Flow_if_1.collectIfElseChain)(this));
    }
}
ElseIfAction.$type = 'Flow.elseIf';
ElseIfAction.$icon = 'fas fa-question';
ElseIfAction.$help = `
Same as If, but does not evaluate the pipeline if any preceeding If or Else If action was entered.

This action must be placed next to either If or another Else If action.
All adjacent If, Else If and Else actions form a single chain with a guarantee that at most one branch is entered.

### Use For

- general purpose branching and conditional execution
`;
__decorate([
    index_js_1.params.Pipeline(),
    __metadata("design:type", index_js_1.Pipeline)
], ElseIfAction.prototype, "pipeline", void 0);
exports.ElseIfAction = ElseIfAction;
//# sourceMappingURL=Flow.elseIf.js.map