<!--弹窗绑定企业微信页面-->
<template>
  <BasicModal @register="registerModal" :width="800" :title="title" destroyOnClose>
    <a-spin :spinning="loading">
      <div class="we-bind">
        <a-row :span="24" class="we-title-background">
          <a-col :span="12" class="border-right">
            <span>组织用户</span>
          </a-col>
          <a-col :span="12" class="padding-left">
            <span>企业微信用户</span>
          </a-col>
        </a-row>
        <a-row :span="24">
          <template v-for="(item, index) in bindData.jwUserDepartVos">
            <a-col :span="12" class="border-right padding-left border-bottom">
              <div class="we-account">
                <a-avatar v-if="item.avatar" :src="getFileAccessHttpUrl(item.avatar)" :size="28"></a-avatar>
                <a-avatar v-else :size="28">
                  {{ item.realName.length > 2 ? item.realName.substr(0, 2) : item.realName }}
                </a-avatar>
                <a-input style="margin-left: 20px" :value="item.realName" readonly />
              </div>
            </a-col>
            <a-col :span="12" class="padding-left border-bottom">
              <div class="we-account">
                <span v-if="item.wechatUserId || izBind" class="we-remove"
                  >{{ item.wechatRealName }} <span style="margin-right: 20px" @click="handleRemoveClick(index, item)">移出</span></span
                >
                <a-select
                  v-else
                  v-model:value="item.wechatUserId"
                  :options="userList"
                  :fieldNames="{ label: 'wechatRealName', value: 'wechatUserId' }"
                  style="width: 200px"
                  showSearch
                  @select="(val, option) => handleSelect(val, option, index)"
                />
              </div>
            </a-col>
          </template>
        </a-row>
      </div>
    </a-spin>
    <template #footer>
      <a-button v-if="!izBind" type="primary" @click="handleSubmit">同步</a-button>
    </template>
  </BasicModal>
</template>

<script lang="ts">
  import { defineComponent, h, ref } from 'vue';
  import { BasicModal, useModalInner } from '/@/components/Modal';
  import { getThirdUserByWechat, wechatEnterpriseToLocal, getThirdUserBindByWechat, deleteThirdAccount } from './ThirdApp.api';
  import { getFileAccessHttpUrl } from '/@/utils/common/compUtils';
  import { useMessage } from '@/hooks/web/useMessage';
  import { Modal } from 'ant-design-vue';
  import { useUserStore } from '@/store/modules/user';

  export default defineComponent({
    name: 'ThirdAppBindWeEnterpriseModal',
    components: { BasicModal },
    setup(props, { emit }) {
      const title = ref<string>('企业微信绑定');
      //企业微信的绑定数据
      const bindData = ref<any>({});
      const loading = ref<boolean>(false);
      const btnLoading = ref<boolean>(false);
      const { createMessage } = useMessage();
      const userList = ref<any>([]);
      //同步文本信息展示
      const syncText = ref<string>('');
      //是否已绑定数据,展示不同的列表
      const izBind = ref<boolean>(false);
      const userStore = useUserStore();
      //表单赋值
      const [registerModal, { closeModal }] = useModalInner(async (data) => {
        loading.value = true;
        console.log('izBind::', izBind);
        if (!data.izBind) {
          await getUnboundData();
        } else {
          await getBoundData();
        }
        izBind.value = data.izBind;
      });

      /**
       * 未绑定的数据
       */
      async function getUnboundData() {
        await getThirdUserByWechat().then((res) => {
          if (res.success) {
            let userLists = res.result.userList;
            bindData.value = res.result;
            userList.value = res.result.userList;
            /*   if (userLists && userLists.length > 0) {
            syncText.value = "";
          } else {
            syncText.value = "企业微信用户均已同步";
          }*/
            loading.value = false;
          } else {
            createMessage.warning(res.message);
            loading.value = false;
          }
        });
      }

      /**
       * 已绑定的数据
       */
      async function getBoundData() {
        await getThirdUserBindByWechat().then((res) => {
          if (res.success) {
            bindData.value.jwUserDepartVos = res.result;
            loading.value = false;
          } else {
            createMessage.warn(res.message);
            loading.value = false;
          }
        });
      }

      /**
       * 第三方配置点击事件
       */
      async function handleSubmit() {
        btnLoading.value = true;
        let userList = bindData.value.userList;
        //重新封装数据,只留用户id和企业微信id即可,还需要把没绑定的用户传给后台
        let params: any = [];
        //查询用户绑定的企业微信用户
        for (const item of bindData.value.jwUserDepartVos) {
          if (item.wechatUserId) {
            userList = userList.filter((a) => a.wechatUserId != item.wechatUserId);
            params.push({
              wechatUserId: item.wechatUserId,
              wechatDepartId: item.wechatDepartId,
              wechatRealName: item.wechatRealName,
              userId: item.userId,
            });
          }
        }
        let text: string = '';
        //查询未被绑定的租户
        if (userList && userList.length > 0) {
          for (const item of userList) {
            params.push({ wechatUserId: item.wechatUserId, wechatDepartId: item.wechatDepartId, wechatRealName: item.wechatRealName });
          }
          text = '检测到未绑定的企业微信用户 ' + userList.length + ' 位,平台将会为这 ' + userList.length + ' 位用户创建新的账号';
        }

        Modal.confirm({
          title: '确认同步',
          content: text,
          okText: '确认',
          onOk: () => {
            let json = JSON.stringify(params);
            console.log('json::', json);
            wechatEnterpriseToLocal({ jwUserDepartJson: json })
              .then((res) => {
                let options = {};
                if (res.success) {
                  if (res.result) {
                    options = {
                      width: 600,
                      title: res.message,
                      content: () => {
                        let nodes;
                        let successInfo = [`成功信息如下:`, renderTextarea(h, res.result.successInfo.map((v, i) => `${i + 1}. ${v}`).join('\n'))];
                        if (res.success) {
                          nodes = [...successInfo, h('br'), `无失败信息!`];
                        } else {
                          nodes = [
                            `失败信息如下:`,
                            renderTextarea(h, res.result.failInfo.map((v, i) => `${i + 1}. ${v}`).join('\n')),
                            h('br'),
                            ...successInfo,
                          ];
                        }
                        return nodes;
                      },
                    };
                  }
                  closeModal();
                  emit('success', options, res);
                }
              })
              .finally(() => {
                btnLoading.value = false;
              });
          },
        });
      }

      /**
       * 下拉框选择事件
       */
      function handleSelect(val, option, index) {
        bindData.value.jwUserDepartVos[index].wechatUserId = option.wechatUserId;
        bindData.value.jwUserDepartVos[index].wechatRealName = option.wechatRealName;
        bindData.value.jwUserDepartVos[index].wechatDepartId = option.wechatDepartId;
        userList.value = userList.value.filter((item) => item.wechatUserId != option.wechatUserId);
      }

      /**
       * 移出事件
       * @param index
       * @param item
       */
      function handleRemoveClick(index, item) {
        if (!izBind.value) {
          userList.value.push({
            wechatUserId: item.wechatUserId,
            wechatRealName: item.wechatRealName,
            wechatDepartId: item.wechatDepartId,
          });
          bindData.value.jwUserDepartVos[index].wechatUserId = '';
          bindData.value.jwUserDepartVos[index].wechatRealName = '';
          bindData.value.jwUserDepartVos[index].wechatDepartId = '';
        } else {
          Modal.confirm({
            title: '确认取消绑定吗',
            okText: '确认',
            onOk: async () => {
              await deleteThirdAccount({ id: item.thirdId, sysUserId: userStore.getUserInfo.id }).then((res) => {
                if (res.success) {
                  createMessage.success('取消绑定成功!');
                  getBoundData();
                } else {
                  createMessage.warning(res.message);
                }
              });
            },
          });
        }
      }

      function renderTextarea(h, value) {
        return h(
          'div',
          {
            id: 'box',
            style: {
              minHeight: '100px',
              border: '1px solid #d9d9d9',
              fontSize: '14px',
              maxHeight: '250px',
              whiteSpace: 'pre',
              overflow: 'auto',
              padding: '10px',
            },
          },
          value
        );
      }

      return {
        title,
        registerModal,
        handleSubmit,
        bindData,
        getFileAccessHttpUrl,
        loading,
        userList,
        handleSelect,
        handleRemoveClick,
        btnLoading,
        izBind,
      };
    },
  });
</script>

<style lang="less" scoped>
  .we-bind {
    overflow-y: auto;
    border: 1px @border-color-base solid;
    border-bottom: none;
    .we-title-background {
      background: @component-background;
      height: 40px;
      line-height: 40px;
      padding: 0 10px;
    }
    .we-account {
      display: flex;
      height: 40px;
      line-height: 40px;
      align-items: center;
    }

    :deep(.ant-input) {
      border: none;
      padding: 0;
      box-shadow: none;
    }

    .we-remove {
      display: flex;
      justify-content: space-between;
      width: 100%;
      cursor: pointer;
    }
    .border-right {
      border-right: 1px @border-color-base solid;
    }
    .border-bottom {
      border-bottom: 1px @border-color-base solid;
    }
    .padding-left {
      padding-left: 10px;
    }
  }
</style>