<template>
  <div
    :class="[
      'login-wrapper',
      ['', 'login-form-right', 'login-form-left'][direction]
    ]"
    :style="{
      backgroundImage: 'url(https://oss.wsdns.cn/20250105/314d2a3da10048b09ef0f0464fdacbff.jpg)'
    }"
  >
    <div class="logo-login" v-if="config?.siteName">
      <img
        :src="
          config.siteLogo
        "
        class="logo"
      />
      <h4>{{ config.siteName }}</h4>
    </div>
    <div class="company-name" v-if="config?.loginTitle"
      >{{ config?.loginTitle }}
    </div>
    <a-form
      ref="formRef"
      :model="form"
      :rules="rules"
      class="login-form ele-bg-white"
    >
      <div class="login-title flex justify-center items-center px-12">
        <template v-if="loginType === 'scan'">
          <h4 class="title-btn">扫码登录</h4>
        </template>
        <template v-else>
          <h4
            class="title-btn"
            :class="loginType === 'sms' ? 'active' : ''"
            @click="onLoginType('sms')"
            >手机号登录</h4
          >
          <a-divider type="vertical" style="height: 20px" />
          <h4
            class="title-btn"
            :class="loginType === 'account' ? 'active' : ''"
            @click="onLoginType('account')"
            >账号登录</h4
          >
        </template>
      </div>
      <div
        class="login-bar absolute top-0 z-50 right-0 cursor-pointer"
        @click="onScan"
      >
        <div class="go-to-register cursor-pointer">
          <img
            src="@/assets/O1CN01yz6fEl1MwaRtkJyvf_!!6000000001499-55-tps-70-70.svg"
            alt=""
          />
        </div>
        <div
          class="absolute top-2 right-2 text-lg text-white font-bold cursor-pointer"
        >
          <QrcodeOutlined v-if="loginType === 'sms'" />
          <MobileOutlined v-else />
        </div>
        <!--        <span class="absolute top-3 right-1.5 text-sm text-white font-bold cursor-pointer">{{ '登录' }}</span>-->
      </div>
      <template v-if="loginType === 'account'">
        <!--        <a-form-item name="tenantId">-->
        <!--          <a-input-->
        <!--            allow-clear-->
        <!--            size="large"-->
        <!--            v-model:value="form.tenantId"-->
        <!--            :placeholder="`请输入租户ID`"-->
        <!--          >-->
        <!--            <template #prefix>-->
        <!--              <UserOutlined />-->
        <!--            </template>-->
        <!--          </a-input>-->
        <!--        </a-form-item>-->
        <a-form-item name="username">
          <a-input
            allow-clear
            size="large"
            v-model:value="form.userId"
            :placeholder="`用户ID`"
          >
            <template #prefix>
              <UserOutlined />
            </template>
          </a-input>
        </a-form-item>
        <a-form-item name="password">
          <a-input-password
            size="large"
            v-model:value="form.password"
            placeholder="登录密码"
            @pressEnter="submit"
          >
            <template #prefix>
              <lock-outlined />
            </template>
          </a-input-password>
        </a-form-item>
        <a-form-item name="code">
          <div class="login-input-group">
            <a-input
              allow-clear
              size="large"
              type="text"
              :maxlength="5"
              v-model:value="form.code"
              placeholder="验证码"
              @pressEnter="submit"
            >
              <template #prefix>
                <safety-certificate-outlined />
              </template>
            </a-input>
            <a-button class="login-captcha" @click="changeCaptcha">
              <img v-if="captcha" :src="captcha" alt="" />
            </a-button>
          </div>
        </a-form-item>
        <a-form-item>
          <div class="flex justify-between">
            <a-checkbox v-model:checked="form.remember">
              {{ t('login.remember') }}
            </a-checkbox>
            <a class="login-forget" @click="push('/forget')">
              {{ t('login.forget') }}
            </a>
          </div>
        </a-form-item>
        <a-form-item>
          <a-button
            block
            size="large"
            type="primary"
            :loading="loading"
            @click="submit"
          >
            {{ loading ? t('login.loading') : t('login.login') }}
          </a-button>
        </a-form-item>
      </template>
      <template v-if="loginType === 'sms'">
        <a-form-item name="phone">
          <a-input
            allow-clear
            size="large"
            :maxlength="11"
            v-model:value="form.phone"
            :placeholder="`请输入手机号码`"
          >
            <template #addonBefore> +86</template>
          </a-input>
        </a-form-item>
        <a-form-item name="smsCode">
          <div class="login-input-group">
            <a-input
              placeholder="请输入验证码"
              v-model:value="form.smsCode"
              size="large"
              :maxlength="6"
              allow-clear
              @pressEnter="onLoginBySms"
            />
            <a-button
              class="login-captcha"
              :disabled="!!countdownTime"
              @click="openImgCodeModal"
            >
              <span v-if="!countdownTime">发送验证码</span>
              <span v-else>已发送 {{ countdownTime }} s</span>
            </a-button>
          </div>
        </a-form-item>
        <a-form-item>
          <a-button
            block
            size="large"
            type="primary"
            :loading="loading"
            @click="onLoginBySms"
          >
            {{ loading ? t('login.loading') : t('login.login') }}
          </a-button>
        </a-form-item>
      </template>
      <template v-if="loginType == 'scan'">
        <QrLogin
          @loginSuccess="onQrLoginSuccess"
          @loginError="onQrLoginError"
        />
      </template>
    </a-form>
    <div class="login-copyright">
      <a-space>
        <span>© {{ new Date().getFullYear() }}</span>
        <span>{{ config?.copyright || 'websoft.top Inc.' }}</span>
      </a-space>
    </div>
    <!-- 编辑弹窗 -->
    <a-modal
      :width="340"
      :footer="null"
      title="发送验证码"
      v-model:visible="visible"
    >
      <div class="login-input-group" style="margin-bottom: 16px">
        <a-input
          v-model:value="imgCode"
          :maxlength="5"
          size="large"
          placeholder="请输入图形验证码"
          allow-clear
          @pressEnter="sendCode"
        />
        <a-button class="login-captcha">
          <img alt="" :src="captcha" @click="changeCaptcha" />
        </a-button>
      </div>
      <a-button
        block
        size="large"
        type="primary"
        :loading="codeLoading"
        @click="sendCode"
      >
        立即发送
      </a-button>
    </a-modal>

    <!-- 多账户选择登录 -->
    <a-modal
      :width="500"
      :footer="null"
      title="选择账号登录"
      v-model:visible="showSelectLoginUser"
    >
      <div class="flex flex-col justify-start">
        <a-list item-layout="horizontal" :data-source="admins">
          <template #renderItem="{ item }">
            <a-list-item
              class="cursor-pointer hover:border-gray-100"
              @click="onSelectUser(item)"
            >
              <a-list-item-meta :description="`租户ID: ${item.tenantId}`">
                <template #title>
                  {{ item.tenantName }}
                </template>
                <template #avatar>
                  <a-avatar :src="item.avatar" />
                </template>
              </a-list-item-meta>
              <template #actions>
                <RightOutlined />
              </template>
            </a-list-item>
          </template>
        </a-list>
      </div>
    </a-modal>
  </div>
</template>

<script lang="ts" setup>
  import { ref, reactive, unref, watch } from 'vue';
  import { useI18n } from 'vue-i18n';
  import { useRouter } from 'vue-router';
  import { Form, message } from 'ant-design-vue';
  import {
    LockOutlined,
    UserOutlined,
    QrcodeOutlined,
    MobileOutlined,
    SafetyCertificateOutlined,
    RightOutlined
  } from '@ant-design/icons-vue';
  import { goHomeRoute, cleanPageTabs } from '@/utils/page-tab-util';
  import { login, loginBySms, getCaptcha } from '@/api/passport/login';
  import QrLogin from '@/components/QrLogin/index.vue';

  import { User } from '@/api/system/user/model';
  import { TEMPLATE_ID, THEME_STORE_NAME } from '@/config/setting';
  import { sendSmsCaptcha } from '@/api/passport/login';
  import useFormData from '@/utils/use-form-data';
  import { FormInstance } from 'ant-design-vue/es/form';
  import { configWebsiteField } from '@/api/cms/cmsWebsiteField';
  import { Config } from '@/api/cms/cmsWebsiteField/model';
  import { phoneReg } from 'ele-admin-pro';
  import router from '@/router';
  import { listAdminsByPhoneAll } from '@/api/system/user';
  import { QrCodeStatusResponse } from '@/api/passport/qrLogin';

  const useForm = Form.useForm;
  const routerInstance = useRouter();
  const { currentRoute } = routerInstance;
  const { t } = useI18n();
  const { locale } = useI18n();

  // 路由导航函数
  const push = (path: string) => {
    routerInstance.push(path);
  };

  // 登录框方向, 0 居中, 1 居右, 2 居左
  const direction = ref(0);
  // 加载状态
  const loading = ref(false);
  // 是否显示tenantId填写输入框
  const loginType = ref('sms');

  // 默认配置
  const defaultConfig: Config = {
    siteName: '小程序商城',
    siteLogo: 'https://oss.wsdns.cn/20240822/0252ad4ed46449cdafe12f8d3d96c2ea.svg',
    domain: '',
    icpNo: '',
    copyright: '',
    loginBgImg: '',
    address: '',
    tel: '',
    kefu2: '',
    kefu1: '',
    email: '',
    loginTitle: '',
    sysLogo: ''
  };

  // 配置信息（使用默认值初始化）
  const config = ref<Config>({ ...defaultConfig });

  // 加载网站配置
  const loadWebsiteConfig = async () => {
    try {
      const data = await configWebsiteField({ lang: locale.value });
      if (data) {
        // 用接口返回的数据覆盖默认值
        config.value = {
          ...defaultConfig,
          ...data,
        };
      }
    } catch (e: any) {
      console.warn('获取网站配置失败，使用默认配置:', e.message);
    }
  };
  const { form } = useFormData<User>({
    userId: undefined,
    username: '',
    phone: '',
    password: '',
    code: '',
    smsCode: '',
    tenantId: undefined,
    templateId: TEMPLATE_ID,
    isSuperAdmin: true,
    remember: true
  });

  // 验证码 base64 数据
  const captcha = ref('');
  // 验证码内容, 实际项目去掉
  const text = ref('');
  // 是否显示图形验证码弹窗
  const visible = ref(false);
  // 图形验证码
  const imgCode = ref('');
  // 发送验证码按钮loading
  const codeLoading = ref(false);
  // 验证码倒计时时间
  const countdownTime = ref(0);
  // 验证码倒计时定时器
  let countdownTimer: number | null = null;
  // 多用户选择账号登录
  const showSelectLoginUser = ref<boolean>(false);
  const admins = ref<User[]>([]);
  // const tenantId = getTenantId();

  // 表格选中数据
  const formRef = ref<FormInstance | null>(null);

  // 表单验证规则
  const rules = reactive({
    userId: [
      {
        required: true,
        message: t('login.username'),
        type: 'string'
      }
    ],
    phone: [
      {
        pattern: phoneReg,
        required: true,
        type: 'string',
        message: '手机号格式不正确',
        trigger: 'blur'
      }
    ],
    password: [
      {
        required: true,
        message: t('login.password'),
        type: 'string'
      }
    ],
    code: [
      {
        required: true,
        message: t('login.code'),
        type: 'string'
      }
    ],
    smsCode: [
      {
        required: true,
        message: t('login.code'),
        type: 'string'
      }
    ]
  });

  /* 显示发送短信验证码弹窗 */
  const openImgCodeModal = () => {
    if (!form.phone) {
      message.error('请输入手机号码');
      return;
    }
    imgCode.value = '';
    changeCaptcha();
    visible.value = true;
  };

  /* 发送短信验证码 */
  const sendCode = () => {
    if (!imgCode.value) {
      message.error('请输入图形验证码');
      return;
    }
    if (text.value !== imgCode.value.toLowerCase()) {
      message.error('图形验证码不正确');
      return;
    }
    codeLoading.value = true;
    sendSmsCaptcha({ phone: form.phone }).then(() => {
      message.success('短信验证码发送成功, 请注意查收!');
      visible.value = false;
      codeLoading.value = false;
      countdownTime.value = 30;
      // 开始对按钮进行倒计时
      countdownTimer = window.setInterval(() => {
        if (countdownTime.value <= 1) {
          countdownTimer && clearInterval(countdownTimer);
          countdownTimer = null;
        }
        countdownTime.value--;
      }, 1000);
    });
  };

  // const { clearValidate, validate, validateInfos } = useForm(form, rules);

  const { resetFields } = useForm(form, rules);

  const goHome = () => {
    const { query } = unref(currentRoute);
    goHomeRoute(query.from as string);
    localStorage.removeItem(THEME_STORE_NAME);
  };

  const onLoginBySms = () => {
    if (!formRef.value) {
      return;
    }
    formRef.value
      .validate()
      .then(() => {
        loading.value = true;
        form.code = form.smsCode?.toLowerCase();
        loginBySms(form)
          .then((msg) => {
            if (msg == '请选择登录用户') {
              showSelectLoginUser.value = true;
              listAdminsByPhoneAll({
                phone: form.phone,
                templateId: TEMPLATE_ID
              }).then((data) => {
                admins.value = data;
              });
              return false;
            } else {
              message.success(msg);
              loading.value = false;
              resetFields();
              cleanPageTabs();
              goHome();
            }
          })
          .catch((e: Error) => {
            message.error(e.message);
            loading.value = false;
          });
      })
      .catch(() => {});
  };

  const onSelectUser = (item: User) => {
    form.tenantId = item.tenantId;
    onLoginBySms();
  };

  /* 保存编辑 */
  const submit = () => {
    if (!formRef.value) {
      return;
    }
    formRef.value
      .validate()
      .then(() => {
        // if (form.code?.toLowerCase() !== text.value) {
        //   message.error('验证码错误');
        //   changeCaptcha();
        //   return;
        // }
        loading.value = true;
        form.code = form.code?.toLowerCase();
        form.phone = undefined;
        login(form)
          .then((msg) => {
            if (msg == '请选择登录用户') {
              showSelectLoginUser.value = true;
              return false;
            }
            // 登录成功
            message.success(msg);
            loading.value = false;
            resetFields();
            cleanPageTabs();
            goHome();
          })
          .catch((e: Error) => {
            message.error(e.message);
            loading.value = false;
          });
      })
      .catch(() => {});
  };

  // const doRegister = () => {
  //   registerUser(form)
  //     .then(() => {
  //       loading.value = false;
  //       message.success('注册成功');
  //     })
  //     .catch((e) => {
  //       loading.value = false;
  //       message.error(e.message);
  //     });
  // };

  const onLoginType = (text) => {
    loginType.value = text;
  };

  const onScan = () => {
    if (loginType.value == 'scan') {
      loginType.value = 'sms';
    } else {
      loginType.value = 'scan';
    }
  };

  /* 二维码登录成功处理 */
  const onQrLoginSuccess = async (item: QrCodeStatusResponse) => {
    // 设置token到localStorage或其他存储
    localStorage.setItem('access_token', item.accessToken || '');
    message.success('扫码登录成功');
    if (item) {
      localStorage.setItem('access_token', `${item.accessToken}`);
      localStorage.setItem('TenantId', `${item.tenantId}`);
      cleanPageTabs();
      goHome();
    }
  };

  /* 二维码登录错误处理 */
  const onQrLoginError = (error: string) => {
    message.error(error || '扫码登录失败');
  };

  // const goBack = () => {
  //   openUrl(getDomain());
  //   return;
  // };

  const loginConnect = () => {
    // getWxWorkQrConnect().then((result) => {
    //   console.log(result);
    //   qrConnect.value = result;
    // });
  };

  /* 获取图形验证码 */
  const changeCaptcha = () => {
    // configWebsiteField({ lang: locale.value }).then((data) => {
    //   config.value = data;
    // });
    // 这里演示的验证码是后端返回base64格式的形式, 如果后端地址直接是图片请参考忘记密码页面
    getCaptcha()
      .then((data) => {
        captcha.value = data.base64;
        // 实际项目后端一般会返回验证码的key而不是直接返回验证码的内容, 登录用key去验证, 你可以根据自己后端接口修改
        text.value = data.text;
        // 自动回填验证码, 实际项目去掉这个
        // form.code = data.text;
        // resetFields();
      })
      .catch((e) => {
        message.error(e.message);
      });
  };

  // 首次加载
  // loadWebsiteConfig();
  changeCaptcha();
  loginConnect();

  watch(
    router.currentRoute,
    (data) => {
      if (data.query?.loginPhone) {
        form.phone = `${data.query?.loginPhone}`;
      } else {
        localStorage.clear();
      }
    },
    { immediate: true }
  );
</script>

<style lang="less" scoped>
  /* 背景 */
  .login-wrapper {
    padding: 48px 16px 0 16px;
    position: relative;
    box-sizing: border-box;
    background-image: url('@/assets/bg-2.jpeg');
    background-color: var(--grey-5);
    background-repeat: no-repeat;
    background-size: cover;
    min-height: 100vh;

    &:before {
      content: '';
      position: absolute;
      top: 0;
      left: 0;
      right: 0;
      bottom: 0;
      background: rgba(0, 0, 0, 0.2);
    }
  }

  .company-name {
    position: absolute;
    top: 17%;
    left: 50%;
    transform: translateX(-50%);
    font-size: 24px;
    color: #ffffff;
  }

  /* 卡片 */
  .login-form {
    width: 380px;
    margin: 0 auto;
    max-width: 100%;
    padding: 0 28px;
    box-sizing: border-box;
    box-shadow: 0 3px 6px rgba(0, 0, 0, 0.15);
    border-radius: 2px;
    position: relative;
    z-index: 2;

    h4 {
      padding: 22px 0;
      text-align: center;
    }

    .title-btn {
      cursor: pointer;
    }

    .login-title {
      display: flex;
      justify-content: space-around;
      line-height: 50px;

      .active {
        color: #007dff;
      }
    }
  }

  .login-form-right .login-form {
    margin: 0 15% 0 auto;
  }

  .login-form-left .login-form {
    margin: 0 auto 0 15%;
  }

  /* 验证码 */
  .login-input-group {
    display: flex;
    align-items: center;
    background-repeat: no-repeat;

    :deep(.ant-input-affix-wrapper) {
      flex: 1;
    }

    .login-captcha {
      width: 102px;
      height: 40px;
      margin-left: 10px;
      padding: 0;

      & > img {
        width: 100%;
        height: 100%;
      }
    }
  }

  /* 第三方登录图标 */
  .login-oauth-icon {
    color: #fff;
    padding: 5px;
    margin: 0 12px;
    font-size: 18px;
    border-radius: 50%;
    cursor: pointer;
  }

  .work-icon {
    width: 50px;
    height: 50px;
  }

  /* 底部版权 */
  .login-copyright {
    color: #eee;
    text-align: center;
    padding: 48px 0 22px 0;
    position: relative;
    z-index: 1;
  }

  /* 响应式 */
  @media screen and (min-height: 640px) {
    .login-wrapper {
      padding-top: 0;
    }

    .login-form {
      position: absolute;
      top: 50%;
      left: 50%;
      transform: translateX(-50%);
      margin-top: -230px;
    }

    .login-form-right .login-form,
    .login-form-left .login-form {
      left: auto;
      right: 15%;
      transform: translateX(0);
      margin: -230px auto auto auto;
    }

    .login-form-left .login-form {
      right: auto;
      left: 15%;
    }

    .login-copyright {
      position: absolute;
      left: 0;
      right: 0;
      bottom: 0;
    }
  }

  @media screen and (max-width: 768px) {
    .login-form-right .login-form,
    .login-form-left .login-form {
      left: 50%;
      right: auto;
      margin-left: 0;
      margin-right: auto;
      transform: translateX(-50%);
    }
  }

  .wwLogin_qrcode_head {
    padding: 10px 0 40px 0 !important;
  }

  .logo-login {
    position: absolute;
    top: 20px;
    left: 20px;
    display: flex;
    align-items: center;
    cursor: pointer;

    img {
      width: 28px;
      height: 28px;
      border-radius: 4px;
    }

    h4 {
      margin-left: 6px;
      color: #ffffff;
      font-size: 20px;
    }
  }
</style>
