import { PaginatedResponseDto } from 'common/utils/paginated-response.dto';
import { CreateRoleDto } from '../dto/create-role.dto';
import { RoleResponseDto } from '../dto/role-response.dto';
import { UpdateRoleDto } from '../dto/update-role.dto';
import { UserResponseDto } from 'modules/user/dto/user-response.dto';
import { PermissionStateDto } from '../dto/permission-state.dto';
import { UserPermissionOverrideDto } from '../dto/user-permission-override.dto';
import { UserPermissionOverrideEntity } from '../entities/user-permission-override.entity';
import { EffectivePermissionDto } from '../dto/effective-permission.dto';
import { PermissionWithStateDto, SubPermissionWithStateDto } from 'modules/role-permission/permissions/dto/permission-state.dto';

export abstract class BaseRoleService {
  // Core Role Management
  abstract createRole(createRoleDto: CreateRoleDto): Promise<RoleResponseDto>;
  abstract updateRole(roleId: string, updateRoleDto: UpdateRoleDto): Promise<RoleResponseDto>;
  abstract deleteRole(roleId: string): Promise<void>;

  abstract findAllRoles(page: number, limit: number, clientId?: string): Promise<PaginatedResponseDto<RoleResponseDto>>;
  abstract findRoleById(roleId: string): Promise<RoleResponseDto>;
  abstract findRoleByName(roleName: string, clientId?: string): Promise<RoleResponseDto>;

  abstract assignUserToRoleByEmail(email: string, roleId: string, clientId?: string): Promise<void>;
  abstract removeUserFromRole(userId: number, roleId: string): Promise<void>;
  abstract revokeUserAllRoles(userId: number): Promise<void>;
  abstract removeUserRolesFromClient(userId: number, clientId: string): Promise<void>;

  // Permission State Management (New Discord-style methods)
  abstract setRolePermissionState(roleId: string, permissionId: string, state: PermissionState): Promise<void>;
  abstract setRoleSubPermissionState(roleId: string, subPermissionId: string, state: PermissionState): Promise<void>;
  abstract bulkSetRolePermissionStates(
    roleId: string,
    permissions: PermissionStateDto[],
    subPermissions: PermissionStateDto[],
  ): Promise<RoleResponseDto>;

  // User Permission Overrides (Discord-style user-specific overrides)
  abstract setUserPermissionOverride(override: UserPermissionOverrideDto): Promise<void>;
  abstract removeUserPermissionOverride(userId: number, permissionId?: string, subPermissionId?: string, clientId?: string): Promise<void>;
  abstract getUserPermissionOverrides(userId: number, clientId?: string): Promise<UserPermissionOverrideEntity[]>;

  // Permission Checking
  abstract checkUserPermission(userId: number, permissionName: string, clientId?: string): Promise<boolean>;
  abstract checkUserSubPermission(userId: number, subPermissionName: string, clientId?: string): Promise<boolean>;
  abstract getUserEffectivePermissions(userId: number, clientId?: string): Promise<EffectivePermissionDto[]>;

  // Legacy methods (updated for new system)
  abstract getPermissionsByRoleId(roleId: string): Promise<PermissionWithStateDto[]>;
  abstract getSubPermissionsByRoleId(roleId: string): Promise<SubPermissionWithStateDto[]>;
  abstract getPermissionsByUserId(userId: number, clientId?: string): Promise<EffectivePermissionDto[]>;
  abstract getSubPermissionsByUserId(userId: number, clientId?: string): Promise<EffectivePermissionDto[]>;
  abstract getPermissionsByRoleName(roleName: string, clientId?: string): Promise<PermissionWithStateDto[]>;

  // Role Queries
  abstract getRolesByUserId(userId: number): Promise<RoleResponseDto[]>;
  abstract getRolesByClientId(clientId: string): Promise<RoleResponseDto[]>;
  abstract getUsersByRoleId(roleId: string): Promise<UserResponseDto[]>;
  abstract getRolesByUserEmail(email: string, clientId?: string): Promise<RoleResponseDto[]>;

  // Utility methods
  abstract duplicateRole(roleId: string, newName: string): Promise<RoleResponseDto>;
  abstract getRoleHierarchy(clientId?: string): Promise<RoleResponseDto[]>; // Roles sorted by priority
}
