<template>
    <div class="tabs">
        <div class="tab-item" @click="onTabClick('kuoxian')" :class="{'active': currentTab === 'kuoxian'}">
            垂直廓线
            <img src="/images/line.png" v-if="currentTab === 'kuoxian'" />
        </div>
        <div class="tab-item" @click="onTabClick('shixu')" :class="{'active': currentTab === 'shixu'}">
            对流指数
            <img src="/images/line.png" v-if="currentTab === 'shixu'" />
        </div>
        <div class="tab-item" @click="onTabClick('T-logP')" :class="{'active': currentTab === 'T-logP'}">
            T-logP图
            <img src="/images/line.png" v-if="currentTab === 'T-logP'" />
        </div>
        <div class="tab-item" @click="onTabClick('BPFY')" :class="{'active': currentTab === 'BPFY'}">
            BP反演产品
            <img src="/images/line.png" v-if="currentTab === 'BPFY'" />
        </div>
    </div>
    <div class="main">
        <div class="menu panel">
            <div class="menu-item">
                <h2 class="tip">区域选择</h2>
                <el-row :gutter="12">
                    <el-col :span="8"><span @click="onRegionClick('jiangning')" :class="{'active': currentRegion === 'jiangning'}">江宁</span></el-col>
                    <el-col :span="8"><span @click="onRegionClick('liuhe')" :class="{'active': currentRegion === 'liuhe'}">六合</span></el-col>
                    <el-col :span="8"><span @click="onRegionClick('pukou')" :class="{'active': currentRegion === 'pukou'}">浦口</span></el-col>
                    <el-col :span="8"><span @click="onRegionClick('gaochun')" :class="{'active': currentRegion === 'gaochun'}">高淳</span></el-col>
                    <el-col :span="8"><span @click="onRegionClick('lishui')" :class="{'active': currentRegion === 'lishui'}">溧水</span></el-col>
                </el-row>
            </div>
            <div class="menu-item" v-if="currentTab === 'kuoxian' || currentTab === 'shixu'">
                <h2 class="tip">要素选择</h2>
                <el-row :gutter="12">
                    <el-col :span="8" v-if="currentTab === 'kuoxian'"><span @click="onElementClick('TEMPERATURE', 'TEMP')" :class="{'active': currentElement === 'TEMPERATURE'}">温度</span></el-col>
                    <el-col :span="8" v-if="currentTab === 'kuoxian'"><span @click="onElementClick('HUMIDITY', 'RH')" :class="{'active': currentElement === 'HUMIDITY'}">湿度</span></el-col>
                    <el-col :span="8" v-if="currentTab === 'shixu'"><span @click="onElementClick('CAPE时序图', 'CAPE')" :class="{'active': currentElement === 'CAPE时序图'}">CAPE</span></el-col>
                    <el-col :span="8" v-if="currentTab === 'shixu'"><span @click="onElementClick('CIN时序图', 'CIN')" :class="{'active': currentElement === 'CIN时序图'}">CIN</span></el-col>
                </el-row>
            </div>
        </div>
        <div class="container panel">
            <div class="toolbar">
                <div class="times">
                    <div class="time-item" v-for="(time, index) in times" :key="index" :class="{'active': currentTime === time.date, 'first-hour': time.minute === '00'}">
                        <span class="hour">{{time.hour}}</span>
                        <span class="minute" @click="onTimeClick(time, index)">{{time.minute}}</span>
                    </div>
                </div>
                <el-date-picker v-model="date" type="date" placeholder="请选择" :clearable="false" :editable="false" class="date-picker" @change="onChange">
                </el-date-picker>
                <div class="control-btn">
                    <span @click="onPrevDayClick"><img src="/images/prev.png" /></span>
                    <span @click="onNextDayClick"><img src="/images/next.png" /></span>
                </div>
                <el-select v-model="currentHour" placeholder="" @change="onChange">
                    <el-option
                    v-for="item in hours"
                    :key="item.value"
                    :label="item.label"
                    :value="item.value"
                    >
                    </el-option>
                </el-select>
                <p class="unit">时</p>
                <div class="refresh-btn" @click="onRefreshClick">
                    <img src="/images/refresh.png" />
                </div>
                <div class="btns-group">
                    <span @click="onPlayClick">{{isPlay ? '暂停动画' : '播放动画'}}</span>
                    <span>下载动画</span>
                </div>
            </div>
            <div class="picture-view">
                <span class="arrow arrow-prev" @click="onPrevImgClick"><img src="/images/prev-btn.png" /></span>
                <span class="arrow arrow-next" @click="onNextImgClick"><img src="/images/next-btn.png" /></span>
                <a href="/images/picture1.png" download class="save-btn"><img src="/images/save.png" /></a>
                <div class="picture-container">
                    <h2 class="title">{{title}}</h2>
                    <div class="picture">
                        <el-image
                            :src="imgUrl"
                            :preview-src-list="srcList"
                            :initial-index="0"
                            fit="contain"
                        >
                            <template #error>
                                <div class="image-slot">
                                    <img src="/images/null-picture.png" />
                                </div>
                                <p class="image-tip">暂无图片</p>
                            </template>
                            <template #placeholder>
                                <div class="image-placeholder">正在加载...</div>
                            </template>
                        </el-image>
                    </div>
                </div>
            </div>
        </div>
    </div>
</template>

<script lang="ts">
    import { onMounted, reactive, toRefs } from 'vue';
    import moment from "moment";
    import { MicrowaveRadiationConfig } from '../uilts/Config';
    
    export default {
        name: 'MicrowaveRadiation',
        setup() {
            let timer = null;
            let options = reactive({
                currentTab: 'kuoxian',
                currentRegion: 'jiangning',
                currentType: 'TEMP',
                currentElement: 'TEMPERATURE',
                currentCategory: 'CAPE',
                date: moment('2020-07-01').format('YYYY-MM-DD'),
                currentHour: '10',
                hours: [],
                times: [],
                currentTime: null,
                imgUrl: '/images/default-picture.png',
                srcList: [],
                isPlay: false,
                title: null,
                index: 0
            })

            onMounted(() => {
                initHours();
                initTimeLine();
                setTitle(moment(options.date, 'YYYY-MM-DD').hour(parseInt(options.currentHour)));
                setTimeout(() => {
                    activeImage(moment(options.times[options.times.length - 1].date).hour(), moment(options.times[options.times.length - 1].date).minute());
                }, 50);
            })
            
            const onTabClick = (name) => {
                options.currentTab = name;
                if (options.currentTab === 'kuoxian') {
                    options.currentType = 'TEMP';
                    options.currentElement = 'TEMPERATURE';
                } else if (options.currentTab === 'shixu') {
                    options.currentType = 'CAPE';
                    options.currentElement = 'CAPE时序图';
                } else if (options.currentTab === 'T-logP') {
                    options.currentType = 'T-logP';
                    options.currentElement = 'T-logP';
                } else {
                    options.currentType = 'BPFY';
                    options.currentElement = 'BPFY';
                }

                cancelActive();
                setTitle(moment(options.date).hour(parseInt(options.currentHour)));
                activeImage(moment(options.times[options.index].date).hour(), moment(options.times[options.index].date).minute());
            }

            const onRegionClick = (region) => {
                options.currentRegion = region;

                cancelActive();
                setTitle(moment(options.date).hour(parseInt(options.currentHour)));
                activeImage(moment(options.times[options.index].date).hour(), moment(options.times[options.index].date).minute());
            }

            const onElementClick = (element, type) => {
                options.currentElement = element;
                options.currentType = type;

                cancelActive();
                setTitle(moment(options.date).hour(parseInt(options.currentHour)));
                activeImage(moment(options.times[options.index].date).hour(), moment(options.times[options.index].date).minute());
            }

            const onCategoryClick = (category) => {
                options.currentCategory = category;
            }

            const setTitle = (date) => {
                options.title = date.format('YYYY.MM.DD HH:mm') + '  ' + options.currentElement;
            }

            const activeImage = (hour, minute) => {
                let time = moment(options.date).hour(hour).minute(minute);
                let type = (options.currentTab === 'T-logP' || options.currentTab === 'BPFY') ? options.currentTab : (options.currentTab + '_' + options.currentType);
                options.imgUrl = MicrowaveRadiationConfig.getUrl(options.currentRegion, type, time);
                options.srcList = [options.imgUrl];
            }

            const initTimeLine = () => {
                options.times = [];
                options.currentTime = moment(options.date).hour(parseInt(options.currentHour)).format('YYYY-MM-DD HH:mm');

                let now = moment(options.date).hour(parseInt(options.currentHour) - 2);

                let minute = now.minute();
                const remainder = minute % 6;
                if (remainder > 0){
                    now.minute(minute + (6 - remainder));
                }

                now.minute(now.minute() - 6);

                for (let i = 0; i < 21 ; i++) {
                    options.times.push({
                        hour: now.add(6, 'minute').format('HH时'),
                        minute: now.format('mm'),
                        date: now.format('YYYY-MM-DD HH:mm'),
                        name: 'hour' + now.format('HH')
                    });
                }
                options.index = options.times.length - 1;
            }

            const initHours = () => {
                for (let i = 0; i < 23; i++) {
                    options.hours.push({
                        value: i,
                        label: i < 10 ? '0' + i : i,
                    })
                }
            }

            const onTimeClick = (time, index) => {
                options.currentTime = time.date;
                options.index = index;
                cancelActive();
                setTitle(moment(time.date, 'YYYY-MM-DD HH:mm'));
                activeImage(moment(time.date).hour(), moment(time.date).minute());
            }

            const cancelActive = () => {
                clearTimer();
                options.isPlay = false;
            }

            const onPrevDayClick = () => {
                options.date = moment(options.date).add(-1, 'day').format('YYYY-MM-DD')
            }

            const onNextDayClick = () => {
                options.date = moment(options.date).add(1, 'day').format('YYYY-MM-DD')
            }

            const onPrevImgClick = () => {
                console.log(options.index);
                let element = getCurrentElement();

                options.index--;
                if (options.index < 0)
                    options.index = element.childElementCount - 1;

                setCurrentPlayElement(element);
            }
            
            const onNextImgClick = () => {
                let element = getCurrentElement();

                options.index++;
                if (options.index > element.childElementCount - 1)
                    options.index = 0;
                
                setCurrentPlayElement(element);
            }

            const onRefreshClick = () => {
                cancelActive();
                options.date = moment('2020-07-01').format('YYYY-MM-DD');
                options.currentHour = '10';
            }

            const onPlayClick = () => {
                options.isPlay = !options.isPlay;
                if (options.isPlay) {
                    timeExcute();
                } else {
                    clearTimer();
                }
            }

            const timeExcute = () => {
                clearTimer();

                let element = getCurrentElement();;

                timer = setInterval( () => {
                    options.index++;
                    if (options.index > element.childElementCount - 1)
                        options.index = 0;

                    setCurrentPlayElement(element);
                }, 2000)
            }

            const clearTimer = () => {
                if (timer)
                    clearInterval(timer);
            }

            const getCurrentElement = () => {
                return document.querySelector('.times');
            }

            const setCurrentPlayElement = (element) => {
                for(let i = 0; i < element.childElementCount; i++)
                    element.children[i].classList.remove('active');

                element.children[options.index].classList.add('active');
                options.currentTime = options.times[options.index].date;
                setTitle(moment(options.times[options.index].date, 'YYYY-MM-DD HH:mm'));
                activeImage(moment(options.times[options.index].date).hour(), moment(options.times[options.index].date).minute());
            }

            const onChange = () => {
                initTimeLine();
                setTitle(moment(options.date).hour(parseInt(options.currentHour)));
                activeImage(moment(options.times[options.index].date).hour(), moment(options.times[options.index].date).minute());
            }

            return {
                ...toRefs(options),
                onTabClick,
                onRegionClick,
                onElementClick,
                onCategoryClick,
                onTimeClick,
                onPrevDayClick,
                onNextDayClick,
                onPrevImgClick,
                onNextImgClick,
                onRefreshClick,
                onPlayClick,
                onChange
            }
        }
    }
</script>
<style lang="less" scoped>
    
</style>
