<template>
  <div>
    <div :id="iscsId" v-loading="loading" :style="{ width: this.canvasWidth +'px', height: this.canvasHeight +'px',background:'#000' }" class="iscs-canvas" />
    <el-button v-if="showBackButton" class="iscs-button" type="primary" @click="back">{{ $t('global.back') }}</el-button>
  </div>
</template>

<script>
import Vue from 'vue';
import Iscs from '@/iscs/iscs';
import { parser } from '@/iscs/utils/parser';
import { mapGetters } from 'vuex';
import { exitFullscreen } from '@/utils/screen';
import { putJointTrainingSimulationUser } from '@/api/chat';
import { handlerIscsEvent } from '@/api/simulation';
import { IscsOperation } from '@/scripts/ConstDic';

export default {
    name: 'Iscs',
    props: {
        size: {
            type: Object,
            default() {
                return null;
            }
        }
    },
    data() {
        return {
            dataZoom: {
                offsetX: '0',
                offsetY: '0',
                scaleRate: '1'
            },
            config: {
                scaleRate: '1',
                origin: {
                    x: 0,
                    y: 0
                }
            },
            showBackButton: true,
            initTime: '',
            started: false,
            loading: false,
            stationCode: '',
            banUpOpenScreenDoor: false,
            banDownOpenScreenDoor: false
        };
    },
    computed: {
        ...mapGetters([
            'canvasWidth',
            'canvasHeight'
        ]),
        iscsId() {
            return ['iscs', (Math.random().toFixed(5)) * 100000].join('_');
        },
        width() {
            return this.$store.state.config.width;
        },
        height() {
            return this.$store.state.config.height;
        }
    },
    watch: {
        '$store.state.config.canvasSizeCount': function (val) {
            this.reSize();
        },
        '$store.state.app.windowSizeCount': function() {
            this.setWindowSize();
        },
        '$store.state.training.initTime': function (initTime) {
            this.initTime = initTime;
            if (this.$iscs) {
                this.initClockTime(initTime);
            }
        },
        '$store.state.training.started': function (started) {
            this.started = started;
            if (this.$iscs) {
                this.setClockStart(started);
            }
        },
        '$store.state.socket.equipmentStatus': function (val) {
            if (val.length) {
                this.statusMessage(val);
            }
        }
    },
    mounted() {
    },
    beforeDestroy() {
        this.iscsDestroy();
    },
    methods: {
        show (deviceCode, iscsPart) {
            if (!deviceCode) {
                return;
            }
            this.stationCode = deviceCode;
            document.getElementById(this.iscsId).oncontextmenu = function (e) {
                return false;
            };
            let offsetX = 0;
            if (iscsPart === 'left') {
                offsetX = 0;
            } else if (iscsPart === 'right') {
                offsetX = 1920;
            }
            this.iscsDestroy();
            this.loading = true;
            const data = {};
            this.$iscs = new Iscs({
                dom: document.getElementById(this.iscsId),
                config: {
                    renderer: 'canvas',
                    width: this.canvasWidth,
                    height: this.canvasHeight
                },
                options: {
                    scaleRate: 1,
                    offsetX: offsetX,
                    offsetY: 0
                },
                methods: {
                    viewLoaded: this.handleViewLoaded
                }
            });
            Vue.prototype.$iscs = this.$iscs;
            this.$iscs.on('contextmenu', this.onContextMenu, this);
            if (this.$route.query.group) {
                this.$iscs.on('selected', this.onSelected, this);
            }
            this.setIscs(data, {});
            this.$store.dispatch('iscs/setIscsData', {});
            this.handleBanOpenScreenDoorStatus();
            this.initClockTime(this.initTime);
            window.document.oncontextmenu = function () {
                return false;
            };
        },
        setIscs(data, oldData) {
            this.$iscs.setIscs(oldData, data);
        },
        handleBanOpenScreenDoorStatus() {
            this.$store.state.iscs.iscs['keyList'].forEach(item => {
                if (item.mean === 'Ban_Down_Open_Screen_Door') {
                    item.status === 'on' ? this.banDownOpenScreenDoor = false : this.banDownOpenScreenDoor = true;
                } else if (item.mean === 'Ban_Up_Open_Screen_Door') {
                    item.status === 'on' ? this.banUpOpenScreenDoor = false : this.banUpOpenScreenDoor = true;
                }
            });
        },
        // 点击选择事件
        onSelected(em) {
            if (em.deviceModel.mean) {
                switch (IscsOperation[em.deviceModel.mean].event) {
                case 'UpHoldTrain':
                case 'UpCancelHoldTrain':
                case 'DownHoldTrain':
                case 'DownCancelHoldTrain':
                    handlerIscsEvent(this.$route.query.group, {operate:IscsOperation[em.deviceModel.mean].operate, stationCode:this.stationCode});
                    break;
                case 'BanUpOpenScreenDoor':
                    this.banUpOpenScreenDoor = !this.banUpOpenScreenDoor;
                    break;
                case 'BanDownOpenScreenDoor':
                    this.banDownOpenScreenDoor = !this.banDownOpenScreenDoor;
                    break;
                case 'UpOpenScreenDoor':
                    this.openScreenDoor(this.banUpOpenScreenDoor, IscsOperation[em.deviceModel.mean].operate);
                    break;
                case 'DownOpenScreenDoor':
                    this.openScreenDoor(this.banDownOpenScreenDoor, IscsOperation[em.deviceModel.mean].operate);
                    break;
                }
            }
        },
        openScreenDoor(flag, operate) {
            if (flag) {
                handlerIscsEvent(this.$route.query.group, {operate: operate, stationCode:this.stationCode});
            }
        },
        // 右键点击事件
        onContextMenu(em) {
            this.$store.dispatch('iscs/setUpdateDeviceData', em.eventTarget.model);
        },
        // 绘图时调用，元素可拖拽
        drawIscsInit() {
            this.$iscs && this.$iscs.drawIscsInit();
            this.showBackButton = false;
        },
        // 初始化电子表时间
        initClockTime(initTime) {
            this.$iscs.initClockTime(initTime);
        },
        // 设置电子时钟开始或停止
        setClockStart(started) {
            this.$iscs.setClockStart(started);
        },
        reSize() {
            this.$nextTick(() => {
                this.width = this.$store.state.config.width;
                this.height = this.$store.state.config.height;
                this.$iscs && this.$iscs.resize({ width: this.width, height: this.height });
            });
        },
        setWindowSize() {
            this.$nextTick(() => {
                const width = this.size ? this.size.width : this.$store.state.app.width;
                const height = this.size ? this.size.height : this.$store.state.app.height;
                this.$store.dispatch('config/resize', { width: width, height: height });
            });
        },
        back() {
            this.group = this.$route.query.group;
            this.$store.dispatch('training/over').then(() => {
                putJointTrainingSimulationUser(this.group).then(() => {
                    this.$router.replace({ path: `/trainroom`, query: { group: this.group, lineCode:this.$route.query.lineCode } });
                    exitFullscreen();
                });
            });
        },
        iscsDestroy() {
            if (this.$iscs) {
                this.$iscs.dispose();
                this.$iscs = '';
                Vue.prototype.$iscs = '';
            }
        },
        handleViewLoaded() {
            this.loading = false;
        },
        statusMessage(val) {
            this.$iscs && this.$iscs.setDeviceStatus(val);
        }
    }
};
</script>
<style rel="stylesheet/scss" lang="scss" scoped>
    .iscs-button{
        position: absolute;
        float: right;
        right: 20px;
        bottom: 15px;
    }
    .iscs-canvas{
    }
</style>
