<template>
    <div @keyup.enter="onSubmit(formRef)">
        <div @contextmenu.stop="" id="bubble" class="bubble">
            <canvas id="bubble-canvas" class="bubble-canvas"></canvas>
        </div>
        <div class="login-image"></div>
        <div class="login-container-form">
            <div class="title-container">
                <div class="title">
                    <span style="font-size: 28px">{{ getThemeList.name || '电能质量监测系统' }}</span>
                </div>
            </div>
            <el-form :rules="rules" ref="formRef" size="large" class="login-form form-one" :model="form">
                <el-form-item prop="username">
                    <el-input 
                        ref="usernameRef"
                        v-model.trim="form.username"
                        type="text"
                        clearable
                        placeholder="用户名"
                       
                    >
                        <template #prefix>
                            <span class="iconfont icon-yonghu" style="color: var(--el-color-primary)"></span>
                            <!-- <Icon name="fa fa-user" style="color: var(--el-color-primary); font-size: 16px" /> -->
                        </template>
                    </el-input>
                </el-form-item>
                <el-form-item prop="password">
                    <el-input 
                        ref="passwordRef"
                        v-model.trim="form.password"
                        type="password"
                        clearable
                        placeholder="密码"
                        show-password
                    >
                        <template #prefix>
                            <span class="iconfont icon-mima" style="color: var(--el-color-primary)"></span>
                        </template>
                    </el-input>
                </el-form-item>
                <el-form-item>
                    <el-button
                        :loading="state.submitLoading"
                        class="submit-btn"
                        round
                        type="info"
                        @click="onSubmit(formRef)"
                    >
                        登录
                    </el-button>
                </el-form-item>
            </el-form>
        </div>
        <div class="copy-right">
            <span>版权所有 @ 南京灿能电力自动化股份有限公司</span>
            <br />
            <img style="width: 20px; height: 20px; position: absolute" src="@/assets/login/jhui.png" />

            <span>　　苏公网安备 32011502011902号</span>
        </div>
        <PopupUpdatePwd ref="popupUpdatePwdRef"></PopupUpdatePwd>
    </div>
</template>

<script setup lang="ts">
import { onMounted, onBeforeUnmount, reactive, ref, nextTick } from 'vue'
import * as pageBubble from '@/utils/pageBubble'
import { ElMessage } from 'element-plus'
import { gongkey, login, getSysConfig } from '@/api/user-boot/user'
import { useAdminInfo } from '@/stores/adminInfo'
import type { FormInstance, InputInstance, FormRules } from 'element-plus'
import { UserFilled, Edit, Delete, SetUp } from '@element-plus/icons-vue'
import { useRouter } from 'vue-router'
import { ADMIN_INFO } from '@/stores/constant/cacheKey'
import { Local } from '@/utils/storage'
import { getTheme } from '@/api/systerm'
import { useConfig } from '@/stores/config'
import PopupUpdatePwd from './popupUpdatePwd.vue'

const router = useRouter()
let timer: number
const configStore = useConfig()
const popupUpdatePwdRef = ref()
const formRef = ref<FormInstance>()
const usernameRef = ref<InputInstance>()
const passwordRef = ref<InputInstance>()
const userInfo = useAdminInfo()
Local.remove(ADMIN_INFO)
userInfo.removeToken()
const getThemeList: any = ref([])
interface RuleForm {
    username: string
    password: string
}

const state = reactive({
    showCaptcha: false,
    submitLoading: false
})
const form = reactive({
    username: '',
    password: ''
})

const rules = reactive<FormRules<RuleForm>>({
    username: [{ required: true, trigger: 'blur', message: '请输入用户名' }],
    password: [{ required: true, trigger: 'blur', message: '请输入密码' }]
})

const focusInput = () => {
    if (form.username === '') {
        usernameRef.value!.focus()
    } else if (form.password === '') {
        passwordRef.value!.focus()
    }
}

onMounted(() => {
    timer = window.setTimeout(() => {
        pageBubble.init()
    }, 0)
    fetchMqttUrl()
})
let buildUrl = 'ws://112.4.144.18:38083/mqtt' //27
const fetchMqttUrl = async () => {
    const response = await fetch('/')
    const mqttUrl = response.headers.get('X-Mqtt-Url')
    const zutai = response.headers.get('X-Mqttzutai-Url')

    window.localStorage.setItem('MQTTURL', mqttUrl || buildUrl)
    window.localStorage.setItem('MQTTZUTAI', zutai || '')
}

onBeforeUnmount(() => {
    clearTimeout(timer)
    pageBubble.removeListeners()
})
getTheme().then(res => {
    document.title = res.data.name || '电能质量在线监测系统'

    let list: any = [
        'elementUiPrimary',
        'tableHeaderBackground',
        'tableHeaderColor',
        'tableCurrent',
        'menuBackground',
        'menuColor',
        'menuTopBarBackground',
        'menuActiveBackground',
        'menuActiveColor',
        'headerBarTabColor',
        'headerBarBackground'
    ]
    getThemeList.value = res.data
    window.localStorage.setItem('getTheme', JSON.stringify(res.data))
    for (let i = 0; i < list.length; i++) {
        configStore.setLayout(list[i], JSON.parse(res.data[list[i]]))
    }
    configStore.setLayout('elementUiPrimary', JSON.parse(res.data['elementUiPrimary']))
})
const onSubmit = async (formEl: FormInstance | undefined) => {
    if (!formEl) return
    await formEl.validate((valid, fields) => {
        if (valid) {
            state.submitLoading = true
            login({
                username: form.username,
                password: form.password,
                grant_type: 'captcha',
                imageCode: '',
                verifyCode: 0
            })
                .then(res => {
                    userInfo.dataFill(res.data)
                    state.submitLoading = false
                    getSysConfig().then(res => {
                        window.localStorage.setItem('sysdata', JSON.stringify(res.data))
                    })
                    router.push({
                        path: '/'
                    })
                })
                .catch(err => {
                    if (err.code === 'A0101' && err.message === '登录认证,密码失效，请重置') {
                        popupUpdatePwdRef.value.open(form.username)
                    }
                })
            setTimeout(() => {
                state.submitLoading = false
            }, 500)
        }
    })
}
</script>

<style scoped lang="scss">
.bubble {
    position: relative;
    width: 100%;
    min-height: 100%;
    overflow: hidden;
    background-color: var(--el-color-primary) !important;
    background-position: center 110px;
    background-repeat: repeat;
    background-size: 100%;
    background-image: url(https://gw.alipayobjects.com/zos/rmsportal/TVYTbAXWheQpRcWDaDMu.svg);
}

.login-image {
    position: absolute;
    top: 50%;
    left: 20%;
    min-width: 45%;
    min-height: 80%;

    background: url('../../assets/login/login2.png') no-repeat center center;
    background-size: contain;
    transform: translate(-15%, -50%);
    // box-shadow: 0 0 0 #011b2bab;
}

.form-item-icon {
    height: auto;
}

.login-container-form {
    position: absolute;
    top: 50%;
    left: 85%;
    width: 500px;
    height: auto;
    border-radius: 30px;
    transform: translate(-85%, -50%);
    box-shadow: 3px 3px 2px 2px #011b2bab;

    .title-container {
        position: relative;
        width: 398px;
        max-width: 100%;
        padding: 20px 0 0;
        margin: 0 auto;

        .title {
            margin-bottom: 20px;
            font-size: 33px;
            font-weight: 600;
            color: rgba(255, 255, 255, 0.85);
            text-align: center;

            & :v-deep .svg-icon {
                // color: $;
            }

            .logo {
                width: 46px;
                height: 46px;
                margin-right: 10px;
                vertical-align: middle;
            }
        }
    }
}

.login-form {
    position: relative;
    width: 368px;
    max-width: 100%;
    //padding: 20px 0 0;
    margin: 0 auto;
    margin-bottom: 20px;
    overflow: hidden;

    &.el-input {
        input {
            height: 40px;
            padding-right: 40px;
            padding-left: 40px;
            line-height: 40px;
            border-radius: 5px;
        }

        .el-input__prefix,
        .el-input__suffix {
            width: 40px;
            line-height: 40px;

            .svg-icon {
                font-size: 16px;
                vertical-align: -0.25em;
            }
        }

        .el-input__prefix {
            left: 0;
        }

        .el-input__suffix {
            right: 0;
        }
    }
}

.copy-right {
    position: absolute;
    bottom: 10px;
    width: 100%;
    font-size: 14px;
    color: rgb(233, 229, 229);
    text-align: center;
}

:v-deep.el-form-item--large {
    margin-bottom: 15px;
}

.submit-btn {
    width: 100%;
    margin-top: 0px;
    margin-bottom: 20px;
    background: var(--el-color-primary-light-3);
    // background: #009688;
    //background: #4d6ea1;
    border-radius: 0;

    &:hover {
        background: var(--el-color-primary-light-5);
    }
}

@media screen and (max-width: 720px) {
    .login {
        display: flex;
        align-items: center;
        justify-content: center;

        .login-box {
            width: 340px;
            margin-top: 0;
        }
    }
}

@media screen and (max-height: 800px) {
    .login .login-box {
        margin-bottom: 0;
    }
}
</style>
