import { Body, Controller, Get, Param, ParseUUIDPipe, Post, Query, UseGuards, ValidationPipe } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import { ApiBearerAuth, ApiOperation, ApiQuery, ApiTags } from '@nestjs/swagger';
import { inm_cotizacion_estado } from '@prisma/client';
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 { CotizacionesInmService } from './cotizaciones.service';
import { CreateCotizacionDto } from './dto/cotizacion.dto';

@ApiTags('Inmobiliario · Cotizaciones')
@ApiBearerAuth()
@UseGuards(AuthGuard('jwt'), SubmoduloGuard)
@RequireSubmodulo('INM_COTIZACIONES')
@Controller({ path: 'inmobiliario/cotizaciones', version: '1' })
export class CotizacionesInmController {
  constructor(private readonly service: CotizacionesInmService) {}

  @Get()
  @UseGuards(PermissionGuard)
  @RequirePermission('INMOBILIARIO', 'INM_COT_COTIZACION_VER')
  @ApiQuery({ name: 'proyecto_id', required: false })
  @ApiQuery({ name: 'unidad_id', required: false })
  @ApiQuery({ name: 'estado', required: false, enum: inm_cotizacion_estado })
  @ApiQuery({ name: 'q', required: false })
  listar(
    @GetUser() user: LoginUserInfo,
    @Query('proyecto_id') proyecto_id?: string,
    @Query('unidad_id') unidad_id?: string,
    @Query('estado') estado?: inm_cotizacion_estado,
    @Query('q') q?: string,
  ) {
    return this.service.listar(user.empresa_id, { proyecto_id, unidad_id, estado, q });
  }

  @Get(':id')
  @UseGuards(PermissionGuard)
  @RequirePermission('INMOBILIARIO', 'INM_COT_COTIZACION_VER')
  detalle(@Param('id', ParseUUIDPipe) id: string, @GetUser() user: LoginUserInfo) {
    return this.service.detalle(id, user.empresa_id);
  }

  @Post()
  @UseGuards(PermissionGuard)
  @RequirePermission('INMOBILIARIO', 'INM_COT_COTIZACION_CREAR')
  @ApiOperation({
    summary: 'Cotiza una unidad con hasta tres planes. Un descuento sobre el tope exige INM_COT_DESCUENTO_AUTORIZAR.',
  })
  crear(@Body(ValidationPipe) dto: CreateCotizacionDto, @GetUser() user: LoginUserInfo) {
    return this.service.crear(dto, user.empresa_id, user.id);
  }

  @Post(':id/anular')
  @UseGuards(PermissionGuard)
  @RequirePermission('INMOBILIARIO', 'INM_COT_COTIZACION_ANULAR')
  anular(@Param('id', ParseUUIDPipe) id: string, @GetUser() user: LoginUserInfo) {
    return this.service.anular(id, user.empresa_id, user.id);
  }
}
