import { IsEnum, IsOptional, IsInt, Min } from 'class-validator';
import { ApiPropertyOptional } from '@nestjs/swagger';
import { Type } from 'class-transformer';
import { AccessScopeEnum } from 'src/common/enum/access-scope.enum';
import { AccessStateEnum } from 'src/common/enum/access-state.enum';

/**
 * DTO for querying program access users
 */
export class QueryProgramAccessUsersDto {
  @ApiPropertyOptional({
    description: 'Filter by access scope',
    enum: AccessScopeEnum,
  })
  @IsEnum(AccessScopeEnum)
  @IsOptional()
  accessScope?: AccessScopeEnum;

  @ApiPropertyOptional({
    description: 'Filter by state',
    enum: AccessStateEnum,
    default: AccessStateEnum.ACTIVE,
  })
  @IsEnum(AccessStateEnum)
  @IsOptional()
  state?: AccessStateEnum = AccessStateEnum.ACTIVE;

  @ApiPropertyOptional({
    description: 'Include soft-deleted records',
    default: false,
  })
  @IsOptional()
  @Type(() => Boolean)
  includeDeleted?: boolean = false;

  @ApiPropertyOptional({
    description: 'Number of records to return',
    default: 20,
    minimum: 1,
  })
  @IsOptional()
  @IsInt()
  @Min(1)
  @Type(() => Number)
  limit?: number = 20;

  @ApiPropertyOptional({
    description: 'Number of records to skip',
    default: 0,
    minimum: 0,
  })
  @IsOptional()
  @IsInt()
  @Min(0)
  @Type(() => Number)
  offset?: number = 0;
}
