import { useGroupInfo } from './useGroup';
import { useUserId } from './useUserInfo';
import _uniq from 'lodash/uniq';
import _flatten from 'lodash/flatten';
import { useDebugValue, useMemo } from 'react';
import { getPermissionList } from '../..';

/**
 * 获取群组用户的所有权限
 */
export function useGroupMemberAllPermissions(groupId: string): string[] {
  const groupInfo = useGroupInfo(groupId);
  const userId = useUserId();

  if (!groupInfo || !userId) {
    return [];
  }

  if (groupInfo.owner === userId) {
    // 群组管理员拥有一切权限
    // 返回所有权限
    return getPermissionList().map((p) => p.key);
  }

  const members = groupInfo.members;

  const groupRoles = groupInfo.roles;
  const userRoles = members.find((m) => m.userId === userId)?.roles ?? [];
  const userPermissions = _uniq([
    ..._flatten(
      userRoles.map(
        (roleId) =>
          groupRoles.find((role) => String(role._id) === roleId)?.permissions ??
          []
      )
    ),
    ...groupInfo.fallbackPermissions,
  ]);

  useDebugValue({
    groupRoles,
    userRoles,
    userPermissions,
    fallbackPermissions: groupInfo.fallbackPermissions,
  });

  return userPermissions;
}

/**
 * 获取面板的所有权限
 * 不包含群组本身的权限
 */
export function useGroupPanelMemberAllPermissions(
  groupId: string,
  panelId: string
): string[] {
  const groupInfo = useGroupInfo(groupId);
  const userId = useUserId();

  if (!groupInfo || !userId) {
    return [];
  }

  const panelInfo = groupInfo.panels.find((p) => p.id === panelId);
  if (!panelInfo) {
    return [];
  }

  const fallbackPermissions = panelInfo.fallbackPermissions ?? [];
  const permissionMap = panelInfo.permissionMap ?? {};
  const specPermissions = permissionMap[userId] ?? [];

  const userRoles =
    groupInfo.members.find((m) => m.userId === userId)?.roles ?? []; // 当前用户角色
  const userPanelPermissions = _uniq([
    ..._flatten(userRoles.map((roleId) => permissionMap[roleId] ?? [])),
    ...specPermissions,
    ...fallbackPermissions,
  ]);

  return userPanelPermissions;
}

/**
 * 判断用户是否拥有以下权限
 */
export function useHasGroupPermission(
  groupId: string,
  permissions: string[]
): boolean[] {
  const userPermissions = useGroupMemberAllPermissions(groupId);

  const result = useMemo(
    () => permissions.map((p) => userPermissions.includes(p)),
    [userPermissions.join(','), permissions.join(',')]
  );

  useDebugValue({
    groupId,
    userPermissions,
    checkedPermissions: permissions,
    result,
  });

  return result;
}

/**
 * 判断用户是否在某个面板下拥有以下权限
 * 用于面板权限控制
 */
export function useHasGroupPanelPermission(
  groupId: string,
  panelId: string,
  permissions: string[]
) {
  const groupPermissions = useGroupMemberAllPermissions(groupId);
  const panelPermissions = useGroupPanelMemberAllPermissions(groupId, panelId);

  const fullPermissions = _uniq([...groupPermissions, ...panelPermissions]);

  const result = useMemo(
    () => permissions.map((p) => fullPermissions.includes(p)),
    [fullPermissions.join(','), permissions.join(',')]
  );

  useDebugValue({
    groupId,
    panelId,
    fullPermissions,
    checkedPermissions: permissions,
    result,
  });

  return result;
}