import { applyDecorators, Type } from '@nestjs/common';
import { ApiExtraModels, ApiOkResponse, getSchemaPath } from '@nestjs/swagger';
import {
  ApiResponseMetaDto,
  ApiSuccessResponseDto,
} from 'src/common/dto/response.dto';

type ApiOkStandardOptions = {
  description?: string;
  isArray?: boolean;
  nullable?: boolean;
};

export const ApiOkStandard = <TModel extends Type<unknown>>(
  model: TModel,
  options: ApiOkStandardOptions = {},
) =>
  applyDecorators(
    ApiExtraModels(ApiSuccessResponseDto, ApiResponseMetaDto, model),
    ApiOkResponse({
      description: options.description,
      schema: {
        allOf: [
          { $ref: getSchemaPath(ApiSuccessResponseDto) },
          {
            properties: {
              data: options.isArray
                ? {
                    type: 'array',
                    items: { $ref: getSchemaPath(model) },
                    ...(options.nullable ? { nullable: true } : {}),
                  }
                : {
                    $ref: getSchemaPath(model),
                    ...(options.nullable ? { nullable: true } : {}),
                  },
              meta: { $ref: getSchemaPath(ApiResponseMetaDto) },
            },
          },
        ],
      },
    }),
  );
