import { ApiProperty } from '@nestjs/swagger';
import { UserRole } from 'common/enum/UserRole.enum';
import { PermissionEntity } from '../entities/permission.entity';
import { PaginatedResponseDto } from 'common/utils/paginated-response.dto';
import { SubPermissionEntity } from '../entities/sub-permission.entity';
import { PermissionWithStateDto } from './permission-state.dto';

export class PermissionResponseDto {
  @ApiProperty({ example: '123e4567-e89b-12d3-a456-426614174000' })
  id: string;

  @ApiProperty({ example: 'CREATE_USER' })
  name: string;

  @ApiProperty({ example: 'Create User' })
  displayName: string;

  @ApiProperty({ example: 'Allows the user to create other users', nullable: true })
  description?: string;

  @ApiProperty({ enum: UserRole, example: UserRole.USER })
  permissionType: UserRole;

  @ApiProperty({ example: true })
  isActive: boolean;

  @ApiProperty({ example: false })
  isSystemPermission: boolean;

  @ApiProperty({ example: false })
  isClientPermission: boolean;

  @ApiProperty({ description: ' sub-permissions of the permission', type: [SubPermissionEntity], nullable: true })
  subPermissions?: SubPermissionEntity[] | null;

  @ApiProperty({ example: '2025-06-04T12:34:56Z' })
  createdAt: Date;

  @ApiProperty({ example: '2025-06-04T12:34:56Z' })
  updatedAt: Date;
}

export function mapPermissionResponseDto(permissionEntity: PermissionEntity): PermissionResponseDto {
  return {
    id: permissionEntity.id,
    name: permissionEntity.name,
    displayName: permissionEntity.displayName,
    description: permissionEntity.description ?? null,
    permissionType: permissionEntity.permissionType,
    isActive: permissionEntity.isActive,
    isSystemPermission: permissionEntity.isSystemPermission,
    isClientPermission: permissionEntity.isClientPermission,
    subPermissions: permissionEntity.subPermissions ?? [],
    createdAt: permissionEntity.createdAt,
    updatedAt: permissionEntity.updatedAt,
  };
}

export function mapPermissionsResponseDto(permissions: PermissionEntity[]): PermissionResponseDto[] {
  return permissions.map(mapPermissionResponseDto);
}

export class PaginatedPermissionResponseDto extends PaginatedResponseDto<PermissionWithStateDto> {
  @ApiProperty({ type: [PermissionWithStateDto], description: 'List of permissions' })
  items: PermissionWithStateDto[];
}
