import { Body, Controller, Delete, Get, Param, Patch, Post, Query } from '@nestjs/common';
import { ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger';
import { PageDto, Paginated } from 'upsti-lib-common';

import { {{moduleName}}Service } from './{{toLowerCase moduleName}}.service';

import { Create{{moduleName}}DTO } from './dtos/{{toLowerCase moduleName}}-create.dto';
import { Update{{moduleName}}DTO } from './dtos/{{toLowerCase moduleName}}-update.dto';
import { Delete{{moduleName}}DTO } from './dtos/{{toLowerCase moduleName}}-delete.dto';
import { Response{{moduleName}}DTO } from './dtos/{{toLowerCase moduleName}}-response.dto';
import { Search{{moduleName}}DTO } from './dtos/{{toLowerCase moduleName}}-search.dto';

@ApiTags('{{{toLowerCase moduleName}}}')
@Controller('{{{toLowerCase moduleName}}}')
export class {{moduleName}}Controller {
  constructor(private readonly {{toLowerCase moduleName}}Service: {{moduleName}}Service) {}

  @Post()
  async create(@Body() create{{moduleName}}Dto: Create{{moduleName}}DTO): Promise<Response{{moduleName}}DTO> {
    return await this.{{toLowerCase moduleName}}Service.create(create{{moduleName}}Dto);
  }

  @ApiOperation({
    description: 'Recupera todos los registros o segun criterio de busqueda',
  })
  @Get()
  @Paginated(Response{{moduleName}}DTO)
  @ApiResponse({ type: () => PageDto })
  async search(@Query() req: Search{{moduleName}}DTO): Promise<PageDto<Response{{moduleName}}DTO>> {
    return await this.{{toLowerCase moduleName}}Service.search(req);
  }

  @Get(':id')
  async findOne(@Param('id') id: number): Promise<Response{{moduleName}}DTO> {
    return await this.{{toLowerCase moduleName}}Service.findOne(+id);
  }

  @Patch(':id')
  async update(
    @Param('id') id: string,
    @Body() {{toLowerCase moduleName}}Dto: Update{{moduleName}}DTO,
  ): Promise<Response{{moduleName}}DTO> {
    return await this.{{toLowerCase moduleName}}Service.update(+id, {{toLowerCase moduleName}}Dto);
  }

  @Delete(':id')
  async delete{{moduleName}}(@Param('id') id: number) {
    return await this.{{toLowerCase moduleName}}Service.delete{{moduleName}}(+id);
  }

  @Delete()
  async delete{{moduleName}}s(@Body() ids: Delete{{moduleName}}DTO): Promise<void> {
    return await this.{{toLowerCase moduleName}}Service.delete{{moduleName}}s(ids);
  }
}
