import { CreatePermissionDto } from '../dto/create-permission.dto';
import { PaginatedPermissionResponseDto, PermissionResponseDto } from '../dto/permission-response.dto';
import { UpdatePermissionDto } from '../dto/update-permission.dto';
import { CreateSubPermissionDto } from '../dto/create-sub-permisison.dto';
import { SubPermissionEntity } from '../entities/sub-permission.entity';
import { UpdateSubPermissionDto } from '../dto/update-sub-permission.dto';

export abstract class BasePermissionService {
  // Permission-specific methods
  abstract createPermission(createPermissionDto: CreatePermissionDto): Promise<PermissionResponseDto>;
  abstract updatePermission(permissionId: string, updatePermissionDto: UpdatePermissionDto): Promise<PermissionResponseDto>;
  abstract deletePermission(permissionId: string): Promise<void>;
  abstract findAllClientPermissions(): Promise<PermissionResponseDto[]>;
  abstract findPermissionById(permissionId: string): Promise<PermissionResponseDto>;
  abstract findPermissionByName(permissionName: string): Promise<PermissionResponseDto>;

  abstract removePermissionsFromRole(roleId: string, permissionIds: string[]): Promise<void>;
  abstract getPermissionsByRoleId(roleId: string, page: number, limit: number): Promise<PaginatedPermissionResponseDto>;
  abstract getPermissionsByRoleName(roleName: string, page: number, limit: number): Promise<PaginatedPermissionResponseDto>;

  // sub permission
  abstract createSubPermission(createSubPermissionDto: CreateSubPermissionDto): Promise<PermissionResponseDto>;
  abstract updateSubPermission(subPermissionId: string, updateSubPermissionDto: UpdateSubPermissionDto): Promise<PermissionResponseDto>;
  abstract deleteSubPermission(subPermissionId: string): Promise<void>;
  abstract findSubPermissionById(subPermissionId: string): Promise<PermissionResponseDto>;
  abstract findSubPermissionByIds(subPermissionIds: string[]): Promise<SubPermissionEntity[]>;
  abstract findSubPermissionByName(subPermissionName: string): Promise<PermissionResponseDto>;
  abstract findAllSubPermissions(): Promise<SubPermissionEntity[]>;
  abstract removeSubPermissionsFromRole(roleId: string, subPermissionIds: string[]): Promise<void>;
  abstract getSubPermissionsByPermissionId(permissionId: string): Promise<SubPermissionEntity[]>;
}
