import {
  Body,
  Controller,
  Delete,
  Get,
  Param,
  ParseUUIDPipe,
  Patch,
  Post,
  Query,
  UseGuards,
  ValidationPipe,
} from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import { ApiBearerAuth, ApiOperation, ApiQuery, ApiTags } from '@nestjs/swagger';
import { inm_indice_tipo } 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 { CreateIndiceDto, UpdateIndiceDto } from './dto/indice.dto';
import { PLANTILLA_BOLETO_DEFAULT, VARIABLES_BOLETO } from '../operaciones/boleto';
import { UpdateParametrosDto } from './dto/update-parametros.dto';
import { IndicesInmService } from './indices.service';
import { ParametrosInmService } from './parametros.service';

@ApiTags('Inmobiliario · Configuración')
@ApiBearerAuth()
@UseGuards(AuthGuard('jwt'), SubmoduloGuard)
@RequireSubmodulo('INM_CONFIG')
@Controller({ path: 'inmobiliario/config', version: '1' })
export class ConfigInmController {
  constructor(
    private readonly parametros: ParametrosInmService,
    private readonly indices: IndicesInmService,
  ) {}

  @Get('parametros')
  @UseGuards(PermissionGuard)
  @RequirePermission('INMOBILIARIO', 'INM_CFG_PARAMETROS_VER')
  @ApiOperation({ summary: 'Parámetros del vertical; la fila nace con los valores por defecto' })
  obtenerParametros(@GetUser() user: LoginUserInfo) {
    return this.parametros.obtener(user.empresa_id);
  }

  @Patch('parametros')
  @UseGuards(PermissionGuard)
  @RequirePermission('INMOBILIARIO', 'INM_CFG_PARAMETROS_EDITAR')
  actualizarParametros(@Body(ValidationPipe) dto: UpdateParametrosDto, @GetUser() user: LoginUserInfo) {
    return this.parametros.actualizar(dto, user.empresa_id, user.id);
  }

  @Get('boleto/plantilla')
  @UseGuards(PermissionGuard)
  @RequirePermission('INMOBILIARIO', 'INM_CFG_PARAMETROS_VER')
  @ApiOperation({ summary: 'Plantilla modelo del boleto y las variables disponibles' })
  plantillaBoleto() {
    return { plantilla: PLANTILLA_BOLETO_DEFAULT, variables: VARIABLES_BOLETO };
  }

  @Get('indices')
  @UseGuards(PermissionGuard)
  @RequirePermission('INMOBILIARIO', 'INM_CFG_INDICE_VER')
  @ApiQuery({ name: 'tipo', required: false, enum: inm_indice_tipo })
  listarIndices(@GetUser() user: LoginUserInfo, @Query('tipo') tipo?: inm_indice_tipo) {
    return this.indices.listar(user.empresa_id, tipo);
  }

  @Post('indices')
  @UseGuards(PermissionGuard)
  @RequirePermission('INMOBILIARIO', 'INM_CFG_INDICE_CREAR')
  crearIndice(@Body(ValidationPipe) dto: CreateIndiceDto, @GetUser() user: LoginUserInfo) {
    return this.indices.crear(dto, user.empresa_id, user.id);
  }

  @Patch('indices/:id')
  @UseGuards(PermissionGuard)
  @RequirePermission('INMOBILIARIO', 'INM_CFG_INDICE_EDITAR')
  actualizarIndice(
    @Param('id', ParseUUIDPipe) id: string,
    @Body(ValidationPipe) dto: UpdateIndiceDto,
    @GetUser() user: LoginUserInfo,
  ) {
    return this.indices.actualizar(id, dto, user.empresa_id, user.id);
  }

  @Delete('indices/:id')
  @UseGuards(PermissionGuard)
  @RequirePermission('INMOBILIARIO', 'INM_CFG_INDICE_ELIMINAR')
  eliminarIndice(@Param('id', ParseUUIDPipe) id: string, @GetUser() user: LoginUserInfo) {
    return this.indices.eliminar(id, user.empresa_id, user.id);
  }
}
