import { Type, applyDecorators } from '@nestjs/common';
import { ApiExtraModels, ApiOkResponse, ApiProperty, getSchemaPath } from '@nestjs/swagger';
import { IsNumber, IsOptional, IsString } from 'class-validator';

export class ApiResultList<T> {
  @ApiProperty()
  list: T[];
}

export class ApiResultListWithTotal<T> extends ApiResultList<T> {
  @ApiProperty()
  total: number;
}

export class ApiResultListWithMore<T> extends ApiResultList<T> {
  @ApiProperty()
  more: boolean;
}

export const ApiOkResponseList = <DataDto extends Type<unknown>>(dataDto: DataDto) =>
  applyDecorators(
    ApiExtraModels(ApiResultList, dataDto),
    ApiOkResponse({
      schema: {
        allOf: [
          { $ref: getSchemaPath(ApiResultList) },
          {
            properties: {
              list: {
                type: 'array',
                items: { $ref: getSchemaPath(dataDto) },
              },
            },
          },
        ],
      },
    })
  )

export const ApiOkResponseListWithTotal = <DataDto extends Type<unknown>>(dataDto: DataDto) =>
  applyDecorators(
    ApiExtraModels(ApiResultListWithTotal, dataDto),
    ApiOkResponse({
      schema: {
        allOf: [
          { $ref: getSchemaPath(ApiResultListWithTotal) },
          {
            properties: {
              list: {
                type: 'array',
                items: { $ref: getSchemaPath(dataDto) },
              },
            },
          },
        ],
      },
    })
  )

export const ApiOkResponseListWithMore = <DataDto extends Type<unknown>>(dataDto: DataDto) =>
  applyDecorators(
    ApiExtraModels(ApiResultListWithMore, dataDto),
    ApiOkResponse({
      schema: {
        allOf: [
          { $ref: getSchemaPath(ApiResultListWithMore) },
          {
            properties: {
              list: {
                type: 'array',
                items: { $ref: getSchemaPath(dataDto) },
              },
            },
          },
        ],
      },
    })
  )
