import {
  Body,
  Controller,
  Get,
  Param,
  Post,
  UploadedFile,
  UseGuards,
  UseInterceptors,
} from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import { FileInterceptor } from '@nestjs/platform-express';
import { ApiBearerAuth, ApiBody, ApiConsumes, ApiOperation, ApiTags } from '@nestjs/swagger';
import type { LoginUserInfo } from '../../auth/dto/login.dto';
import { RequireModule, RequirePermission } from '../../auth/decorators';
import { ModuleGuard } from '../../auth/guards/module.guard';
import { PermissionGuard } from '../../auth/guards/permission.guard';
import { GetUser } from '../../auth/get-user.decorator';
import { ConfirmarImportacionDto } from '../dto/importar-cartera.dto';
import { ImportadorService } from './importador.service';

@ApiTags('Cartera Inteligente — Importador')
@ApiBearerAuth()
@UseGuards(AuthGuard('jwt'), ModuleGuard, PermissionGuard)
@RequireModule('COBRANZAS')
@Controller({ path: 'cartera/import', version: '1' })
export class ImportadorController {
  constructor(private readonly service: ImportadorService) {}

  @Post('subir')
  @RequirePermission('COBRANZAS', 'COB_CART_CONFIGURAR')
  @UseInterceptors(FileInterceptor('archivo', { limits: { fileSize: 10 * 1024 * 1024 } }))
  @ApiConsumes('multipart/form-data')
  @ApiBody({
    schema: {
      type: 'object',
      properties: { archivo: { type: 'string', format: 'binary' } },
    },
  })
  @ApiOperation({
    summary: 'Subir Excel/CSV — devuelve preview + mapeo sugerido',
  })
  subir(
    @UploadedFile() file: { originalname: string; buffer: Buffer; size: number },
    @GetUser() user: LoginUserInfo,
  ) {
    return this.service.subirArchivo(user.empresa_id, user.id, file);
  }

  @Post(':jobId/confirmar')
  @RequirePermission('COBRANZAS', 'COB_CART_CONFIGURAR')
  @ApiOperation({ summary: 'Confirmar import con el mapeo seleccionado' })
  confirmar(
    @Param('jobId') jobId: string,
    @Body() dto: ConfirmarImportacionDto,
    @GetUser() user: LoginUserInfo,
  ) {
    return this.service.confirmar(user.empresa_id, jobId, dto.mapeo);
  }

  @Get('jobs')
  @RequirePermission('COBRANZAS', 'COB_CART_VER')
  @ApiOperation({ summary: 'Listar imports recientes del tenant' })
  jobs(@GetUser() user: LoginUserInfo) {
    return this.service.listarJobs(user.empresa_id);
  }
}
