import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import { IsUUID, IsString, IsOptional, IsEnum, IsBoolean } from 'class-validator';
import { PermissionState } from 'common/enum/permission-state.enum';
import { RolePermissionStateEntity } from 'modules/role-permission/roles/entities/role-permission-state.entity';

export class PermissionWithStateDto {
  @ApiProperty({
    description: 'Unique identifier of the permission',
    example: '111e4567-e89b-12d3-a456-426614174000',
  })
  @IsUUID()
  id: string;

  @ApiProperty({
    description: 'Internal name of the permission',
    example: 'manage_users',
  })
  @IsString()
  name: string;

  @ApiProperty({
    description: 'Display name of the permission',
    example: 'Manage Users',
  })
  @IsString()
  displayName: string;

  @ApiPropertyOptional({
    description: 'Optional description of the permission',
    example: 'Allows managing user accounts',
  })
  @IsString()
  @IsOptional()
  description?: string;

  @ApiProperty({
    description: 'Override state of the permission',
    enum: PermissionState,
    example: PermissionState.ALLOW,
  })
  @IsEnum(PermissionState)
  state: PermissionState;

  @ApiProperty({
    description: 'Whether the permission is active',
    example: true,
  })
  @IsBoolean()
  isActive: boolean;
}

export class SubPermissionWithStateDto {
  @ApiProperty({
    description: 'Unique identifier of the sub-permission',
    example: '222e4567-e89b-12d3-a456-426614174000',
  })
  @IsUUID()
  id: string;

  @ApiProperty({
    description: 'Internal name of the sub-permission',
    example: 'edit_user_email',
  })
  @IsString()
  name: string;

  @ApiProperty({
    description: 'Display name of the sub-permission',
    example: 'Edit User Email',
  })
  @IsString()
  displayName: string;

  @ApiPropertyOptional({
    description: 'Optional description of the sub-permission',
    example: 'Allows editing the email address of users',
  })
  @IsString()
  @IsOptional()
  description?: string;

  @ApiProperty({
    description: 'Override state of the sub-permission',
    enum: PermissionState,
    example: PermissionState.DENY,
  })
  @IsEnum(PermissionState)
  state: PermissionState;

  @ApiProperty({
    description: 'Whether the sub-permission is active',
    example: true,
  })
  @IsBoolean()
  isActive: boolean;

  @ApiProperty({
    description: 'ID of the parent permission',
    example: '111e4567-e89b-12d3-a456-426614174000',
  })
  @IsUUID()
  permissionId: string;
}

export function mapPermissionWithStateDto(permission: RolePermissionStateEntity): PermissionWithStateDto {
  return {
    id: permission.id,
    displayName: permission.permission.displayName,
    isActive: permission.permission.isActive,
    name: permission.permission.name,
    description: permission.permission.description ?? null,
    state: permission.permissionState,
  };
}

export function mapSubPermissionWithStateDto(subPermission: RolePermissionStateEntity): SubPermissionWithStateDto {
  return {
    id: subPermission.id,
    displayName: subPermission.subPermission.displayName,
    isActive: subPermission.subPermission.isActive,
    name: subPermission.subPermission.name,
    description: subPermission.subPermission.description ?? null,
    state: subPermission.permissionState,
    permissionId: subPermission.subPermission.permissionId,
  };
}
