/**
 * 数据权限类型枚举
 */
export enum DataPermissionType {
  /** 地区权限 */
  REGION = 1,
  /** 机构权限 */
  ORGANIZATION = 2,
  /** 产品权限 */
  PRODUCT = 3,
  /** 渠道权限 */
  CHANNEL = 4,
  /** 客户等级权限 */
  CUSTOMER_LEVEL = 5,
  /** 业务类型权限 */
  BUSINESS_TYPE = 6,
  /** 时间范围权限 */
  TIME_RANGE = 7,
  /** 金额权限 */
  AMOUNT = 8,
  /** 部门数据权限 */
  DEPARTMENT = 9,
  /** 预留权限10 */
  RESERVED_10 = 10,
  /** 预留权限11 */
  RESERVED_11 = 11,
  /** 预留权限12 */
  RESERVED_12 = 12,
  /** 预留权限13 */
  RESERVED_13 = 13,
  /** 预留权限14 */
  RESERVED_14 = 14,
  /** 预留权限15 */
  RESERVED_15 = 15
}

/**
 * 数据权限类型视图对象
 */
export interface DataPermissionTypeVO extends BaseEntity {
  /** 权限类型ID(1-15) */
  typeId: number;
  /** 权限类型编码 */
  typeCode: string;
  /** 权限类型名称 */
  typeName: string;
  /** 描述 */
  description?: string;
  /** 状态(0正常 1停用) */
  status: string;
  /** 排序 */
  sortOrder: number;
  /** 图标 */
  icon?: string;
}

/**
 * 数据权限值视图对象
 */
export interface DataPermissionValueVO extends BaseEntity {
  /** 权限值ID */
  valueId: number;
  /** 权限类型ID */
  typeId: number;
  /** 权限值编码 */
  valueCode: string;
  /** 权限值名称 */
  valueName: string;
  /** 父级ID(支持层级) */
  parentId: number;
  /** 状态 */
  status: string;
  /** 排序 */
  sortOrder: number;
  /** 层级 */
  level?: number;
  /** 子节点 */
  children?: DataPermissionValueVO[];
}

/**
 * 用户数据权限视图对象
 */
export interface UserDataPermissionVO {
  /** 用户ID */
  userId: number;
  /** 权限类型ID */
  typeId: number;
  /** 权限类型名称 */
  typeName: string;
  /** 是否全部权限(0-受限 1-全部) */
  isAllAccess: number;
  /** 权限值列表 */
  permissionValues: DataPermissionValueVO[];
  /** 权限值ID列表 */
  valueIds: number[];
}

/**
 * 用户数据权限表单
 */
export interface UserDataPermissionForm {
  /** 用户ID */
  userId?: number;
  /** 权限配置列表 */
  permissions: UserDataPermissionConfigItem[];
}

/**
 * 用户数据权限配置项
 */
export interface UserDataPermissionConfigItem {
  /** 权限类型ID */
  typeId: number;
  /** 是否全部权限(0-受限 1-全部) */
  isAllAccess: number;
  /** 选中的权限值ID列表 */
  valueIds: number[];
}

/**
 * 数据权限查询参数
 */
export interface DataPermissionQuery extends PageQuery {
  /** 权限类型ID */
  typeId?: number;
  /** 权限类型编码 */
  typeCode?: string;
  /** 权限类型名称 */
  typeName?: string;
  /** 状态 */
  status?: string;
}

/**
 * 数据权限值查询参数
 */
export interface DataPermissionValueQuery extends PageQuery {
  /** 权限类型ID */
  typeId?: number;
  /** 权限值编码 */
  valueCode?: string;
  /** 权限值名称 */
  valueName?: string;
  /** 父级ID */
  parentId?: number;
  /** 状态 */
  status?: string;
}

/**
 * 权限验证请求参数
 */
export interface PermissionValidateRequest {
  /** 用户ID */
  userId: number;
  /** 权限类型ID */
  typeId: number;
  /** 权限值编码 */
  valueCode: string;
}

/**
 * 权限复制请求参数
 */
export interface PermissionCopyRequest {
  /** 源用户ID */
  fromUserId: number;
  /** 目标用户ID列表 */
  toUserIds: number[];
  /** 是否覆盖已有权限 */
  overwrite?: boolean;
}

/**
 * 批量权限设置请求参数
 */
export interface BatchPermissionRequest {
  /** 用户ID列表 */
  userIds: number[];
  /** 权限配置 */
  permissions: UserDataPermissionConfigItem[];
  /** 是否覆盖已有权限 */
  overwrite?: boolean;
}

/**
 * 权限树节点接口
 */
export interface PermissionTreeNode {
  /** 节点key */
  key: string | number;
  /** 节点标题 */
  title: string;
  /** 节点值 */
  value: string | number;
  /** 父节点key */
  parentKey?: string | number;
  /** 子节点 */
  children?: PermissionTreeNode[];
  /** 是否禁用 */
  disabled?: boolean;
  /** 是否是叶子节点 */
  isLeaf?: boolean;
  /** 扩展数据 */
  data?: any;
}

/**
 * 用户权限状态统计
 */
export interface UserPermissionStats {
  /** 用户ID */
  userId: number;
  /** 用户名 */
  userName: string;
  /** 总权限类型数 */
  totalTypes: number;
  /** 已配置权限类型数 */
  configuredTypes: number;
  /** 全部权限类型数 */
  allAccessTypes: number;
  /** 自定义权限类型数 */
  customTypes: number;
  /** 配置完成度百分比 */
  completionRate: number;
}

/**
 * 权限模板接口
 */
export interface PermissionTemplate {
  /** 模板ID */
  templateId: number;
  /** 模板名称 */
  templateName: string;
  /** 模板描述 */
  description?: string;
  /** 角色ID */
  roleId?: number;
  /** 权限配置 */
  permissions: UserDataPermissionConfigItem[];
  /** 创建时间 */
  createTime: string;
  /** 更新时间 */
  updateTime: string;
}

/**
 * 权限变更记录
 */
export interface PermissionChangeLog extends BaseEntity {
  /** 记录ID */
  logId: number;
  /** 用户ID */
  userId: number;
  /** 用户名 */
  userName: string;
  /** 权限类型ID */
  typeId: number;
  /** 权限类型名称 */
  typeName: string;
  /** 操作类型(add-新增 update-修改 delete-删除) */
  operationType: string;
  /** 变更前值 */
  beforeValue?: string;
  /** 变更后值 */
  afterValue?: string;
  /** 操作人ID */
  operatorId: number;
  /** 操作人姓名 */
  operatorName: string;
  /** 操作时间 */
  operateTime: string;
  /** 操作说明 */
  remark?: string;
}

/**
 * 工具函数：将扁平的权限值列表转换为树形结构
 */
export const convertToTree = (values: DataPermissionValueVO[]): DataPermissionValueVO[] => {
  const map = new Map<number, DataPermissionValueVO>();
  const roots: DataPermissionValueVO[] = [];

  // 创建映射
  values.forEach(value => {
    map.set(value.valueId, { ...value, children: [] });
  });

  // 构建树形结构
  values.forEach(value => {
    const node = map.get(value.valueId);
    if (!node) return;

    if (value.parentId === 0) {
      roots.push(node);
    } else {
      const parent = map.get(value.parentId);
      if (parent) {
        parent.children = parent.children || [];
        parent.children.push(node);
      }
    }
  });

  return roots;
};

/**
 * 工具函数：获取所有子节点的ID
 */
export const getAllChildrenIds = (node: DataPermissionValueVO): number[] => {
  const ids: number[] = [node.valueId];
  if (node.children && node.children.length > 0) {
    node.children.forEach(child => {
      ids.push(...getAllChildrenIds(child));
    });
  }
  return ids;
};

/**
 * 工具函数：检查是否有权限
 */
export const hasPermission = (
  userPermissions: UserDataPermissionVO[],
  typeId: number,
  valueCode: string
): boolean => {
  const permission = userPermissions.find(p => p.typeId === typeId);
  if (!permission) return false;

  // 如果是全部权限
  if (permission.isAllAccess === 1) return true;

  // 检查是否在权限值列表中
  return permission.permissionValues.some(v => v.valueCode === valueCode);
};

/**
 * 工具函数：格式化权限显示文本
 */
export const formatPermissionText = (permission: UserDataPermissionVO): string => {
  if (permission.isAllAccess === 1) {
    return '全部权限';
  }

  if (permission.permissionValues.length === 0) {
    return '无权限';
  }

  if (permission.permissionValues.length <= 3) {
    return permission.permissionValues.map(v => v.valueName).join('、');
  }

  return `${permission.permissionValues.slice(0, 2).map(v => v.valueName).join('、')} 等${permission.permissionValues.length}项`;
};
