<script setup lang="ts">
import type { TabPanelName } from 'element-plus';
import ogRequest from '../../request';
import { useRequest } from "vue-request";
import { osLogType, dbLogType, optionType } from './common';
import { cloneDeep } from 'lodash-es';
import { Refresh } from '@element-plus/icons-vue';
    
    type Res = {
        tableData: string[],
        page: {
            count: number,
            current: number
        }
    } | undefined;
    
const logTypeOption = ref<Array<optionType>>(osLogType);
const system = ref('OS');
const tableData = ref<Array<any>>([]);
const cluster = ref<Array<any>>([]);
const initFormData = { 
    searchPhrase: '',
    type: 'all',
    dateValue: [],
}
const formData = reactive(cloneDeep(initFormData));
const page = reactive({
    pageSize: 10,
    currentPage: 1,
    total: 0
});
const queryData = computed(() => {
    const { dateValue, searchPhrase, type } = formData;
    const { pageSize: rowCount, currentPage: current } = page;
    const queryObj = {
        startDate: dateValue.length ? dateValue[0] : '',
        endDate: dateValue.length ? dateValue[1] : '',
        system: system.value,
        type,
        rowCount,
        searchPhrase,
        current,
        clusterId: cluster.value.length ? cluster.value[0] : '',
        nodeId: cluster.value.length ? cluster.value[1] : '',
    }
    return queryObj;
});
    
onMounted(() => {
    requestData();
});
    
const { data: res, run: requestData } = useRequest(() => {
    return ogRequest.post("/sql-diagnosis/api/v1/monitoring/logRetrieval", queryData.value) 
}, { manual: true })
    
const changetTabs = (name: TabPanelName) => {
    logTypeOption.value = name === 'OS' ? osLogType : dbLogType;
    formData.type = initFormData.type;
    requestData();
}
const handleQuery = () => { 
    page.currentPage = 1;
    requestData();
}
const handleReset = () => {
    page.currentPage = 1;
    Object.assign(formData, cloneDeep(initFormData));
    requestData();
}
const handleSizeChange = (val: number) => {
    page.currentPage = 1;
    page.pageSize = val;
    requestData();
}
const handleCurrentChange = (val: number) => {
    page.currentPage = val;
    requestData();
}
const showHighLightWord = (val: string) => {
    const reg = new RegExp(formData.searchPhrase, 'ig');
    return val.replace(reg, (substring) => {
        return `<font color="orange">${substring}</font>`;
    });
}
const handleClusterValue = (val:any) => {
    cluster.value = val;
}
    
watch(res, (res: Res) => {
    if (res && Object.keys(res).length) {
        const { count: total, current: currentPage } = res.page
        tableData.value = res.tableData;
        Object.assign(page, { pageSize: page.pageSize, total, currentPage });
    } else {
        tableData.value = [];
        Object.assign(page, { pageSize: page.pageSize, total: 0, currentPage: 1 });
    } 
})
</script>
    
    <template>
        <div class="page-container">
            <div class="tab-wrapper">
                    <el-form class="tab-wrapper-filter" :inline="true" :model="formData">
                        <ClusterCascader @getCluster="handleClusterValue"/>
                        <el-form-item class="filter-keyword" label="关键字">
                            <el-input v-model="formData.searchPhrase" placeholder="请输入关键字" />
                        </el-form-item>
                        <el-form-item :label="$t('datasource.logType')">
                            <el-select v-model="formData.type" :placeholder="$t('datasource.selectLogType')">
                                <el-option v-for="item in logTypeOption" :key="item.value" :label="item.label" :value="item.value" />
                            </el-select>
                        </el-form-item>
                        <el-form-item :label="$t('datasource.executeTime')">
                            <MyDatePicker
                                v-model="formData.dateValue"
                                type='datetimerange'
                                :valueFormatToISO="true"
                                class="form-data-picker"
                            />
                        </el-form-item>
                        <el-button type="primary" @click="handleQuery">{{$t('app.query')}}</el-button>
                        <el-button type="primary" @click="handleReset" :icon="Refresh" :title="$t('app.refresh')"/>
                    </el-form>
            </div>
            <div>
                <el-tabs v-model="system" @tab-change="changetTabs">
                    <el-tab-pane :label="$t('datasource.os')" name="OS" />
                    <el-tab-pane :label="$t('datasource.database')" name="DB" />
                </el-tabs>
            </div>
            <div class="table-wrapper">
                <el-table :data="tableData" style="width: 100%;" :default-sort="{ prop: 'date', order: 'descending' }">
                    <el-table-column prop="date" sortable :label="$t('datasource.executeTime')" width="250" />
                    <el-table-column :label="$t('datasource.logContent')">
                        <template #default="scope">
                        <span v-html="showHighLightWord(scope.row.data)"></span>
                        </template>
                    </el-table-column>
                </el-table>
                <el-pagination
                    v-if="tableData.length"
                    v-model:currentPage="page.currentPage"
                    v-model:pageSize="page.pageSize"
                    :total="page.total"
                    :page-sizes="[10, 20, 30, 40]"
                    class="pagination"
                    layout="total,sizes,prev,pager,next"
                    background
                    small
                    @current-change="handleCurrentChange"
                    @size-change="handleSizeChange"
                />
            </div>
        </div>
    </template>
    
    <style lang="scss" scoped>
    .page-container {
        height: 100%;
    }
    .tabs-wrapper{
        .tab-wrapper-filters{
            display: flex;
            align-items: center;
            margin:20px 0 30px;
        }
    }
    .tab-wrapper {
        background-color: #424242;
        margin-bottom: 20px;
        width: 100%;
        overflow: auto;
        &-filter {
            padding-left: 16px;
            display: flex;
            flex-wrap: nowrap;
            align-items: center;
            height: 50px;
            background-color: #424242;
        }
    }
    .table-wrapper {
        height: calc(100% - 50px);
        display: flex;
        flex-direction: column;
        justify-content: space-between;
    }
    :deep(.el-form-item) {
        margin-bottom: 0;
        margin-right: 10px;
    }
    :deep(.el-form-item__label) {
        line-height: 2.7;
    }
    :deep(.el-select) {
        width: 150px;
    }
    :deep(.el-tabs__header) {
        padding: 0 16px;
        width: calc(100% - 1080px);
        margin: 0;
    }
    :deep(.el-table__body-wrapper) {
      height: 100%;
      overflow: auto;
    }
    :deep(.el-pagination) {
        display: flex;
        justify-content: flex-end;
    }
    :deep(.form-data-picker){
        width:220px;
    }
    </style>