import { Body, Controller, Param, Post, UseGuards, ValidationPipe } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import { ApiBearerAuth, ApiBody, ApiOperation, ApiTags } from '@nestjs/swagger';
import { RequirePermission } from 'src/auth/decorators/require-permission.decorator';
import { RequireSubmodulo } from 'src/auth/decorators/require-submodulo.decorator';
import type { LoginUserInfo } from 'src/auth/dto/login.dto';
import { GetUser } from 'src/auth/get-user.decorator';
import { PermissionGuard } from 'src/auth/guards/permission.guard';
import { SubmoduloGuard } from 'src/auth/guards/submodulo.guard';
import { GenerarPresupuestoDto } from './dto/generar-presupuesto.dto';
import { PresupuestoOportunidadService } from './presupuesto-oportunidad.service';

@ApiTags('CRM · Presupuesto desde oportunidad')
@ApiBearerAuth()
@UseGuards(AuthGuard('jwt'), SubmoduloGuard)
@RequireSubmodulo('CRM_OPORTUNIDADES')
@Controller({ path: 'crm/oportunidades', version: '1' })
export class PresupuestoOportunidadController {
  constructor(private readonly service: PresupuestoOportunidadService) {}

  @Post(':id/presupuesto')
  @UseGuards(PermissionGuard)
  @RequirePermission('CRM', 'CRM_OPO_PRESUPUESTO_GENERAR')
  @ApiOperation({
    summary: 'Genera el presupuesto M36 con los ítems de la oportunidad',
    description:
      'Nace en DRAFT y queda vinculado en las dos direcciones. La etapa de la oportunidad no se ' +
      'mueve acá: avanza cuando el presupuesto se envía al cliente. Si ya hay un presupuesto ' +
      'vigente devuelve 409 con su id, para que se use "nueva versión" en vez de duplicar.',
  })
  @ApiBody({ type: GenerarPresupuestoDto, required: false })
  generar(
    @Param('id') id: string,
    @Body(ValidationPipe) dto: GenerarPresupuestoDto,
    @GetUser() user: LoginUserInfo,
  ) {
    return this.service.generar(id, dto, user.empresa_id, user.id, user.username);
  }
}
