"use strict";
/*
 * Copyright © 2020 Atomist, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
Object.defineProperty(exports, "__esModule", { value: true });
exports.wrapTest = exports.wrapPredicateMapping = exports.notGoalOrOutputTest = exports.goalTest = exports.matchStringOrRegexp = exports.isGoal = void 0;
const RequestProcessor_1 = require("@atomist/automation-client/lib/internal/transport/RequestProcessor");
const _ = require("lodash");
const sdmGoal_1 = require("../../api-helper/goal/sdmGoal");
const commonPushTests_1 = require("./support/commonPushTests");
function isGoal(options = {}) {
    return goalTest(`is goal ${JSON.stringify(options)}`, async (g) => {
        if (!!options.name &&
            !matchStringOrRegexp(options.name, `${g.registration}/${g.name}`) &&
            !matchStringOrRegexp(options.name, `${g.registration}/${g.uniqueName}`)) {
            return false;
        }
        if (!!options.state && options.state !== g.state) {
            return false;
        }
        if (!!options.output) {
            const data = sdmGoal_1.goalData(g);
            const outputs = data["@atomist/sdm/output"];
            if (!outputs) {
                return false;
            }
            else if (!outputs.some(o => matchStringOrRegexp(options.output, o.classifier))) {
                return false;
            }
        }
        if (!!options.data && !matchStringOrRegexp(options.data, g.data)) {
            return false;
        }
        return true;
    }, options.pushTest);
}
exports.isGoal = isGoal;
function matchStringOrRegexp(pattern, toMatch) {
    if (typeof pattern === "string") {
        return pattern === toMatch;
    }
    else {
        return pattern.test(toMatch);
    }
}
exports.matchStringOrRegexp = matchStringOrRegexp;
function goalTest(name, goalMapping, pushTest = commonPushTests_1.AnyPush) {
    return {
        name,
        mapping: async (pli) => {
            var _a;
            const trigger = (_a = pli === null || pli === void 0 ? void 0 : pli.context) === null || _a === void 0 ? void 0 : _a.trigger;
            if (!!trigger && RequestProcessor_1.isEventIncoming(trigger)) {
                const goal = _.get(trigger, "data.SdmGoal[0]");
                if (!!goal) {
                    const match = await goalMapping(goal, pli);
                    if (!!match) {
                        if (!pli.project) {
                            return true;
                        }
                        else {
                            return pushTest.mapping(pli);
                        }
                    }
                }
            }
            return false;
        },
        pushTest,
    };
}
exports.goalTest = goalTest;
/**
 * Wrap a PushTest to make sure it doesn't get the chance to match on goal planning
 * based on goal events
 */
function notGoalOrOutputTest(pushTest) {
    return Object.assign(Object.assign({}, pushTest), { mapping: async (pli) => {
            var _a;
            const trigger = (_a = pli === null || pli === void 0 ? void 0 : pli.context) === null || _a === void 0 ? void 0 : _a.trigger;
            if (!!trigger && RequestProcessor_1.isEventIncoming(trigger)) {
                const goal = _.get(trigger, "data.SdmGoal[0]") || _.get(trigger, "data.SkillOutput[0]");
                if (!!goal) {
                    return false;
                }
            }
            return pushTest.mapping(pli);
        } });
}
exports.notGoalOrOutputTest = notGoalOrOutputTest;
function wrapPredicateMapping(guards) {
    return wrapTest(guards);
}
exports.wrapPredicateMapping = wrapPredicateMapping;
function wrapTest(test) {
    if (!!test.pushTest) {
        return test;
    }
    else {
        return notGoalOrOutputTest(test);
    }
}
exports.wrapTest = wrapTest;
//# sourceMappingURL=goalTest.js.map