<html>
<head>
    <title>Apache Ignite Teamcity Bot - Current Failures</title>
    <link rel="icon" href="img/leaf-icon-png-7066.png">

    <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.4.2/css/all.css"
          integrity="sha384-/rXc/GQVaYpyDdyxK+ecHPVYJSN9bmVFBvjA/9eOB+pb3F2w2N6fc5qB9Ew5yIns" crossorigin="anonymous">

    <script src="https://code.jquery.com/jquery-1.12.4.js"></script>
    <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>

    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

    <!--<link href="https://cdn.jsdelivr.net/npm/vuetify/dist/vuetify.min.css" rel="stylesheet">-->

    <link rel="stylesheet" href="css/vue-slider-1.0.css">

    <link rel="stylesheet" href="https://code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
    <link rel="stylesheet" href="css/style-1.5.css">

    <script src="https://cdn.jsdelivr.net/npm/vuetify/dist/vuetify.js"></script>

    <script src="js/common-1.6.js"></script>
    <script src="js/testfails-2.2.js"></script>
</head>
<body>
<script>
    let g_shownDataHashCodeHex = "";
    let g_checkForUpdateSched = false;
    let gVue;

function genLink() {
    let newUrl = "./current.html" + parmsForRest();

    let permalink = $("#permalink");
    permalink.attr("href", newUrl);

    permalink.html("Permalink");
}

function showQueryForm() {
    let min, max;

    let minFailRate = findGetParameter("minFailRate");
    if (minFailRate != null) {
        min = parseInt(minFailRate);
    } else {
        min = 0;
    }

    let maxFailRate = findGetParameter("maxFailRate");
    if (maxFailRate != null) {
        max = parseInt(maxFailRate);
    } else {
        max = 100;
    }


    gVue = new Vue({
        el: '#vueQueryForm',
        vuetify: new Vuetify(),
        data: {
            tagSelected: '',
            tagsPresent: [""],
            tagForHistSelected: '',
            tagsForHistPresent: [""],

            displayMode: 'Failures',
            sortOption: 'FailureRate',
            //count of builds to merge
            count: 1,
            muted: false,
            ignored: false,
            trustedTests: true,
            checkAllLogs: false,
            hideFlakyFailures: false,

            showTestLongerThan: '',

            absMinFailRate: 0,
            absMaxFailRate: 100,
            failRateRange: [min, max]
        },
        methods: {
            formChanged: function () {
                if (count < 1)
                    count = 1;

                loadData();
                genLink();
            }
        }
    });

    let tagSelected = findGetParameter("tagSelected");
    if (tagSelected != null) {
        gVue.$data.tagsPresent.push(tagSelected);
        gVue.$data.tagSelected = tagSelected;
    }

    let displayMode = findGetParameter("displayMode");
    if (displayMode != null) {
        gVue.$data.displayMode = displayMode;
    }

    let sortOption = findGetParameter("sortOption");
    if (sortOption != null) {
        gVue.$data.sortOption = sortOption;
    }

    let count = findGetParameter("count");
    if (count != null) {
        gVue.$data.count = count;
    }

    let parm = findGetParameter("trustedTests");
    if (isDefinedAndFilled(parm)) {
        gVue.$data.trustedTests = parm === "true";
    }


    gVue.$data.muted = findGetParameter("muted") === "true";
    gVue.$data.ignored = findGetParameter("ignored") === "true";

    gVue.$data.checkAllLogs = findGetParameter("checkAllLogs") === "true";
    gVue.$data.hideFlakyFailures = findGetParameter("hideFlakyFailures") === "true";

    let showTestLongerThan = findGetParameter("showTestLongerThan");
    if (showTestLongerThan != null)
        gVue.$data.showTestLongerThan = showTestLongerThan;

    let tagForHistSelected = findGetParameter("tagForHistSelected");
    if (tagForHistSelected != null) {
        gVue.$data.tagsForHistPresent.push(tagForHistSelected);
        gVue.$data.tagForHistSelected = tagForHistSelected;
    }

    genLink();
}

$(document).ready(function() {
    $.getScript("js/testfails-2.2.js", function(data, textStatus, jqxhr){ });
    
    $( document ).tooltip();
    showQueryForm();
    loadData();

    $.ajax({ url: "/rest/branches/version",  success: showVersionInfo, error: showErrInLoadStatus });
});

function parmsForRest() {
    var curReqParms = "";

    var branch = findGetParameter("branch");
    curReqParms += "?branch=" + (branch != null ? branch : "master");

    if (gVue.$data.checkAllLogs === true) {
        curReqParms += "&checkAllLogs=" + gVue.$data.checkAllLogs;
    }

    if (gVue.$data.trustedTests === false) {
        curReqParms += "&trustedTests=" + gVue.$data.trustedTests;
    }

    if (gVue.$data.muted === true) {
        curReqParms += "&muted=" + gVue.$data.muted;
    }

    if (gVue.$data.ignored === true) {
        curReqParms += "&ignored=" + gVue.$data.ignored;
    }

    var tagSelected = gVue.$data.tagSelected;
    if (tagSelected != null && tagSelected !== "") {
        curReqParms += "&tagSelected=" + tagSelected;
    }

    var displayMode = gVue.$data.displayMode;
    if (displayMode != null && displayMode !== "" && displayMode !== "Failures") {
        curReqParms += "&displayMode=" + displayMode;
    }

    var sortOption = gVue.$data.sortOption;
    if (sortOption != null && sortOption !== "" && sortOption !== "FailureRate") {
        curReqParms += "&sortOption=" + sortOption;
    }

    let count = gVue.$data.count;
    if (count != null && count > 1)
        curReqParms += "&count=" + count;

    let minFailRate = gVue.$data.failRateRange[0];
    if (minFailRate != null && minFailRate > 0)
        curReqParms += "&minFailRate=" + minFailRate;

    let maxFailRate = gVue.$data.failRateRange[1];
    if (maxFailRate != null && maxFailRate < 100)
        curReqParms += "&maxFailRate=" + maxFailRate;

    let hideFlakyFailures = gVue.$data.hideFlakyFailures;
    if (hideFlakyFailures != null && hideFlakyFailures === true)
        curReqParms += "&hideFlakyFailures=" + hideFlakyFailures;

    let tagForHistSelected = gVue.$data.tagForHistSelected;
    if (tagForHistSelected != null && tagForHistSelected !== "")
        curReqParms += "&tagForHistSelected=" + tagForHistSelected;

    let runTime = gVue.$data.showTestLongerThan;
    if (runTime != null && runTime > 0)
        curReqParms += "&showTestLongerThan=" + runTime;

    return curReqParms;
}

function checkForUpdate() {
    var curFailuresUrl = "rest/tracked/updates" + parmsForRest();
    g_checkForUpdateSched = false;
    $.ajax({
        url: curFailuresUrl,
        success: function (result) {
            if (g_shownDataHashCodeHex !== "" && isDefinedAndFilled(result.hashCodeHex)) {
                if (g_shownDataHashCodeHex === result.hashCodeHex) {
                    if (!g_checkForUpdateSched) {
                        g_checkForUpdateSched = true;

                        setTimeout(checkForUpdate, 60000);
                    }

                    $("#loadStatus").html("");
                } else {
                    loadData(); // data changed, show new
                }
            } else {
                loadData();
            }
        },
        error: showErrInLoadStatus
    });
}

function loadData() {
    var curFailuresUrl = "rest/tracked/results" + parmsForRest();
    
    $("#loadStatus").html("<img src='https://www.wallies.com/filebin/images/loading_apple.gif' width=20px height=20px> Please wait");
    setTimeout(loadPartialData, 3000);

    $.ajax({
        url: curFailuresUrl,
        success: function (result) {
            showData(result);
            g_shownDataHashCodeHex = isDefinedAndFilled(result.hashCodeHex) ? result.hashCodeHex : "";

            if (!g_checkForUpdateSched) {
                g_checkForUpdateSched = true;

                setTimeout(checkForUpdate, 20000);
            }
        },
        error: showErrInLoadStatus
    });
}

function loadPartialData() {
    var curFailuresUrl = "rest/tracked/resultsNoSync" + parmsForRest();

    if (g_shownDataHashCodeHex !== "") {
        return;
    }
    $.ajax({
        url: curFailuresUrl,
        success: function (result) {
            if (g_shownDataHashCodeHex !== "") {
                return;
            }

            var validResult = true;
            for (var i = 0; i < result.servers.length; i++) {
                var server = result.servers[i];

                if (isDefinedAndFilled(server.buildNotFound) && server.buildNotFound) {
                    validResult = false;
                    break;
                }
            }
            if (validResult)
                showData(result);

            setTimeout(loadPartialData, 3000);
        },
        error: showErrInLoadStatus
    });
}

function showData(result) {
    let setOfTags = new Set(gVue.$data.tagsPresent);
    let setOfHistTags = new Set(gVue.$data.tagsForHistPresent);
    for (let i = 0; i < result.servers.length; i++) {
        let chain = result.servers[i];

        for (let j = 0; j < chain.suites.length; j++) {
            let suite = chain.suites[j];

            if(isDefinedAndFilled(suite.tags)) {
                for (let k = 0; k < suite.tags.length; k++) {
                    const tag = suite.tags[k];

                    setOfTags.add(tag);
                    setOfHistTags.add(tag);
                }
            }
        }
    }

    gVue.$data.tagsPresent = Array.from(setOfTags);
    gVue.$data.tagsForHistPresent = Array.from(setOfHistTags);

    //var txtUrl = "rest/tracked/results/txt" + parmsForRest();

    var minFailRate = gVue.$data.failRateRange[0];

    var maxFailRate = gVue.$data.failRateRange[1];

    var hideFlakyFailures = gVue.$data.hideFlakyFailures === true;

    let resHtml = showChainResultsWithSettings(result, new Settings(minFailRate, maxFailRate, result.javaFlags, hideFlakyFailures));

    $("#divFailures").html(resHtml);
    //        + " <a href='"+ txtUrl + "'>txt</a>");
}

</script>


<div id="vueQueryForm">
    <v-app id="prQueryForm" name="prQueryForm">
        <div class="formgroup">
            <table>
                <tr>
                    <td>
                        <span title="Tag filter for displaying suites">Tag filter: </span>
                        <select v-model="tagSelected" @change="formChanged">
                            <option disabled value="">Please select one</option>

                            <option v-for="option in tagsPresent" v-bind:value="option">
                                {{ option }}
                            </option>
                        </select>

                        &nbsp;&nbsp;&nbsp;<span title="Tag filter for filtering history of suites">History tag filter: </span>
                        <select v-model="tagForHistSelected" @change="formChanged">
                            <option disabled value="">Please select one</option>

                            <option v-for="option in tagsForHistPresent" v-bind:value="option">
                                {{ option }}
                            </option>
                        </select>
                        <br>
                        <span>Display Mode: </span>
                        <select v-model="displayMode" @change="formChanged">
                            <option value="Failures">Show failures only</option>
                            <option value="AllSuites">Show all suites</option>
                        </select>
                        &nbsp;&nbsp;&nbsp;<span>Sort: </span>
                        <select v-model="sortOption" @change="formChanged">
                            <option value="FailureRate">Failure Rate</option>
                            <option value="SuiteDuration">Suite Duration</option>
                        </select>
                        &nbsp;&nbsp;&nbsp;<span>Merge Builds: </span>
                        <input v-model.number="count" type="number" @change="formChanged">

                        <br>
                        <span title="Show muted tests">Muted: </span>
                        <input type="checkbox" v-model="muted" @change="formChanged">
                        &nbsp;&nbsp;&nbsp;
                        <span title="Show ignored tests">Ignored: </span>
                        <input type="checkbox" v-model="ignored" @change="formChanged">
                        &nbsp;&nbsp;&nbsp;

                        <span title="Show trusted tests count">Trusted tests: </span>
                        <input type="checkbox" v-model="trustedTests" @change="formChanged">
                        &nbsp;&nbsp;&nbsp;<span title="Download and parse all logs">Check logs: </span>
                        <input type="checkbox" v-model="checkAllLogs" @change="formChanged">

                        &nbsp;&nbsp;&nbsp;<span>Tests longer than, seconds: </span>
                        <input v-model.number="showTestLongerThan" type="number" @change="formChanged">
                    </td>

                    <td style="width: 50%">
                        <v-expansion-panels>
                            <v-expansion-panel>
                                <v-expansion-panel-header>More options</v-expansion-panel-header>
                                <v-expansion-panel-content>

                                    &nbsp;&nbsp;<span title="Hide flaky failures">Hide flaky: </span>
                                    <input type="checkbox" v-model="hideFlakyFailures" @change="formChanged">

                                    <v-range-slider
                                            v-model="failRateRange"
                                            :max="absMaxFailRate"
                                            :min="absMinFailRate"
                                            hide-details
                                            class="align-center"
                                            @change="formChanged"
                                    >
                                        <template v-slot:prepend>
                                            <span>Min failure rate: </span>
                                            <v-text-field
                                                    v-model="failRateRange[0]"
                                                    class="mt-0 pt-0"
                                                    hide-details
                                                    single-line
                                                    type="number"
                                                    style="width: 60px"
                                                    @change="formChanged"></v-text-field>

                                            <span>Max failure rate: </span>
                                            <v-text-field
                                                    v-model="failRateRange[1]"
                                                    class="mt-0 pt-0"
                                                    hide-details
                                                    single-line
                                                    type="number"
                                                    style="width: 60px"
                                                    @change="formChanged"></v-text-field>
                                        </template>
                                        <template v-slot:append>

                                        </template>
                                    </v-range-slider>

                                </v-expansion-panel-content>
                            </v-expansion-panel>
                        </v-expansion-panels>
                    </td>
                </tr>
            </table>

            &nbsp;&nbsp; <span> <a id="permalink"></a> </span>



            &nbsp;&nbsp;
            <span id="loadStatus"></span>
        </div>
        <br>
        <div id="divFailures"></div>
    </v-app>
</div>


<div id="version"></div>
<div style="visibility:hidden;"><div id="triggerConfirm" title="Trigger Confirmation"></div><div id="triggerDialog" title="Trigger Result"></div></div>
</body>
</html>