<!-- @format -->

<template>
  <div class="main">
    <div class="left">
      <div class="ns-table-title">部门管理</div>
      <a-row>
        <a-col :span="12" class="tree">
          <ns-button :disabled="disabled" style="margin: 10px" type="primary" @click="addApartment"
            >新增部门</ns-button
          >
          <ns-button :disabled="disabled" type="primary" @click="addApartmentSon"
            >新增子部门</ns-button
          >
          <ns-button
            :disabled="disabled"
            style="margin: 10px"
            type="primary"
            @click="deleteApartment"
            >删除</ns-button
          >
          <a-tree
            v-if="apartmentTreeData?.length"
            :tree-data="apartmentTreeData"
            defaultExpandAll
            @select="SelectApartmentTree">
            <template #title="data">
              {{ data.deptInfo?.deptName }}
            </template>
          </a-tree>
        </a-col>
        <a-col :span="12" class="list">
          <a-tabs v-model:activeKey="activeKey">
            <a-tab-pane key="1" tab="部门信息">
              <ns-form
                ref="formRef"
                :schemas="formSchema"
                :model="formData"
                formLayout="vertical"
                class="form" />
            </a-tab-pane>
            <a-tab-pane key="2" tab="部门权限">
              <a-tree
                :tree-data="apartmentAdminTreeData"
                v-model:checkedKeys="ApartcheckedKeys"
                checkable
                defaultExpandAll
                @select="ApartmentSelect">
                <template #title="{ title }">
                  {{ title }}
                </template>
              </a-tree>
            </a-tab-pane>
          </a-tabs>
          <ns-button style="margin: 20px" type="primary" @click="CancelApartment">取消</ns-button>
          <ns-button type="primary" @click="ApartmentSure">确定</ns-button>
        </a-col>
      </a-row>
    </div>
    <div class="right">
      <div class="ns-table-title">角色管理</div>
      <a-row>
        <a-col :span="12" class="tree">
          <ns-button :disabled="disabled2" style="margin: 10px" type="primary" @click="addUser"
            >新增角色</ns-button
          >
          <ns-button :disabled="disabled2" type="primary" @click="addUserSon">新增子角色</ns-button>
          <ns-button :disabled="disabled2" style="margin: 10px" type="primary" @click="deleteUser"
            >删除</ns-button
          >
          <a-tree
            v-if="userTreeData.length"
            :tree-data="userTreeData"
            defaultExpandAll
            @select="SelectUserTree">
            <template #title="data">
              {{ data.zhName }}
            </template>
          </a-tree>
        </a-col>
        <a-col :span="12" class="list">
          <a-tabs v-model:activeKey="activeKey2">
            <a-tab-pane key="1" tab="角色信息">
              <ns-form
                :schemas="formSchema2"
                :model="formData2"
                formLayout="vertical"
                class="form" />
            </a-tab-pane>
            <a-tab-pane key="2" tab="角色权限">
              <a-tree
                :tree-data="userAdminTreeData"
                v-model:checkedKeys="UsercheckedKeys"
                defaultExpandAll
                checkable
                @select="UserSelect">
                <template #title="{ title }">
                  {{ title }}
                </template>
              </a-tree>
            </a-tab-pane>
          </a-tabs>
          <ns-button style="margin: 20px" type="primary" @click="CancelUser">取消</ns-button>
          <ns-button type="primary" @click="UserSure"> 确定</ns-button>
        </a-col>
      </a-row>
    </div>
  </div>
</template>
<script lang="ts">
  import { createVNode, defineComponent, reactive, ref, watch, watchEffect } from 'vue';
  import { Modal } from 'ant-design-vue';
  import { ExclamationCircleOutlined } from '@ant-design/icons-vue';
  import { http } from '/nerv-lib/util/http';
  import { cloneDeep } from 'lodash-es';
  import { formConfig, formConfig2 } from './config';
  import { department } from '/@/api/origanizemanage';
  import { permission } from '/@/api/origanizemanage';
  import { NsMessage } from '/nerv-lib/component';

  export default defineComponent({
    name: 'AuthorityManageIndex',
    setup() {
      const formRef = ref();
      let formData = ref({});
      let formData2 = ref({});
      const activeKey = ref('1');
      const activeKey2 = ref('1');
      const disabled = ref(true);
      const disabled2 = ref(true);
      const ApartcheckedKeys = ref<string[]>([]);
      const UsercheckedKeys = ref<string[]>([]);
      const selectKey = ref();
      const selectRef = ref();
      const selectKey2 = ref();
      const selectRef2 = ref();
      const formSchema = formConfig(disabled as any);
      const formSchema2 = formConfig2(disabled2 as any);
      const orgId = JSON.parse(sessionStorage.getItem('userInfo')).orgId;
      const projectId = JSON.parse(sessionStorage.getItem('userInfo')).projectId;
      const userAdminTreeData = ref([]);
      const apartmentTreeData = ref([]);

      const userTreeData = ref([]);
      const getPermissionTree = (params) => {
        return http.post(permission.permissionTree, params);
      };
      getPermissionTree({ projectId });

      const apartmentAdminTreeData = [
        {
          title: '首页',
          key: '0-0',
          children: [
            {
              title: '控制台',
              key: '0-0-0',
              children: [
                { title: 'leaf', key: '0-0-0-0' },
                { title: 'leaf', key: '0-0-0-1' },
              ],
            },
            {
              title: '用户管理',
              key: '0-0-1',
              children: [{ key: '0-0-1-0', title: 'sss' }],
            },
          ],
        },
      ];
      watch(ApartcheckedKeys, () => {
        console.log('checkedKeys', ApartcheckedKeys.value);
      });
      watch(UsercheckedKeys, () => {
        console.log('checkedKeys', UsercheckedKeys.value);
      });

      // 部门树
      const getDepartList = (params) => {
        return http.post(department.dartList, params);
      };
      getDepartList({ orgId }).then((res) => {
        apartmentTreeData.value = res.data;
      });

      const getTree = () => {
        getDepartList({ orgId }).then((res) => {
          apartmentTreeData.value = res.data;
          NsMessage.success('操作成功');
        });
      };

      const getUserTree = (params = { deptId: selectRef.value.deptInfo.deptId }) => {
        http.post(department.queryRoleTree, params).then((res) => {
          userTreeData.value = res.data;
        });
      };
      // 根据依赖刷新角色树
      watchEffect(() => {
        if (selectRef.value) getUserTree();
      });

      const opMap: any = {
        type: 'add',
        fuc: () => {},
        record: {},
        callback: null,
      };

      function fetch(api, params) {
        return http.post(api, params);
      }

      const addApartment = () => {
        disabled.value = false;
        opMap.type = 'addDept';
        formData.value = {};
        opMap.fuc = (params) => {
          return http.post(department.deptSave, {
            ...params,
            orgId,
            projectId,
          });
        };
        return;
      };

      const addApartmentSon = () => {
        disabled.value = false;
        opMap.type = 'addson';
        formData.value = {};
        opMap.fuc = (params) => {
          return http.post(department.deptSave, {
            ...params,
            orgId,
            projectId,
            pdeptId: selectRef.value.deptInfo.deptId,
          });
        };
      };

      const addUser = () => {
        disabled2.value = false;
        opMap.type = 'addUser';
        formData2.value = {};
        opMap.fuc = (params) => {
          delete params.roleId;
          return http.post(department.addRole, {
            ...params,
            orgId,
            projectId,
            deptId: selectRef.value.deptInfo.deptId,
          });
        };
      };

      const addUserSon = () => {
        disabled.value = false;
        opMap.type = 'addUserSon';
        formData2.value = {};
        opMap.fuc = (params) => {
          delete params.roleId;
          return http.post(department.addRole, {
            ...params,
            orgId,
            projectId,
            proleId: selectRef2.value.roleId,
            deptId: selectRef.value.deptInfo.deptId,
          });
        };
      };
      const deleteApartment = () => {
        // 删除逻辑
        // opMap.type = 'deptDelete';
        // opMap.fuc = (params) => {
        //   return http.post(department.deptDel, params).then(() => {
        //     NsMessage.success('删除成功');
        //   });
        // };
        Modal.confirm({
          title: '是否确认删除',
          icon: createVNode(ExclamationCircleOutlined),
          content: createVNode('div', { style: 'color:red;' }, ''),
          onOk() {
            http.post(department.deptDel, { deptId: selectRef.value.deptInfo.deptId }).then(() => {
              getTree();
              clearData();
            });
          },
          onCancel() {
            console.log('Cancel');
          },
        });
      };

      const deleteUser = () => {
        Modal.confirm({
          title: '是否确认删除',
          icon: createVNode(ExclamationCircleOutlined),
          content: createVNode('div', { style: 'color:red;' }, ''),
          onOk() {
            http.post(department.delRole, { roleId: selectRef2.value.roleId }).then(() => {
              getUserTree({ deptId: selectRef.value.deptInfo.deptId });
            });
          },

          class: 'test',
        });
      };
      const clearData = () => {
        selectRef.value = {};
        formData.value = {};
        opMap.type = '';
        opMap.fuc = '';
        selectKey.value = '';
      };
      // 部门选择
      const SelectApartmentTree = (selectedKeys: any, info: any) => {
        const { selected } = info;
        disabled.value = !selected;
        console.log(info, 'info');
        selectKey.value = selectedKeys[0];
        selectRef.value = info.node.dataRef;
        formData.value = cloneDeep(info.node.dataRef.deptInfo);
        opMap.type = 'editDpet';
        opMap.fuc = (params) => {
          return http.post(department.deptEdit, params);
        };

        // getUserTree({ deptId: selectRef.value.deptInfo.deptId });
      };

      // 角色选择
      const SelectUserTree = (selectedKeys: any, info: any) => {
        const { selected } = info;
        disabled2.value = !selected;
        console.log(selectedKeys, 'selectedKeys');
        console.log(info, 'info');
        selectKey2.value = selectedKeys[0];
        selectRef2.value = info.node.dataRef;
        formData2.value = cloneDeep(info.node.dataRef);
        opMap.type = 'editRole';
        opMap.fuc = (params) => {
          return http.post(department.editRole, params);
        };
      };

      const CancelApartment = () => {
        disabled.value = true;
      };

      const CancelUser = () => {
        disabled2.value = true;
      };

      const ApartmentSelect = (selectedKeys: any, info: any) => {
        console.log(selectedKeys, 'selectedKeys');
        console.log(info, 'info');
      };

      const UserSelect = (selectedKeys: any, info: any) => {
        console.log(selectedKeys, 'selectedKeys');
        console.log(info, 'info');
      };

      const ApartmentSure = () => {
        // formRef.value?.triggerSubmit().then(() => {});

        // disabled.value = !disabled.value;
        // console.log(formData.value.name, 'formData');
        console.log(opMap.type, 'ApartmentSure');
        const opArr = ['addDept', 'editDpet'];
        if (opArr.includes(opMap.type)) {
          console.log(formRef.value, formData);
          opMap.fuc &&
            opMap.fuc(formData.value).then(() => {
              getTree();
            });
        } else if (selectRef.value && opMap.type === 'addson')
          opMap.fuc && opMap.fuc(formData.value);
        else if (opMap.type === 'deptDelete') {
          opMap.fuc && opMap.fuc({ ...formData.value, selectRef: selectRef.value });
        }
      };
      const UserSure = () => {
        disabled2.value = !disabled2.value;
        console.log(formData2.value, 'formData2');
        console.log(opMap.type, 'opMap.type');
        const typeArr = ['addUserSon', 'addUser', 'editRole'];
        if (typeArr.includes(opMap.type)) {
          opMap.fuc &&
            opMap.fuc(formData2.value).then(() => {
              getUserTree();
            });
        } else if (selectRef2.value && opMap.type === 'addson')
          selectRef2.value['children'] = [
            {
              key: '123',
              title: formData2.value.departname,
              info: { ...cloneDeep(formData2.value) },
            },
          ];
        else {
          console.log('ss');
        }
        formData2.value = {};
      };

      return {
        disabled,
        disabled2,
        formSchema,
        formSchema2,
        formData,
        formData2,
        apartmentTreeData,
        userTreeData,
        SelectApartmentTree,
        SelectUserTree,
        activeKey,
        activeKey2,
        ApartmentSure,
        UserSure,
        addApartment,
        addApartmentSon,
        deleteApartment,
        deleteUser,
        addUser,
        addUserSon,
        CancelApartment,
        CancelUser,
        apartmentAdminTreeData,
        ApartmentSelect,
        ApartcheckedKeys,
        userAdminTreeData,
        UsercheckedKeys,
        UserSelect,
        formRef,
      };
    },
  });
</script>
<style scoped>
  .main {
    display: flex;
    flex: 1;
  }

  .left {
    width: 50%;
    height: calc(100vh-50px);
    border-right: 5px solid rgb(229, 235, 240);
  }

  .tree {
    width: 400px;
    height: 89vh;
    border-right: 2px solid rgb(229, 235, 240);
  }

  .right {
    width: 50%;
  }

  .top {
    height: 50vh;
    border-bottom: 5px solid rgb(229, 235, 240);
  }

  .ns-table-title {
    text-align: left;
    height: 46px;
    line-height: 46px;
    font-size: 18px;
    font-weight: bold;
    user-select: text;
    padding-left: 16px;
    width: 100%;
    border-bottom: 2px solid rgb(229, 235, 240);
  }

  .table {
    width: 2000px;
  }

  .admin {
    text-align: left;
    height: 42px;
    line-height: 42px;
    font-size: 16px;
    font-weight: bold;
    user-select: text;
    padding-left: 16px;
    width: calc(100% + 32px);
  }

  .form {
    margin: 20px;
  }
</style>
