import {
  Body,
  Controller,
  Get,
  Param,
  Patch,
  Post,
  Query,
  Res,
  UseGuards,
} from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import { ApiBearerAuth, ApiOperation, ApiTags } from '@nestjs/swagger';
import type { Response } from 'express';
import { RequireModule, RequirePermission } from 'src/auth/decorators';
import type { LoginUserInfo } from 'src/auth/dto/login.dto';
import { GetUser } from 'src/auth/get-user.decorator';
import { ModuleGuard } from 'src/auth/guards/module.guard';
import { PermissionGuard } from 'src/auth/guards/permission.guard';
import {
  AnularRefinanciacionDto,
  CreateRefinanciacionDto,
  EjecutarRefinanciacionDto,
  QueryRefinanciacionesDto,
  SimularRefinanciacionDto,
} from './dto/refinanciacion.dto';
import { RefinanciacionesService } from './refinanciaciones.service';

@ApiTags('Refinanciaciones')
@ApiBearerAuth()
@UseGuards(AuthGuard('jwt'), ModuleGuard, PermissionGuard)
@RequireModule('COBRANZAS')
@Controller({ path: 'refinanciaciones', version: '1' })
export class RefinanciacionesController {
  constructor(private readonly service: RefinanciacionesService) {}

  @Post('simular')
  @RequirePermission('COBRANZAS', 'COB_REF_REFINANCIACION_CREAR')
  @ApiOperation({ summary: 'Simular cuotas propuestas sin guardar' })
  simular(@Body() dto: SimularRefinanciacionDto, @GetUser() user: LoginUserInfo) {
    return this.service.simular(dto, user.empresa_id);
  }

  @Post()
  @RequirePermission('COBRANZAS', 'COB_REF_REFINANCIACION_CREAR')
  @ApiOperation({ summary: 'Crear borrador de refinanciación' })
  create(@Body() dto: CreateRefinanciacionDto, @GetUser() user: LoginUserInfo) {
    return this.service.create(dto, user.empresa_id, user.id);
  }

  @Get()
  @RequirePermission('COBRANZAS', 'COB_REF_REFINANCIACION_VER')
  @ApiOperation({ summary: 'Listar refinanciaciones' })
  findAll(@Query() query: QueryRefinanciacionesDto, @GetUser() user: LoginUserInfo) {
    return this.service.findAll(user.empresa_id, query);
  }

  @Get(':id')
  @RequirePermission('COBRANZAS', 'COB_REF_REFINANCIACION_VER')
  @ApiOperation({ summary: 'Obtener refinanciación por ID' })
  findOne(@Param('id') id: string, @GetUser() user: LoginUserInfo) {
    return this.service.findOne(id, user.empresa_id);
  }

  @Patch(':id/ejecutar')
  @RequirePermission('COBRANZAS', 'COB_REF_REFINANCIACION_APROBAR')
  @ApiOperation({ summary: 'Ejecutar refinanciación (marca cuotas viejas + crea nueva solicitud)' })
  ejecutar(
    @Param('id') id: string,
    @Body() dto: EjecutarRefinanciacionDto,
    @GetUser() user: LoginUserInfo,
  ) {
    return this.service.ejecutar(id, dto, user.empresa_id, user.id);
  }

  @Patch(':id/anular')
  @RequirePermission('COBRANZAS', 'COB_REF_REFINANCIACION_ANULAR')
  @ApiOperation({ summary: 'Anular refinanciación (solo borrador o aceptada)' })
  anular(
    @Param('id') id: string,
    @Body() dto: AnularRefinanciacionDto,
    @GetUser() user: LoginUserInfo,
  ) {
    return this.service.anular(id, dto, user.empresa_id, user.id);
  }

  @Get(':id/pdf')
  @RequirePermission('COBRANZAS', 'COB_REF_REPORTE')
  @ApiOperation({ summary: 'Generar PDF del acuerdo de refinanciación' })
  async pdf(
    @Param('id') id: string,
    @Query('tipo') tipo: 'view' | 'base64' = 'view',
    @GetUser() user: LoginUserInfo,
    @Res() res: Response,
  ) {
    const result = await this.service.generatePdf(id, user.empresa_id, { tipo_retorno: tipo });
    if (tipo === 'base64') {
      res.status(200).json({ status: 'success', pdf_base64: result.base64 });
      return;
    }
    res.setHeader('Content-Type', 'application/pdf');
    res.setHeader(
      'Content-Disposition',
      `inline; filename="acuerdo-refinanciacion-${id}.pdf"`,
    );
    res.send(result.pdfBuffer);
  }
}
