<!-- @format -->

<template>
  <div>
    <ns-view-add-form
      :schemas="formSchema"
      :model="data"
      :title="uuid ? '编辑角色' : '添加角色'"
      :api="uuid ? '/api/community/objs/Role/update' : '/api/community/objs/Role'" />
  </div>
</template>
<script lang="ts">
  import { defineComponent, reactive, ref, provide, watch } from 'vue';
  import { useRouter } from 'vue-router';
  import { http } from '/nerv-lib/util/http';
  import RoleAuthority from './component/roleAuthority.vue';
  export default defineComponent({
    name: 'NsViewRoleTypeAddOrEdit',
    components: {
      RoleAuthority,
    },
    setup() {
      provide('components', () => {
        return { RoleAuthority };
      });
      const router = useRouter();
      const uuid = router.currentRoute.value.query['roleUuid'];
      let data = ref({});
      let show = ref(false);
      let originalForm = ref([
        {
          field: 'roleUuid',
          show: false,
          component: 'NsInput',
        },
        {
          field: 'fields',
          label: '',
          displayFormItem: false,
          class: 'ns-form-item-full',
          component: 'NsChildForm',
          componentProps: {
            title: '基本信息',
            schemas: [
              {
                field: 'roleName',
                label: '角色名称',
                component: 'NsInput',
                componentProps: {
                  placeholder: '请输入',
                  // disabled: uuid && true,
                },
                rules: [
                  // {
                  //   required: true,
                  //   message: '不得为空',
                  //   trigger: 'blur',
                  // },
                  {
                    required: true,
                    validator: async (rule, value) => {
                      if (!value) {
                        return Promise.reject('角色名称不能为空');
                      }
                      const unicRegexp = new RegExp('[\u4e00-\u9fa5]', 'g');
                      let unicValue = value;
                      unicValue = value.replace(unicRegexp, 'aa');
                      if (!/^[a-zA-Z\d\u4e00-\u9fa5]{1,36}$/.test(unicValue)) {
                        return Promise.reject(
                          '不支持特殊字符、空格，长度不得超过36个字符，中文占2位位',
                        );
                      }
                    },
                    trigger: 'change',
                  },
                ],
              },
              {
                field: 'describe',
                label: '角色描述',
                component: 'NsInput',
                componentProps: {
                  placeholder: '请输入',
                  // disabled: uuid && true,
                },
                rules: [
                  // {
                  //   required: true,
                  //   message: '不得为空',
                  //   trigger: 'blur',
                  // },
                  {
                    validator: async (rule, value) => {
                      if (!value) {
                        return;
                      }
                      const unicRegexp = new RegExp('[\u4e00-\u9fa5]', 'g');
                      let unicValue = value;
                      unicValue = value.replace(unicRegexp, 'aa');
                      if (!/^[a-zA-Z\d\u4e00-\u9fa5]{1,32}$/.test(unicValue)) {
                        return Promise.reject(
                          '不支持特殊字符、空格，长度不得超过32个字符，中文占2位',
                        );
                      }
                    },
                    trigger: 'change',
                  },
                ],
              },
            ],
          },
        },
        {
          field: 'fields',
          label: '',
          displayFormItem: false,
          class: 'ns-form-item-full',
          component: 'NsChildForm',
          componentProps: {
            title: '角色权限设置(必填)',
            schemas: [
              {
                field: 'resourceCodeMap',
                label: '',
                class: 'ns-form-item-full ns-form-item-padding',
                component: 'RoleAuthority',
                componentProps: {
                  placeholder: '请输入',
                  field: 'resourceCodeMap',
                  dataSource: data.value,
                  // disabled: uuid && true,
                },
                rules: [
                  {
                    required: true,
                    validator: async (rule, value) => {
                      if (!value) {
                        return Promise.reject('权限不能为空！');
                      } else {
                        let arr = Object.values(value);
                        let temp = false;
                        arr.forEach((ele) => {
                          if (ele.length > 0) {
                            temp = true;
                          }
                        });
                        if (!temp) {
                          return Promise.reject('权限不能为空！');
                        }
                      }
                    },
                    trigger: 'change',
                  },
                ],
              },
            ],
          },
        },
      ]);

      function load(): void {
        if (!uuid) {
          return;
        }
        const requestArr = [];
        // 角色基本信息
        const request1 = http.get('/api/community/objs/Role/detail', { roleUuid: uuid }).then(); // 角色权限
        const request2 = http
          .get('/api/community/objs/Role/ResourcesMap', { roleUuid: uuid })
          .then();
        const request3 = http.get('/api/community/objs/AppResourcesAllList').then(); // 获取当前应用所有权限资源
        requestArr.push(request1);
        requestArr.push(request2);
        requestArr.push(request3);
        Promise.all(requestArr)
          .then((res) => {
            if (res && res.length === 3) {
              const roleInfo = res[0] && res[0]['data'] ? res[0]['data'] : '';
              const roleAuth = res[1] && res[1]['data']['data'] ? res[1]['data']['data'] : '';
              const allResources = res[2] && res[2]['data'] ? res[2]['data'] : [];
              // 赋予角色基本信息
              if (roleInfo) {
                // 角色基本信息
                data.value['roleName'] = roleInfo['roleName'];
                data.value['describe'] = roleInfo['describe'];
                data.value['roleUuid'] = roleInfo['roleUuid'];
              }
              // 全局应用权限资源信息,数据权限处理, 过滤form中的全局数据权限项
              handleDataAuth(allResources, originalForm.value);
              show.value = true;

              // 本角色权限资源信息
              if (roleAuth) {
                if (typeof roleAuth == 'string') {
                  try {
                    JSON.parse(roleAuth);
                  } catch (e) {
                    console.log(e);
                  }
                  data.value['resourceCodeMap'] = JSON.parse(roleAuth);
                } else if (roleAuth instanceof Array) {
                  data.value['resourceCodeMap'] = roleAuth;
                }
              }
            }
          })
          .catch((error) => {
            show.value = true;
            // this.messageService.error('错误', '获得模块信息失败, 错误原因: ' + error, error);
          });
      }
      async function loadResource() {
        /**
         * 获得module.json中的配置数据
         */
        await http.get('/api/community/objs/AppResourcesAllList').then((res) => {
          if (res.data) {
            handleDataAuth(res.data, originalForm.value);
            show.value = true;
          } else {
            show.value = true;
          }
        });
      }
      if (uuid) {
        load();
      } else {
        loadResource();
      }
      //     handleDataAuth([
      //   {
      //     "appLabel": "养老应用a",
      //     "appId": "11100as",
      //     "menus": [
      //       {
      //         "extend": "扩展信息",
      //         "code": "index",
      //         "parentCode": "",
      //         "icon": "",
      //         "name": "index",
      //         "label": "首页",
      //         "sort": 0,
      //         "type": "other"
      //       },
      //       {
      //         "code": "business-center",
      //         "parentCode": "",
      //         "icon": "",
      //         "name": "business-center",
      //         "label": "业务中心",
      //         "menus": [
      //           {
      //             "code": "advice-service",
      //             "parentCode": "business-center",
      //             "icon": "",
      //             "name": "advice-service",
      //             "label": "咨询入住",
      //             "menus": [
      //               {
      //                 "code": "advice-register",
      //                 "parentCode": "advice-service",
      //                 "name": "advice-register",
      //                 "label": "咨询登记",
      //                 "menus": [
      //                   {
      //                     "code": "advice-register/add",
      //                     "parentCode": "advice-register",
      //                     "name": "add",
      //                     "label": "新增",
      //                     "sort": 0,
      //                     "type": "op"
      //                   },
      //                   {
      //                     "code": "advice-register/remove",
      //                     "parentCode": "advice-register",
      //                     "name": "remove",
      //                     "label": "删除",
      //                     "sort": 0,
      //                     "type": "op"
      //                   },
      //                   {
      //                     "code": "advice-register/edit",
      //                     "parentCode": "advice-register",
      //                     "name": "edit",
      //                     "label": "编辑",
      //                     "sort": 0,
      //                     "type": "op"
      //                   },
      //                   {
      //                     "code": "advice-register/export",
      //                     "parentCode": "advice-register",
      //                     "name": "export",
      //                     "label": "导出",
      //                     "sort": 0,
      //                     "type": "op"
      //                   },
      //                   {
      //                     "code": "advice-register/checkIn",
      //                     "parentCode": "advice-register",
      //                     "name": "checkIn",
      //                     "label": "入住",
      //                     "sort": 0,
      //                     "type": "op"
      //                   }
      //                 ],
      //                 "sort": 0,
      //                 "type": "menus"
      //               },
      //               {
      //                 "code": "order-register",
      //                 "parentCode": "advice-service",
      //                 "name": "order-register",
      //                 "label": "预约登记",
      //                 "menus": [
      //                   {
      //                     "code": "order-register/detail",
      //                     "parentCode": "order-register",
      //                     "name": "detail",
      //                     "label": "详情",
      //                     "sort": 0,
      //                     "type": "op"
      //                   },
      //                   {
      //                     "code": "order-register/add",
      //                     "parentCode": "order-register",
      //                     "name": "add",
      //                     "label": "新增",
      //                     "sort": 0,
      //                     "type": "op"
      //                   },
      //                   {
      //                     "code": "order-register/remove",
      //                     "parentCode": "order-register",
      //                     "name": "remove",
      //                     "label": "删除",
      //                     "sort": 0,
      //                     "type": "op"
      //                   },
      //                   {
      //                     "code": "order-register/edit",
      //                     "parentCode": "order-register",
      //                     "name": "edit",
      //                     "label": "编辑",
      //                     "sort": 0,
      //                     "type": "op"
      //                   },
      //                   {
      //                     "code": "order-register/export",
      //                     "parentCode": "order-register",
      //                     "name": "export",
      //                     "label": "导出",
      //                     "sort": 0,
      //                     "type": "op"
      //                   },
      //                   {
      //                     "code": "order-register/cancel",
      //                     "parentCode": "order-register",
      //                     "name": "cancel",
      //                     "label": "取消",
      //                     "sort": 0,
      //                     "type": "op"
      //                   },
      //                   {
      //                     "code": "order-register/checkIn",
      //                     "parentCode": "order-register",
      //                     "name": "unsubscribe",
      //                     "label": "入住",
      //                     "sort": 0,
      //                     "type": "op"
      //                   }
      //                 ],
      //                 "sort": 0,
      //                 "type": "menus"
      //               },
      //               {
      //                 "code": "check-in",
      //                 "parentCode": "advice-service",
      //                 "name": "check-in",
      //                 "label": "入住登记",
      //                 "menus": [
      //                   {
      //                     "code": "check-in/add",
      //                     "parentCode": "check-in",
      //                     "name": "add",
      //                     "label": "新增",
      //                     "sort": 0,
      //                     "type": "op"
      //                   },
      //                   {
      //                     "code": "check-in/remove",
      //                     "parentCode": "check-in",
      //                     "name": "remove",
      //                     "label": "删除",
      //                     "sort": 0,
      //                     "type": "op"
      //                   },
      //                   {
      //                     "code": "check-in/edit",
      //                     "parentCode": "check-in",
      //                     "name": "edit",
      //                     "label": "编辑",
      //                     "sort": 0,
      //                     "type": "op"
      //                   },
      //                   {
      //                     "code": "check-in/export",
      //                     "parentCode": "check-in",
      //                     "name": "export",
      //                     "label": "导出数据",
      //                     "sort": 0,
      //                     "type": "op"
      //                   },
      //                   {
      //                     "code": "check-in/import",
      //                     "parentCode": "check-in",
      //                     "name": "import",
      //                     "label": "批量导入",
      //                     "sort": 0,
      //                     "type": "op"
      //                   }
      //                 ],
      //                 "sort": 0,
      //                 "type": "menus"
      //               },
      //               {
      //                 "code": "bed-search",
      //                 "parentCode": "advice-service",
      //                 "name": "bed-search",
      //                 "label": "床位查询",
      //                 "sort": 0,
      //                 "type": "menus"
      //               },
      //               {
      //                 "code": "charging-standard",
      //                 "parentCode": "advice-service",
      //                 "name": "charging-standard",
      //                 "label": "收费标准",
      //                 "sort": 0,
      //                 "type": "menus"
      //               }
      //             ],
      //             "sort": 0,
      //             "type": "menus"
      //           }
      //         ],
      //         "sort": 0,
      //         "type": "menus"
      //       }
      //     ],
      //     "dataScope": {
      //       "dataTips": "",
      //       "scopeType": "",
      //       "dataConfig": {},
      //       "scopeMode": 0
      //     },
      //     "version": "1.4.4.201"
      //   },
      //   {
      //     "appLabel": "养老应用app",
      //     "appId": "11100as2",
      //     "menus": [
      //       {
      //         "code": "homepage",
      //         "parentCode": "",
      //         "icon": "",
      //         "name": "homepage",
      //         "label": "主页",
      //         "menus": [
      //           {
      //             "code": "gaffer-information",
      //             "parentCode": "homepage",
      //             "name": "gaffer-information",
      //             "label": "老人信息",
      //             "menus": [
      //               {
      //                 "code": "gaffer-list",
      //                 "parentCode": "gaffer-information",
      //                 "name": "gaffer-list",
      //                 "label": "老人列表",
      //                 "sort": 0,
      //                 "type": "menus"
      //               },
      //               {
      //                 "code": "basic-information",
      //                 "parentCode": "gaffer-information",
      //                 "name": "basic-information",
      //                 "label": "基本信息",
      //                 "sort": 0,
      //                 "type": "menus"
      //               }
      //             ],
      //             "sort": 0,
      //             "type": "menus"
      //           },
      //           {
      //             "code": "service-transact",
      //             "parentCode": "homepage",
      //             "name": "service-transact",
      //             "label": "服务办理",
      //             "menus": [
      //               {
      //                 "code": "bed-record",
      //                 "parentCode": "service-transact",
      //                 "name": "bed-record",
      //                 "label": "换床记录",
      //                 "menus": [
      //                   {
      //                     "code": "bed-record/detail",
      //                     "parentCode": "bed-record",
      //                     "name": "detail",
      //                     "label": "查看",
      //                     "sort": 0,
      //                     "type": "op"
      //                   },
      //                   {
      //                     "code": "bed-record/add",
      //                     "parentCode": "bed-record",
      //                     "name": "add",
      //                     "label": "新增",
      //                     "sort": 0,
      //                     "type": "op"
      //                   },
      //                   {
      //                     "code": "bed-record/edit",
      //                     "parentCode": "bed-record",
      //                     "name": "edit",
      //                     "label": "编辑",
      //                     "sort": 0,
      //                     "type": "op"
      //                   },
      //                   {
      //                     "code": "bed-record/cancel",
      //                     "parentCode": "bed-record",
      //                     "name": "cancel",
      //                     "label": "取消",
      //                     "sort": 0,
      //                     "type": "op"
      //                   }
      //                 ],
      //                 "sort": 0,
      //                 "type": "menus"
      //               },
      //               {
      //                 "code": "nursing-level-change",
      //                 "parentCode": "service-transact",
      //                 "name": "nursing-level-change",
      //                 "label": "护理等级更换",
      //                 "menus": [
      //                   {
      //                     "code": "nursing-level-change/detail",
      //                     "parentCode": "nursing-level-change",
      //                     "name": "detail",
      //                     "label": "查看",
      //                     "sort": 0,
      //                     "type": "op"
      //                   },
      //                   {
      //                     "code": "nursing-level-change/add",
      //                     "parentCode": "nursing-level-change",
      //                     "name": "add",
      //                     "label": "新增",
      //                     "sort": 0,
      //                     "type": "op"
      //                   },
      //                   {
      //                     "code": "nursing-level-change/edit",
      //                     "parentCode": "nursing-level-change",
      //                     "name": "edit",
      //                     "label": "编辑",
      //                     "sort": 0,
      //                     "type": "op"
      //                   },
      //                   {
      //                     "code": "nursing-level-change/cancel",
      //                     "parentCode": "nursing-level-change",
      //                     "name": "cancel",
      //                     "label": "取消",
      //                     "sort": 0,
      //                     "type": "op"
      //                   }
      //                 ],
      //                 "sort": 0,
      //                 "type": "menus"
      //               },
      //               {
      //                 "code": "nursing-group-change",
      //                 "parentCode": "service-transact",
      //                 "name": "nursing-group-change",
      //                 "label": "护理组更换",
      //                 "menus": [
      //                   {
      //                     "code": "nursing-group-change/detail",
      //                     "parentCode": "nursing-group-change",
      //                     "name": "detail",
      //                     "label": "查看",
      //                     "sort": 0,
      //                     "type": "op"
      //                   },
      //                   {
      //                     "code": "nursing-group-change/add",
      //                     "parentCode": "nursing-group-change",
      //                     "name": "add",
      //                     "label": "新增",
      //                     "sort": 0,
      //                     "type": "op"
      //                   },
      //                   {
      //                     "code": "nursing-group-change/edit",
      //                     "parentCode": "nursing-group-change",
      //                     "name": "edit",
      //                     "label": "编辑",
      //                     "sort": 0,
      //                     "type": "op"
      //                   },
      //                   {
      //                     "code": "nursing-group-change/cancel",
      //                     "parentCode": "nursing-group-change",
      //                     "name": "cancel",
      //                     "label": "取消",
      //                     "sort": 0,
      //                     "type": "op"
      //                   }
      //                 ],
      //                 "sort": 0,
      //                 "type": "menus"
      //               }
      //             ],
      //             "sort": 0,
      //             "type": "menus"
      //           }
      //         ],
      //         "sort": 0,
      //         "type": "menus"
      //       }
      //     ],
      //     "version": "1.4.4.7"
      //   }
      // ],originalForm.value)

      async function handleDataAuth(allResources, form) {
        // 1. 存储所有资源权限
        data.value['allResources'] = allResources;

        // 2. 确定数据权限模式
        /** 目前考虑场景：
         * dataScope['scopeMode']为 0:没有数据权限，1. 有全局数据权限 2. 各自有数据权限
         * 1. 全局数据权限：各应用都没有数据权限，即各资源无dataScope参数 或 dataScope下面参数 scopeMode ＝ 0
         * 2. 局部数据权限：各应用有各自数据权限， 即 dataScope下面参数 scopeMode ＝ 2
         * 3. todo 各个应用有的是全局数据权限，有的是独有的数据权限：暂未处理该场景*/
        if (allResources && allResources instanceof Array) {
          let modeArr = [];
          await allResources.forEach((resource) => {
            if (resource['dataScope']) {
              const dataScope = resource['dataScope'];
              if (Object.keys(dataScope).length > 0) {
                const scopeMode = dataScope['scopeMode'];
                modeArr.push(scopeMode);
                if (scopeMode == 1) {
                  data.value['commonDataScope'] = dataScope; // 存在全局数据权限，任取一个应用的数据权限定义
                }
              }
            }
          });
          if (modeArr.length == 0) {
            data.value['dataAuthMode'] = 0; // 无数据权限
          } else if (modeArr.length > 0) {
            let newArr = Array.from(new Set(modeArr));
            if (newArr.includes(1)) {
              // 可能有全局数据权限
              if (newArr.includes(2)) {
                // this.messageService.confirm('提示', '权限资源注册有误'); // 有的有全局数据权限，有的有自己的数据权限

                return;
              } else {
                data.value['dataAuthMode'] = 1; // 全局数据权限
              }
            } else {
              // 无数据权限或者有的含有自己的数据权限
              if (newArr.includes(2)) {
                // 可能有各自的数据权限
                data.value['dataAuthMode'] = 2; // 局部数据权限
              } else {
                data.value['dataAuthMode'] = 0; // 无数据权限
              }
            }
          }
        }

        // 3.根据数据模式参数确定全局数据权限是否显示
        // if (data.value['dataAuthMode'] != 1) {
        //   const tempForm = JSON.parse(JSON.stringify(form));
        //   if (tempForm) {
        //     tempForm = tempForm.filter(fd => {
        //       return fd['field'] != 'dataScope';
        //     });
        //     originalForm = tempForm;
        //   }
        // } else {
        //   originalForm = form;
        // }
      }
      // async function getData() {
      //   await http
      //     .get('/api/ihorn/objs/enterprise/detail', { uuid: uuid })
      //     .then((res) => {
      //       if(res.data){
      //         data.value= res.data
      //       }
      //     });
      // }
      // if(uuid){
      //   getData()
      // }
      let formSchema = ref([]);
      watch(
        () => show.value,
        () => {
          if (show.value) {
            formSchema.value = originalForm.value;
          }
        },
        {
          immediate: true,
        },
      );

      return {
        data,
        formSchema,
        uuid,
      };
    },
  });
</script>
