import { type IRole } from '../../IRole';
import { type RocketChatRecordDeleted } from '../../IRocketChatRecord';
import { type IRoleUser, type IUser } from '../../IUser';

type RoleCreateProps = Pick<IRole, 'name'> & Partial<Pick<IRole, 'description' | 'scope' | 'mandatory2fa'>>;

type RoleUpdateProps = { roleId: IRole['_id']; name: IRole['name'] } & Partial<RoleCreateProps>;

type RoleDeleteProps = { roleId: IRole['_id'] };

type RoleAddUserToRoleProps = {
	username: string;
	roleName: string;
	roomId?: string;
};

type RoleRemoveUserFromRoleProps = {
	username: string;
	roleName: string;
	roomId?: string;
	scope?: string;
};

type RoleSyncProps = {
	updatedSince?: string;
};

export type RolesEndpoints = {
	'roles.list': {
		GET: () => {
			roles: IRole[];
		};
	};
	'roles.sync': {
		GET: (params: RoleSyncProps) => {
			roles: {
				update: IRole[];
				remove: RocketChatRecordDeleted<IRole>[];
			};
		};
	};
	'roles.create': {
		POST: (params: RoleCreateProps) => {
			role: IRole;
		};
	};

	'roles.addUserToRole': {
		POST: (params: RoleAddUserToRoleProps) => {
			role: IRole;
		};
	};

	'roles.getUsersInRole': {
		GET: (params: { roomId: string; role: string; offset: number; count: number }) => {
			users: IUser[];
			total: number;
		};
	};

	'roles.update': {
		POST: (role: RoleUpdateProps) => {
			role: IRole;
		};
	};

	'roles.delete': {
		POST: (prop: RoleDeleteProps) => void;
	};

	'roles.removeUserFromRole': {
		POST: (props: RoleRemoveUserFromRoleProps) => {
			role: IRole;
		};
	};

	'roles.getUsersInPublicRoles': {
		GET: () => {
			users: IRoleUser[];
			success: boolean;
		};
	};
};
