<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Test Report</title>
    <link href="https://cdn.jsdelivr.net/npm/element-ui@2.14.1/lib/theme-chalk/index.css" rel="stylesheet" type="text/css">

    <style>
        #app {
            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
        }

        .import-type-title {
            padding: 10px;
        }

        .import-type-title div {
            font-size: 14px;
            font-family:'Courier New', Courier, monospace;
        }

        .type-error-log {
            padding: 10px;
            color: red;
            font-family:'Courier New', Courier, monospace;
        }
        .type-error-log pre {
            margin: 5px 0;
            padding: 0;
            /* https://css-tricks.com/snippets/css/make-pre-text-wrap/ */
            white-space: pre-wrap;
        }
        .type-passed {
            font-size: 14px;
            color: green;
            font-family:'Courier New', Courier, monospace;
            padding: 10px;
        }
    </style>

</head>
<body>
    <div id="app">
        <el-tabs v-model="tab" type="border-card">
            <el-tab-pane label="Type Checking" name="typechecking">
                <div v-for="item in typeCheckingResult">
                    <h3>{{ item.testName }}({{item.compileErrorsCount}})</h3>
                    <el-row :gutter="30">
                        <el-col :span="12">
                            <el-card :body-style="{ padding: '0px' }">
                                <div class="import-type-title">
                                    <div>全量引入</div>
                                    <div>Full Import</div>
                                </div>
                                <div class="type-error-log" v-if="item.compileErrors.full.length">
                                    <div v-for="compileError in item.compileErrors.full">
                                        <pre>[{{compileError.location.join(', ')}}] {{compileError.message}}</pre>
                                    </div>
                                </div>
                                <div class="type-passed" v-else>
                                    No Error
                                </div>
                            </el-card>
                        </el-col>
                        <el-col :span="12">
                            <el-card :body-style="{ padding: '0px' }">
                                <div class="import-type-title">
                                    <div>按需引入</div>
                                    <div>Minimal Import </div>
                                </div>
                                <div class="type-error-log" v-if="item.compileErrors.minimal.length">
                                    <div v-for="compileError in item.compileErrors.minimal">
                                        <pre>[{{compileError.location.join(', ')}}] {{compileError.message}}</pre>
                                    </div>
                                </div>
                                <div class="type-passed" v-else>
                                    No Error
                                </div>
                            </el-card>
                        </el-col>
                    </el-row>
                </div>
            </el-tab-pane>
            <el-tab-pane label="Screenshots Compare" name="screenshots">
                <div v-for="item in screenshotsCompareResult">
                    <h3>{{ item.testName }}({{item.screenshotDiffRatio}})</h3>
                    <el-row :gutter="10">
                        <el-col :span="4">
                            <el-card :body-style="{ padding: '0px' }">
                                <el-image :src="SCREENSHOT_ROOT + item.testName + '.png'"></el-image>
                                <div class="import-type-title">
                                    <div>全量引入</div>
                                    <div>Full Import</div>
                                </div>
                            </el-card>
                        </el-col>
                        <el-col :span="4">
                            <el-card :body-style="{ padding: '0px' }">
                                <el-image :src="SCREENSHOT_ROOT + item.testName + '.minimal.png'"></el-image>
                                <div class="import-type-title">
                                    <div>按需引入</div>
                                    <div>Minimal Import </div>
                                </div>
                            </el-card>
                        </el-col>
                        <el-col :span="4">
                            <el-card :body-style="{ padding: '0px' }">
                                <el-image :src="SCREENSHOT_ROOT + item.testName + '.minimal.legacy.png'"></el-image>
                                <div class="import-type-title">
                                    <div>自注册方式按需引入</div>
                                    <div>Minimal Import with Self Registion</div>
                                </div>
                            </el-card>
                        </el-col>
                        <el-col :span="4">
                            <el-card :body-style="{ padding: '0px' }">
                                <el-image :src="SCREENSHOT_ROOT + item.testName + '.minimal.diff.png'"></el-image>
                                <div class="import-type-title">
                                    <div>按需引入差异</div>
                                    <div>Diff of Minimal Import </div>
                                </div>
                            </el-card>
                        </el-col>
                        <el-col :span="4">
                            <el-card :body-style="{ padding: '0px' }">
                                <el-image :src="SCREENSHOT_ROOT + item.testName + '.minimal.legacy.diff.png'"></el-image>
                                <div class="import-type-title">
                                    <div>自注册方式按需引入差异</div>
                                    <div>Diff of Minimal Import with Self Registion</div>
                                </div>
                            </el-card>
                        </el-col>
                    </el-row>
                </div>
            </el-tab-pane>
        </el-tabs>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue@^2.0.0/dist/vue.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/element-ui@2.14.1/lib/index.js"></script>

    <script>
        const app = new Vue({
            el: '#app',
            data() {
                return {
                    typeCheckingResult: [],
                    screenshotsCompareResult: [],

                    SCREENSHOT_ROOT: './tmp/screenshots/',

                    tab: 'screenshots',
                    splitterModel: 10
                };
            }
        });

        fetch('./tmp/result.json')
            .then(response => response.json())
            .then(json => {
                const result = [];
                function getCompilerErrorsCount({ full, minimal, minimalLegacy }) {
                    return full.length + minimal.length + minimalLegacy.length;
                }
                function getScreenshotDiffRatio({ minimal, minimalLegacy }) {
                    return minimal.ratio + minimalLegacy.ratio;
                }

                Object.keys(json).forEach(key => {
                    result.push({
                        ...json[key],
                        compileErrorsCount: getCompilerErrorsCount(json[key].compileErrors),
                        screenshotDiffRatio: getScreenshotDiffRatio(json[key].screenshotDiff),
                        testName: key
                    });
                });
                app.typeCheckingResult = result.slice().sort((a, b) => {
                    return b.compileErrorsCount - a.compileErrorsCount;
                });
                app.screenshotsCompareResult = result.slice().sort((a, b) => {
                    return b.screenshotDiffRatio - a.screenshotDiffRatio;
                });
            });
    </script>
</body>
</html>