<script setup lang="ts">
defineOptions({
  // name 作为一种规范最好必须写上并且和路由的name保持一致
  name: "rolePower"
});
import { ref, reactive } from "vue";
import { ElMessageBox, ElMessage } from "element-plus";
import { Search } from "@element-plus/icons-vue";
import addRole from "./components/addRole.vue";
import addPerson from "./components/addPerson.vue";
import { getDeleteUserApi } from "@/api/userSetting";
import {
  getMenuList,
  getMenuListCodeForRole,
  postAddMenuList
} from "@/api/menu";
import { postPageRole, postDelRole, postPageUserByRole } from "@/api/roles";
import pngcaret from "@/assets/icon-png/caret-right-small.svg";
import UserPageTable from "@/components/UserPageTable/index.vue";
const UserTable = ref();
// 新增角色
const addRoleRef = ref();
const addRoleShow = ref(false);
// 新增角色组人员
const addPersonRef = ref();
const addPersonShow = ref(false);
const tableData = ref([]);
interface Role {
  id?: number;
  roleName: string;
  records: Array<string>;
}
interface ApiResponse {
  code: number;
  data: {
    records: Role[];
    // 可能还有其他字段,比如 total, page, etc.
  };
}
const rolesList = reactive<any>({
  data: [],
  dataUser: [],
  rolesName: "",
  addPerson: {}
});
// 角色列表
let pageSize = reactive({
  pageNumber: 1,
  pageSize: 5
});
const load = () => {
  pageSize.pageSize += 5;
  postPageRoleApi();
};
const loadSystem = async () => {
  pageSize.pageSize += 5;
  postPageRoleApi();
};

// 系统角色
const postPageRoleApi = async () => {
  const { code, data }: ApiResponse = await postPageRole({
    ...pageSize,
    roleType: "system"
  });
  const res: ApiResponse = await postPageRole({
    ...pageSize,
    roleType: "user"
  });
  if (code === 200) {
    rolesList.data = [];
    data.records.map((item, index) => {
      rolesList.data.push({ ...item, id: index + 2 });
    });
  }
  if (res.code === 200) {
    rolesList.dataUser = [];
    res.data.records.map((item, index) => {
      rolesList.dataUser.push({ ...item, id: index + 3 });
    });
  }
};
// 自定义角色
postPageRoleApi();
// 查看角色组
const bgColor = ref(null);
const lookRoles = item => {
  console.log(item);
  paramsPageUser.roleName = item.roleName;
  paramsPageUser.roleCode = item.roleCode;
  bgColor.value = item.id;
  rolesList.rolesName = item.roleName;
  Object.assign(rolesList.addPerson, item);
  postPageUserByRoleApi();
  getMenuListCodeForRoleApi(item);
};
// 添加角色
const addRoles = () => {
  addRoleRef.value.open();
  addRoleShow.value = true;
};
// 编辑角色
const editRoleName = item => {
  addRoleRef.value.open(item);
  addRoleShow.value = true;
};
// 删除角色
const postDelRoleApi = async item => {
  console.log("item", item);
  const { code } = await postDelRole(item);
  if (code === 200) {
    ElMessage({
      message: "删除成功",
      type: "success"
    });
    postPageRoleApi();
  }
};
const deleteRole = item => {
  ElMessageBox.confirm(
    `角色删除后不能恢复,是否确认删除角色【${item.roleName}】吗?`,
    "确认删除角色吗",
    {
      type: "warning"
    }
  )
    .then(() => {
      postDelRoleApi(item);
    })
    .catch(() => {
      // catch error
      ElMessage({
        message: "已取消"
      });
    });
};
// 标签选择
const activeName = ref("first");

// 添加角色组成员
const AddRolesPerson = () => {
  if (rolesList.rolesName) {
    addPersonRef.value.open(rolesList.addPerson);
    addPersonShow.value = true;
  } else {
    ElMessage.warning("请先选择角色");
  }
};
// 删除角色组成员
const deltetePerson = item => {
  ElMessageBox.confirm(
    `人员删除后不能恢复,是否确认删除【${item.realName}】吗?`,
    "确认删除人员吗",
    {
      type: "warning"
    }
  )
    .then(() => {
      getDeleteUserApi(item.userCode, postPageUserByRoleApi);
    })
    .catch(() => {
      // catch error
      ElMessage({
        message: "已取消"
      });
    });
};
// 成员管理
const paramsPageUser = reactive({
  pageNumber: 1,
  pageSize: 10,
  roleName: "",
  roleCode: "",
  realName: "",
  userCodes: []
});
const total = ref(0);
const postPageUserByRoleApi = async () => {
  const { code, data } = await postPageUserByRole(paramsPageUser);
  console.log(data);
  if (code === 200) {
    tableData.value = data.records;
    if (data.totalRow) {
      total.value = data.totalRow;
    }
  }
};
// 菜单权限
const handleClick = (tab, event) => {
  console.log(tab, event);
};
const getMenuListApi = async () => {
  const { code, data } = await getMenuList();
  console.log("菜单", data);
};
getMenuListApi();
// const postAddMenuListApi = async () => {
//   const { code } = await postAddMenuList({
//     menuName: "指标库",
//     menuType: "menu",
//     parentCode: "",
//     orderNum: 0,
//     url: "",
//     moduleUrl: "/IndexDefine",
//     icon: "",
//     remark: "",
//     menuCode: ""
//   });
// };
// postAddMenuListApi();
// {
//     menuName: "新建模板",
//     menuType: "menu",
//     parentCode: "menu340271989673566208",
//     orderNum: 0,
//     url: "",
//     moduleUrl: "/evaluate/children/change/components/newAdd",
//     icon: "",
//     remark: "",
//     menuCode: ""
//   }
const getMenuListCodeForRoleApi = async item => {
  console.log("item", item);
  const { code, data } = await getMenuListCodeForRole({
    roleCode: item.roleCode
  });
  // console.log("菜单", data);
};
const handleSizeChange = val => {
  paramsPageUser.pageSize = val;
  postPageUserByRoleApi();
};
const handleCurrentChange = val => {
  paramsPageUser.pageNumber = val;
  postPageUserByRoleApi();
};
</script>

<template>
  <div class="flex w-full h-full">
    <!-- 新增角色 -->
    <addRole
      ref="addRoleRef"
      v-model="addRoleShow"
      @handleClick="postPageRoleApi"
    />
    <!-- 新增角色组成员 -->
    <addPerson
      ref="addPersonRef"
      v-model="addPersonShow"
      @handeClick="postPageUserByRoleApi"
    />
    <!-- 主体内容 -->
    <div class="box-left">
      <div class="w-[100%]">
        <div><el-text type="info">系统角色</el-text></div>
      </div>
      <!-- v-infinite-scroll="loadSystem" -->
      <div
        v-infinite-scroll="loadSystem"
        infinite-scroll-immediate="false"
        class="h-1/4 w-[100%] overflow-auto infinite-list"
      >
        <div
          v-for="(item, index) in rolesList.data"
          :key="index"
          class="w-[100%] flex justify-between items-center roles-text"
        >
          <pngcaret class="mr-1 mt-2" />
          <div
            :class="[
              'w-[100%] flex justify-between items-center mt-2 cursor-pointer',
              { 'roles-bg': bgColor === item.id }
            ]"
          >
            <div
              class="flex justify-between items-center"
              @click="lookRoles(item)"
            >
              <span class="">{{ item.roleName }}</span>
            </div>
            <div class="flex justify-between items-center">
              <el-dropdown trigger="click">
                <span>
                  <el-icon><Operation /></el-icon>
                </span>
                <template #dropdown>
                  <el-dropdown-menu class="setting">
                    <el-dropdown-item @click="editRoleName(item)">
                      编辑名称
                    </el-dropdown-item>
                    <el-dropdown-item>
                      <el-link type="danger" @click="deleteRole(item)"
                        >删除</el-link
                      >
                    </el-dropdown-item>
                  </el-dropdown-menu>
                </template>
              </el-dropdown>
            </div>
          </div>
        </div>
      </div>
      <el-divider />
      <div class="w-[100%]">
        <div><el-text type="info">自定义角色</el-text></div>
      </div>
      <div
        v-infinite-scroll="load"
        class="h-2/5 w-[100%] overflow-auto infinite-list"
      >
        <div
          v-for="(item, index) in rolesList.dataUser"
          :key="index"
          class="w-[100%] flex justify-between items-center roles-text"
        >
          <pngcaret class="mr-1 mt-2" />
          <div
            :class="[
              'w-[100%] flex justify-between items-center mt-2 cursor-pointer',
              { 'roles-bg': bgColor === item.id }
            ]"
          >
            <div
              class="flex justify-between items-center"
              @click="lookRoles(item)"
            >
              <span class="">{{ item.roleName }}</span>
            </div>
            <div class="flex justify-between items-center">
              <el-dropdown trigger="click">
                <span>
                  <el-icon><Operation /></el-icon>
                </span>
                <template #dropdown>
                  <el-dropdown-menu class="setting">
                    <Auth :value="['编辑角色']">
                      <el-dropdown-item @click="editRoleName(item)">
                        编辑名称
                      </el-dropdown-item>
                    </Auth>
                    <Auth :value="['删除']">
                      <el-dropdown-item>
                        <el-link type="danger" @click="deleteRole(item)"
                          >删除</el-link
                        >
                      </el-dropdown-item>
                    </Auth>
                  </el-dropdown-menu>
                </template>
              </el-dropdown>
            </div>
          </div>
        </div>
      </div>
      <el-divider />
      <Auth :value="['新建角色']">
        <el-button type="primary" class="addRole" plain @click="addRoles()"
          >新增角色</el-button
        >
      </Auth>
    </div>
    <!-- <div v-if="rolesList.rolesName" class="box-right"> -->
    <div class="box-right">
      <h3>{{ rolesList.rolesName }}</h3>
      <el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">
        <el-tab-pane label="成员管理" name="first">
          <div class="flex justify-between mb-3">
            <el-input
              v-model="paramsPageUser.realName"
              placeholder="搜索姓名"
              class="mb-2"
              style="max-width: 300px"
              :prefix-icon="Search"
              @change="postPageUserByRoleApi"
            />
            <Auth :value="['添加成员']">
              <el-button type="primary" @click="AddRolesPerson"
                >添加成员</el-button
              >
            </Auth>
          </div>
          <el-table :data="tableData" style="width: 100%">
            <el-table-column prop="realName" label="姓名" />
            <el-table-column prop="hospitalCode" label="工号" />
            <el-table-column prop="jobTitle" label="职称" />
            <el-table-column prop="dept" label="部门" />
            <el-table-column prop="phone" label="手机号" />
            <el-table-column label="操作">
              <template #default="{ row }">
                <el-dropdown trigger="click" class="mr-2">
                  <Auth :value="['移除成员']">
                    <el-text type="danger" @click="deltetePerson(row)">
                      移除
                    </el-text>
                  </Auth>
                </el-dropdown>
              </template>
            </el-table-column>
          </el-table>
          <div class="h-[80px]">
            <div class="float-left mt-3 total">共{{ total }}条数据</div>
            <div class="absolute right-0 mr-20 mt-3">
              <el-pagination
                v-model:current-page="paramsPageUser.pageNumber"
                v-model:page-size="paramsPageUser.pageSize"
                background
                layout="prev, pager, next"
                :total="total"
                @size-change="handleSizeChange"
                @current-change="handleCurrentChange"
              />
            </div>
          </div>
        </el-tab-pane>
        <Auth :value="['权限管理']">
          <el-tab-pane label="权限管理" name="second">
            <el-table :data="tableData" border style="width: 100%">
              <el-table-column prop="date" label="模块">
                <template #default="{ row }">
                  <div>
                    <input v-model="row.show" type="checkbox" />{{ row.date }}
                    <br />
                    <input v-model="row.show1" type="checkbox" />{{ row.name }}
                    <br />
                    <input v-model="row.show2" type="checkbox" />{{
                      row.address
                    }}
                  </div>
                </template>
              </el-table-column>
              <el-table-column prop="name" label="菜单">
                <template #default="{ row }">
                  <div>
                    <input v-model="row.show" type="checkbox" />{{ row.date }}
                  </div>
                  <div>
                    <input v-model="row.show" type="checkbox" />{{ row.date }}
                  </div>
                </template>
              </el-table-column>
              <el-table-column prop="address" label="全选">
                <template #default="{ row }">
                  <div>
                    <input v-model="row.show" type="checkbox" />{{ row.date }}
                  </div>
                </template>
              </el-table-column>
              <el-table-column prop="address" label="权限点">
                <template #default="{ row }">
                  <div>
                    <input v-model="row.show" type="checkbox" />{{ row.date }}
                  </div>
                </template>
              </el-table-column>
            </el-table>
          </el-tab-pane>
        </Auth>
      </el-tabs>
    </div>
  </div>
</template>
<style lang="scss" scoped>
.total {
  font-size: 14px;
  // font-family: PingFangSC-Regular;
  font-weight: 400;
  line-height: 22px;
  color: #0009;
  letter-spacing: 0;
}

.box-left {
  position: relative;
  width: 25%;
  // border: 1px solid red;
  height: 100%;
  padding: 10px 20px;
  border-right: 1px solid #999;
}

.box-right {
  width: 70%;
  height: 100%;
  padding: 10px 20px;
}

.addRole {
  position: absolute;
  bottom: 70px;
  width: calc(100% - 50px);
}

.infinite-list {
  -ms-overflow-style: none; /* IE和Edge */
  scrollbar-width: none; /* Firefox */
  // border: 1px solid red;
}

/* 隐藏滚动条 */
.infinite-list::-webkit-scrollbar {
  display: none; /* 对于 Webkit 浏览器(Chrome, Safari等) */
}
// ::v-deep .el-dropdown {
//   line-height: 1;
// }
// ::v-deep .el-tree-node__expand-icon {
//   line-height: 10px;
//   border: 1px solid red;
// }
.roles-bg {
  color: #0052d9;
  background-color: #0053d91a;
}

.roles-text {
  font-size: 14px;
  // font-family: PingFangSC-Regular;
  font-weight: 400;
  line-height: 22px;
  color: #000000e6;
  letter-spacing: 0;
}
</style>