<template>
    <div class="login" @keyup.enter="clickLogin">
        <div class="loginModule" ref="formWrap">
            <div class="logo">
                <img src="@/assets/images/logo.png" alt="" />
            </div>
            <div class="form">
                <el-form ref="loginFormRef" :rules="loginRules" :model="loginForm">
                    <el-form-item prop="username">
                        <el-input
                            clearable
                            placeholder="用户名"
                            v-model="loginForm.username"
                        >
                        </el-input>
                    </el-form-item>
                    <el-form-item prop="password">
                        <el-input
                            clearable
                            show-password
                            placeholder="密码"
                            v-model="loginForm.password"
                        >
                        </el-input>
                    </el-form-item>
                    <div class="sliderValidate">
                        <div
                            class="validateWrap"
                            ref="sliderWrap"
                            :class="{
                                validatePass: validPass
                            }"
                        >
                            <div class="block" ref="slider">
                                <img
                                    v-show="validPass"
                                    src="@/assets/images/Login/slider-icon.png"
                                    alt="滑块"
                                />
                                <div class="sliderIcon" v-show="!validPass">
                                    <DArrowRight style="width: 1em; height: 1em; " />
                                </div>
                            </div>
                            <span v-show="validPass" class="validatePass">验证通过</span>
                            <span v-show="!validPass" class="noValidate">拖动滑块校验</span>
                        </div>
                    </div>
                    <div class="showResetPassword">
                        <p>
                            <span class="sliderValid" v-if="showSliderWarn">请拖动滑块完成校验</span>
                        </p>
                    </div>
                </el-form>
                <a-button class="loginButton" type="primary" @click="clickLogin">登录</a-button>
            </div>
        </div>
    </div>
</template>
<script lang="ts" setup>
import { reactive, ref, unref, onMounted, inject, getCurrentInstance } from "vue";
import { login } from "@/api/User";
import throttle from "@/utils/common"
const Mes: any = inject('$message')
import { submitEncrypt } from '@/utils/jsencrypt';
interface loginData {
    username: string;
    password: string;
}
let loginForm = reactive<loginData>({
    username: "",
    password: ""
});
const usernameCheck = async (rule: any, value: string, cb: any) => {
    if (!/^\w{5,20}$/g.test(value)) {
        return cb("用户名不合法");
    }
  
};
let loginRules = reactive({
    username: [ { required: true, message: "请输入用户名", trigger: "blur" }, { validator: usernameCheck, trigger: 'blur' } ],
    password: [ { required: true, message: "请输入密码", trigger: "blur" } ]
});
const loginFormRef = ref();
const validPass = ref(false)
const showSliderWarn = ref(false)
const slider = ref()
const sliderWrap = ref()
const formWrap = ref()
function sliderEvent() {
    if (!slider.value || !sliderWrap.value) return null;
    
    const sliderBoxWidth = sliderWrap.value.clientWidth;
    
    const sliderWidth = slider.value.clientWidth;
    
    const maxSlideX = sliderBoxWidth - sliderWidth;
    
    const formClientX = formWrap.value.offsetLeft + 43;
    
    slider.value.onmousedown = function(e: any) {
        const offsetX = e.offsetX
        
        if (validPass.value) {
            return
        }
        
        document.onmousemove = function(e: any) {
            if (validPass.value) {
                document.onmousemove = null;
                document.onmouseup = null;
                return;
            }
            const x = e.clientX - formClientX - offsetX;
            if (x > 0 && x < maxSlideX) {
                slider.value.style.left = x + "px";
            }
            if (x < 0) {
                slider.value.style.left = "0px";
            }
            if (x > maxSlideX) {
                slider.value.style.left = maxSlideX + "px";
                validPass.value = true;
                showSliderWarn.value = false;
            }
            if (x === maxSlideX) {
                validPass.value = true;
                showSliderWarn.value = false;
            }
        }
        
        document.onmouseup = function(e: any) {
            const centerX = sliderBoxWidth / 2 - 23;
            let x = e.clientX - formClientX - offsetX;
            
            let timer: any = null;
            
            
            if (x <= centerX && x > 0) {
                timer = setInterval(() => {
                    x -= 2;
                    if (x <= 0) {
                        clearInterval(timer);
                        slider.value.style.left = "0px";
                    }
                    
                    slider.value.style.left = x + "px";
                }, 1);
            } else if (x > centerX && x < maxSlideX) { 
                timer = setInterval(() => {
                    x += 2;
                    if (x >= maxSlideX) {
                        clearInterval(timer);
                        slider.value.style.left = maxSlideX + "px";
                        validPass.value = true;
                        showSliderWarn.value = false;
                    }
                    slider.value.style.left = x + "px";
                }, 1);
            }
            document.onmousemove = null;
            document.onmouseup = null;
        }
    }
}
const throttles = throttle(2000);
const clickLogin = () => {
    throttles(async () => {
        const form: any = unref(loginFormRef)
        await form.validate()
        if (validPass.value) {
            showSliderWarn.value = false;
            
            await isLogin();
        } else {
            showSliderWarn.value = true;
        }
    })
}
async function isLogin() {
    try {
        const { data } = await login({
            username: loginForm.username,
            password: submitEncrypt(loginForm.password)
        })
        if (data.code) {
        	
        }else{
        	
        }
        
   
    } catch (err) {
        console.log('e', err)
        Mes.error('用户名或密码错误,请重试')
    }
}
onMounted(() => {
    
    sliderEvent()
});
</script>
<style lang="scss" scoped src="./Login.scss"></style>