import { http } from "@/utils/http";
import type {
  ConfigInfo,
  DepartmentInfo,
  DepartmentRoleInfo,
  PermissionInfo,
  RoleInfo,
  RolePermissionInfo,
  UserInfo
} from "types/system";
import { filterEmptyObject } from "./utils";

// ---------------------------部门相关-------------------------------------

/**
 * 获取部门列表参数
 */
type GetDepartmentListParams = {
  /**当前页 */
  page: number;
  /**每页数量 */
  pageSize: number;
  /**部门ID */
  id?: string;
  /**部门名称 */
  name?: string;
  /**附属部门ID */
  parent_id?: string;
  /**部门负责人 */
  principal?: string;
  /**部门电话 */
  phone?: number | string;
  /**部门邮件 */
  email?: string;
  /**备注 */
  remark?: string;
  /**排序 */
  sort?: number | string;
};
/**获取部门列表 */
export const getDepartmentListAPI = (params: GetDepartmentListParams) => {
  return http.request<QueryListResult<DepartmentInfo>>(
    "get",
    `/api/department/list`,
    {
      params: filterEmptyObject(params)
    }
  );
};

/**更新部门数据 */
export const putUpdateDepartmentAPI = (
  data: AddDepartmentParams,
  id: string
) => {
  return http.request<null>("post", `/api/department/update/${id}`, {
    data
  });
};

/**添加部门数据参数 */
type AddDepartmentParams = {
  /**部门名称 */
  name: string;
  /**父部门ID */
  parent_id: string;
  /**排序 */
  sort: number;
  /**部门负责人 */
  principal: string;
  /**部门电话 */
  phone: number | string;
  /**部门邮件 */
  email: string;
  /**备注 */
  remark: string;
  /**状态 */
  status: number;
};

/**添加部门数据 */
export const postAddDepartmentAPI = (data: AddDepartmentParams) => {
  return http.request<null>("post", `/api/department/add`, {
    data
  });
};
/**删除部门及其附属部门 */
export const deleteDepartmentAPI = (id: string) => {
  return http.request<null>("post", `/api/department/delete/${id}`);
};

// ----------------------------权限相关------------------------------------

/** 获取权限列表参数 */
type GetPermissionListParams = {
  /** 当前页码 */
  page: number;
  /** 每页条数 */
  pageSize: number;
  /** 主键 */
  id?: string;
  /** 权限名称 */
  name?: string;
  /** 父权限ID */
  parentId?: string;
  /** 权限路径 */
  path?: string;
  /** 排序权重 */
  rank?: number;
  /** 菜单类型（0菜单、1iframe、2外链、3按钮） */
  menuType?: number;
  /** 显示菜单 */
  showLink?: boolean;
  /** 显示父级菜单 */
  showParent?: boolean;
  /** 激活路径 */
  activePath?: string;
  /** 组件路径 */
  component?: string;
  /** 重定向路径 */
  redirect?: string;
  /** iframe路径 */
  frameSrc?: string;
  /** iframe加载动画 */
  frameLoading?: boolean;
  /** 缓存组件 */
  keepAlive?: boolean;
  /** 权限标识 */
  auths?: string;
  /** 菜单图标 */
  icon?: string;
  /** 右侧图标 */
  extraIcon?: string;
  /** 进场动画 */
  enterTransition?: string;
  /** 离场动画 */
  leaveTransition?: string;
  /** 固定标签页 */
  fixedTag?: boolean;
  /** 隐藏标签页 */
  hiddenTag?: boolean;
};

/**获取权限列表 */
export const getPermissionListAPI = (params: GetPermissionListParams) => {
  return http.request<QueryListResult<PermissionInfo>>(
    "get",
    `/api/permission/list`,
    {
      params: filterEmptyObject(params)
    }
  );
};

/**添加权限参数 */
type AddPermissionParams = {
  /** 路由名称 */
  name: string;
  /** 路由路径 */
  path: string;
  /** 菜单名称 */
  title: string;
  /** 组件路径 */
  component?: string;
  /** 菜单排序 */
  rank: number;
  /** 路由重定向 */
  redirect?: string;
  /** 菜单图标 */
  icon?: string;
  /** 右侧图标 */
  extra_icon?: string;
  /** 进场动画 */
  enter_transition?: string;
  /** 离场动画 */
  leave_transition?: string;
  /** 菜单激活路径 */
  active_path?: string;
  /** 权限标识 */
  auths?: string;
  /** iframe链接地址 */
  frame_src?: string;
  /** iframe加载动画 */
  frame_loading: boolean;
  /** 缓存页面 */
  keep_alive: boolean;
  /** 隐藏标签页 */
  hidden_tag: boolean;
  /** 固定标签页 */
  fixed_tag: boolean;
  /** 显示菜单 */
  show_link: boolean;
  /** 显示父级菜单 */
  show_parent: boolean;
  /** 父级菜单ID */
  parent_id: string;
  /** 菜单类型 */
  menu_type: number;
};
/**
 * 添加权限
 * @param data 添加权限参数
 * @returns
 */
export const postAddPermissionAPI = (data: AddPermissionParams) => {
  return http.request<null>("post", `/api/permission/add`, {
    data
  });
};
/**
 * 删除权限
 * @param id 权限ID
 * @returns
 */
export const deletePermissionAPI = (id: string) => {
  return http.request<null>("post", `/api/permission/delete/${id}`);
};

/**更新权限信息 */
type UpdatePermissionParams = {} & AddPermissionParams;
/**
 *
 * @param id 权限ID
 * @param data 更新权限信息参数
 * @returns
 */
export const putUpdatePermissionAPI = (
  id: string,
  data: UpdatePermissionParams
) => {
  return http.request<null>("post", `/api/permission/update/${id}`, {
    data
  });
};

/**
 * 获取角色权限列表
 * @param id 角色ID
 * @returns
 */
export const getRolePermissionsAPI = (id: string) => {
  return http.request<QueryListResult<RolePermissionInfo>>(
    "get",
    `/api/role/permissionList/${id}`
  );
};

/**
 * 更新角色权限信息
 * @param id 角色ID
 * @param data 角色权限列表
 * @returns
 */
export const putUpdateRolePermissionsAPI = (
  id: string,
  data: {
    permission_ids: string[];
  }
) => {
  return http.request<null>("put", `/api/role/updatePermission/${id}`, {
    data
  });
};

// -----------------------------角色相关-----------------------------------

type GetRoleListParams = {
  /**当前页 */
  page: number;
  /**每页数量 */
  pageSize: number;
  /**角色名称 */
  name?: string;
  /**角色标识符 */
  code?: string;
  /**角色描述 */
  description?: string;
  /**所属部门ID */
  department_id?: string;
};

/**获取角色列表 */
export const getRoleListAPI = (params: GetRoleListParams) => {
  return http.request<QueryListResult<RoleInfo>>("get", `/api/role/list`, {
    params: filterEmptyObject(params)
  });
};

/**添加角色参数 */
type AddRoleParams = {
  /**角色姓名 */
  name: string;
  /**角色标识 */
  code: string;
  /**角色描述 */
  description: string;
  /**所属部门ID */
  department_id: string;
  /**状态 */
  status: number | string;
};

/**更新角色数据 */
export const putUpdateRoleAPI = (data: AddRoleParams, id: string) => {
  return http.request<null>("post", `/api/role/update/${id}`, {
    data
  });
};

/**添加角色数据 */
export const postAddRoleAPI = (data: AddRoleParams) => {
  return http.request<null>("post", `/api/role/add`, {
    data
  });
};
/**删除角色 */
export const deleteRoleAPI = (id: string) => {
  return http.request<null>("post", `/api/role/delete/${id}`);
};

// --------------------------用户相关--------------------------------------

/**添加用户参数 */
type AddUserParams = {
  /**用户账号 */
  username: string;
  /**用户密码 */
  password: string;
  /**用户性别 */
  gender: number;
  /**用户头像 */
  avatar: string;
  /**用户邮箱 */
  email: string;
  /**用户姓名 */
  nickname: string;
  /**用户手机号 */
  phone: string;
  /**用户状态 */
  status: number;
  /**用户部门 */
  department_id: string;
};
/**
 * 添加用户
 * @param data
 * @returns
 */
export const postAddUserAPI = (data: AddUserParams) => {
  return http.request<null>("post", `/api/user/add`, {
    data
  });
};

/**获取用户列表参数 */
type GetUserListParams = {
  /**当前页 */
  page: number;
  /**每页数量 */
  pageSize: number;
  /**部门ID */
  department_id?: string;
  /**用户账号 */
  username?: string;
  /**用户姓名 */
  nickname?: string;
  /**用户ID */
  id?: string;
  /**用户状态 */
  status?: string;
  /**用户手机号 */
  phone?: string;
  /**用户邮箱 */
  email?: string;
  /**用户性别 */
  gender?: number | string;
};

/**获取用户列表 */
export const getUserListAPI = (params: GetUserListParams) => {
  return http.request<QueryListResult<UserInfo>>("get", `/api/user/list`, {
    params: filterEmptyObject(params)
  });
};

/**更新用户参数 */
type UpdateUserParams = {
  /**用户账号 */
  username: string;
  /**用户性别 */
  gender: number;
  /**用户头像 */
  avatar: string;
  /**用户邮箱 */
  email: string;
  /**用户姓名 */
  nickname: string;
  /**用户手机号 */
  phone: string;
  /**用户状态 */
  status: number;
  /**用户部门 */
  department_id: string;
};

/**
 * 更新用户信息
 * @param id 角色ID
 * @param data 更新角色参数
 * @returns
 */
export const putUpdateUserAPI = (id: string, data: UpdateUserParams) => {
  return http.request<null>("put", `/api/user/update/${id}`, {
    data
  });
};

/**
 * 删除用户
 * @param id 用户ID
 * @returns
 */
export const deleteUserAPI = (id: string) => {
  return http.request<null>("post", `/api/user/delete/${id}`);
};

/**
 * 批量删除用户
 * @param  data 用户ID列表
 * @returns
 */
export const deleteUserListAPI = (data: { userIds: string[] }) => {
  return http.request<null>("post", `/api/user/deleteUserList`, { data });
};

/**
 * 更新用户密码
 * @param id 用户ID
 * @param data 用户新密码
 * @returns
 */
export const putUpdateUserPasswordAPI = (
  id: string,
  data: { password: string }
) => {
  return http.request<null>("post", `/api/user/updateUserPassword/${id}`, {
    headers: {
      "content-type": "application/x-www-form-urlencoded"
    },
    data
  });
};

/**
 * 获取用户角色列表
 * @param id 用户ID
 * @returns
 */
export const getUserRolesAPI = (id: string) => {
  return http.request<QueryListResult<DepartmentRoleInfo>>(
    "get",
    `/api/user/roleList/${id}`
  );
};

type UpdateUserRoleParams = {
  /**用户ID */
  user_id: string;
  /**角色ID */
  role_ids: string[];
};

/**
 * 更新用户角色信息
 * @param id 用户ID
 * @param data 用户角色列表
 * @returns
 */
export const putUpdateUserRolesAPI = (data: UpdateUserRoleParams) => {
  return http.request<null>("post", `/api/user/updateRole`, {
    data
  });
};

/**
 * 获取用户权限列表
 * @param id 用户ID
 * @returns
 */
export const getUserPermissionsAPI = (id: string) => {
  return http.request<string[]>("get", `/api/user/permissionList/${id}`);
};

/**用户获取部门角色列表 */
export const getUserGetDepartmentRolesAPI = (id: string) => {
  return http.request<QueryListResult<DepartmentRoleInfo>>(
    "get",
    `/api/department/roleList/${id}`
  );
};

// ---------------------------配置相关-------------------------------------

/**
 * 添加配置参数
 */
interface AddConfigParams {
  /**配置名称 */
  name: string;
  /**配置键值 */
  key: string;
  /**配置值 */
  value: string;
  /**系统配置 */
  type: string;
  /**备注 */
  remark?: string;
}

/**
 * 添加配置
 * @param data
 * @returns
 */
export const postAddConfigAPI = (data: AddConfigParams) => {
  return http.request<null>("post", `/api/config/add`, {
    data
  });
};

/**
 * 删除配置
 */
export const deleteConfigAPI = (id: string) => {
  return http.request<null>("post", `/api/config/delete/${id}`);
};

/**
 * 批量删除配置
 * @param  data 配置ID列表
 */
export const deleteConfigListAPI = (data: { ids: string[] }) => {
  return http.request<null>("post", `/api/config/deleteList`, { data });
};

/**
 * 更新配置
 */
export const putUpdateConfigAPI = (data: AddConfigParams, id: string) => {
  return http.request<null>("post", `/api/config/update/${id}`, {
    data
  });
};
/**
 * 获取配置信息
 * @param id 配置ID
 */
export const getConfigAPI = (id: string) => {
  return http.request<ConfigInfo>("get", `/api/config/info/${id}`);
};

/**
 * 获取配置列表参数
 */
interface GetConfigListParams {
  /**
   * 页码
   */
  page: number;
  /**
   * 每页数量
   */
  pageSize: number;
  /**
   * 配置名称
   */
  name?: string;
  /**
   * 配置键值
   */
  key?: string;
  /**
   * 系统配置
   */
  type?: string;
}

/**
 * 获取配置列表
 * @param params
 */
export const getConfigListAPI = (params: GetConfigListParams) => {
  return http.request<QueryListResult<ConfigInfo>>("get", `/api/config/list`, {
    params: filterEmptyObject(params)
  });
};
