import {
  Body,
  Controller,
  Delete,
  Get,
  Param,
  ParseUUIDPipe,
  Patch,
  Post,
  Put,
  Query,
  UseGuards,
  ValidationPipe,
} from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import { ApiBearerAuth, ApiOperation, ApiQuery, 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 { ComisionesInmService } from './comisiones.service';
import { AsignarBrokerDto, CreateEsquemaDto, LiquidarComisionesDto, UpdateEsquemaDto } from './dto/comision.dto';

@ApiTags('Inmobiliario · Comisiones')
@ApiBearerAuth()
@UseGuards(AuthGuard('jwt'), SubmoduloGuard)
@RequireSubmodulo('INM_COMISIONES')
@Controller({ path: 'inmobiliario', version: '1' })
export class ComisionesInmController {
  constructor(private readonly service: ComisionesInmService) {}

  @Get('comisiones/esquemas')
  @UseGuards(PermissionGuard)
  @RequirePermission('INMOBILIARIO', 'INM_COM_ESQUEMA_VER')
  @ApiQuery({ name: 'proyecto_id', required: false })
  esquemas(@GetUser() user: LoginUserInfo, @Query('proyecto_id') proyecto_id?: string) {
    return this.service.listarEsquemas(user.empresa_id, proyecto_id);
  }

  @Post('comisiones/esquemas')
  @UseGuards(PermissionGuard)
  @RequirePermission('INMOBILIARIO', 'INM_COM_ESQUEMA_CREAR')
  crearEsquema(@Body(ValidationPipe) dto: CreateEsquemaDto, @GetUser() user: LoginUserInfo) {
    return this.service.crearEsquema(dto, user.empresa_id, user.id);
  }

  @Patch('comisiones/esquemas/:id')
  @UseGuards(PermissionGuard)
  @RequirePermission('INMOBILIARIO', 'INM_COM_ESQUEMA_EDITAR')
  actualizarEsquema(
    @Param('id', ParseUUIDPipe) id: string,
    @Body(ValidationPipe) dto: UpdateEsquemaDto,
    @GetUser() user: LoginUserInfo,
  ) {
    return this.service.actualizarEsquema(id, dto, user.empresa_id, user.id);
  }

  @Delete('comisiones/esquemas/:id')
  @UseGuards(PermissionGuard)
  @RequirePermission('INMOBILIARIO', 'INM_COM_ESQUEMA_ELIMINAR')
  darDeBajaEsquema(@Param('id', ParseUUIDPipe) id: string, @GetUser() user: LoginUserInfo) {
    return this.service.darDeBajaEsquema(id, user.empresa_id, user.id);
  }

  @Get('comisiones')
  @UseGuards(PermissionGuard)
  @RequirePermission('INMOBILIARIO', 'INM_COM_COMISION_VER')
  @ApiQuery({ name: 'proyecto_id', required: false })
  @ApiQuery({ name: 'estado', required: false, enum: ['DEVENGADA', 'LIQUIDADA', 'REVERTIDA'] })
  @ApiQuery({ name: 'operacion_id', required: false })
  listar(
    @GetUser() user: LoginUserInfo,
    @Query('proyecto_id') proyecto_id?: string,
    @Query('estado') estado?: string,
    @Query('operacion_id') operacion_id?: string,
  ) {
    return this.service.listar(user.empresa_id, { proyecto_id, estado, operacion_id });
  }

  @Post('comisiones/liquidar')
  @UseGuards(PermissionGuard)
  @RequirePermission('INMOBILIARIO', 'INM_COM_COMISION_LIQUIDAR')
  @ApiOperation({ summary: 'Marca comisiones devengadas como liquidadas, con la referencia del pago' })
  liquidar(@Body(ValidationPipe) dto: LiquidarComisionesDto, @GetUser() user: LoginUserInfo) {
    return this.service.liquidar(dto, user.empresa_id, user.id);
  }

  @Put('operaciones/:id/broker')
  @UseGuards(PermissionGuard)
  @RequirePermission('INMOBILIARIO', 'INM_COM_ESQUEMA_EDITAR')
  @ApiOperation({ summary: 'Asigna (o quita) la inmobiliaria externa de la venta' })
  broker(
    @Param('id', ParseUUIDPipe) id: string,
    @Body(ValidationPipe) dto: AsignarBrokerDto,
    @GetUser() user: LoginUserInfo,
  ) {
    return this.service.asignarBroker(id, dto, user.empresa_id, user.id);
  }
}
