import {
  Body,
  Controller,
  Get,
  Param,
  Patch,
  Post,
  Query,
  Res,
  UseGuards,
} from '@nestjs/common';
import type { Response } from 'express';
import { AuthGuard } from '@nestjs/passport';
import { ApiBearerAuth, ApiOperation, ApiTags } from '@nestjs/swagger';
import type { LoginUserInfo } from 'src/auth/dto/login.dto';
import { GetUser } from 'src/auth/get-user.decorator';
import { RequireModule, RequirePermission } from 'src/auth/decorators';
import { ModuleGuard } from 'src/auth/guards/module.guard';
import { PermissionGuard } from 'src/auth/guards/permission.guard';
import {
  CreateGestionMoraDto,
  QueryGestionMoraDto,
  TransicionEstadoDto,
} from './dto/gestion-mora.dto';
import { GestionMoraService } from './gestion-mora.service';

@ApiTags('Gestión de Mora')
@ApiBearerAuth()
@UseGuards(AuthGuard('jwt'), ModuleGuard, PermissionGuard)
@RequireModule('COBRANZAS')
@Controller({ path: 'gestion-mora', version: '1' })
export class GestionMoraController {
  constructor(private readonly service: GestionMoraService) {}

  @Post()
  @RequirePermission('COBRANZAS', 'COB_GMR_GESTION_MORA_REGISTRAR')
  @ApiOperation({ summary: 'Registrar nueva gestión de mora' })
  create(@Body() dto: CreateGestionMoraDto, @GetUser() user: LoginUserInfo) {
    return this.service.create(dto, user.empresa_id, user.id);
  }

  @Get()
  @RequirePermission('COBRANZAS', 'COB_GMR_GESTION_MORA_VER')
  @ApiOperation({ summary: 'Listar gestiones de mora' })
  findAll(@Query() query: QueryGestionMoraDto, @GetUser() user: LoginUserInfo) {
    return this.service.findAll(user.empresa_id, query);
  }

  @Get('export.csv')
  @RequirePermission('COBRANZAS', 'COB_GMR_EXPORTAR')
  @ApiOperation({ summary: 'Exportar gestiones de mora a CSV (Excel)' })
  async exportCsv(
    @Query() query: QueryGestionMoraDto,
    @GetUser() user: LoginUserInfo,
    @Res() res: Response,
  ) {
    const csv = await this.service.exportCsv(user.empresa_id, query);
    res.setHeader('Content-Type', 'text/csv; charset=utf-8');
    res.setHeader(
      'Content-Disposition',
      `attachment; filename="gestion-mora-${new Date().toISOString().slice(0, 10)}.csv"`,
    );
    res.send(csv);
  }

  @Get('dashboard')
  @RequirePermission('COBRANZAS', 'COB_GMR_GESTION_MORA_VER')
  @ApiOperation({ summary: 'Dashboard: totales por estado y monto involucrado' })
  dashboard(@GetUser() user: LoginUserInfo) {
    return this.service.dashboard(user.empresa_id);
  }

  @Get('cliente/:clienteId')
  @RequirePermission('COBRANZAS', 'COB_GMR_GESTION_MORA_VER')
  @ApiOperation({ summary: 'Gestión activa + timeline de gestiones de un cliente' })
  byCliente(@Param('clienteId') clienteId: string, @GetUser() user: LoginUserInfo) {
    return this.service.getByCliente(clienteId, user.empresa_id);
  }

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

  @Get(':id/historial')
  @RequirePermission('COBRANZAS', 'COB_GMR_GESTION_MORA_VER')
  @ApiOperation({ summary: 'Historial de transiciones de la gestión de mora' })
  historial(@Param('id') id: string, @GetUser() user: LoginUserInfo) {
    return this.service.getHistorial(id, user.empresa_id);
  }

  @Get(':id/pdf')
  @RequirePermission('COBRANZAS', 'COB_GMR_EXPORTAR')
  @ApiOperation({ summary: 'Generar PDF del expediente de gestión de mora' })
  async pdf(
    @Param('id') id: string,
    @Query('tipo') tipo: 'view' | 'base64' = 'view',
    @GetUser() user: LoginUserInfo,
    @Res() res: Response,
  ) {
    const result = await this.service.generateExpedientePdf(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="expediente-gestion-mora-${id}.pdf"`);
    res.send(result.pdfBuffer);
  }

  @Patch(':id/transicionar')
  @RequirePermission('COBRANZAS', 'COB_GMR_GESTION_MORA_REGISTRAR')
  @ApiOperation({ summary: 'Transicionar estado de gestión de mora' })
  transicionar(
    @Param('id') id: string,
    @Body() dto: TransicionEstadoDto,
    @GetUser() user: LoginUserInfo,
  ) {
    return this.service.transicionar(id, dto, user.empresa_id, user.id);
  }
}
