import {
  BadRequestException, Body, Controller, Post, UploadedFile, UseGuards, UseInterceptors, ValidationPipe,
} from '@nestjs/common';
import { FileInterceptor } from '@nestjs/platform-express';
import { AuthGuard } from '@nestjs/passport';
import { ApiBearerAuth, ApiBody, ApiConsumes, ApiOperation, 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 { ImportarLeadsDto } from './dto/importar-leads.dto';
import { LeadsImportService } from './leads-import.service';

const LIMITE_ARCHIVO = { limits: { fileSize: 10 * 1024 * 1024 } };

const CUERPO_MULTIPART = {
  schema: {
    type: 'object',
    properties: {
      archivo: { type: 'string', format: 'binary' },
      mapeo: { type: 'string', example: '{"nombre":"Nombre y Apellido","telefono":"Celular"}' },
      origen_id: { type: 'string' },
      sucursal_id: { type: 'string' },
    },
  },
};

@ApiTags('CRM · Importación de leads')
@ApiBearerAuth()
@UseGuards(AuthGuard('jwt'), SubmoduloGuard)
@RequireSubmodulo('CRM_LEADS')
@Controller({ path: 'crm/leads/importar', version: '1' })
export class LeadsImportController {
  constructor(private readonly service: LeadsImportService) {}

  @Post('preview')
  @UseGuards(PermissionGuard)
  @RequirePermission('CRM', 'CRM_LEA_LEAD_IMPORTAR')
  @UseInterceptors(FileInterceptor('archivo', LIMITE_ARCHIVO))
  @ApiConsumes('multipart/form-data')
  @ApiBody({ schema: { type: 'object', properties: { archivo: { type: 'string', format: 'binary' } } } })
  @ApiOperation({
    summary: 'Lee la planilla y devuelve el mapeo sugerido y el diagnóstico por fila',
    description: 'No escribe nada. Sirve para confirmar el mapeo de columnas antes de importar.',
  })
  preview(@UploadedFile() file: Express.Multer.File, @GetUser() user: LoginUserInfo) {
    if (!file) throw new BadRequestException('Falta el archivo (campo "archivo")');
    return this.service.preview(file, user.empresa_id);
  }

  @Post()
  @UseGuards(PermissionGuard)
  @RequirePermission('CRM', 'CRM_LEA_LEAD_IMPORTAR')
  @UseInterceptors(FileInterceptor('archivo', LIMITE_ARCHIVO))
  @ApiConsumes('multipart/form-data')
  @ApiBody(CUERPO_MULTIPART)
  @ApiOperation({
    summary: 'Importa la planilla con el mapeo confirmado',
    description:
      'Devuelve el reporte completo de duplicados y errores. Una fila con problemas no cancela ' +
      'la importación: las demás entran igual.',
  })
  importar(
    @UploadedFile() file: Express.Multer.File,
    @Body(new ValidationPipe({ transform: true, whitelist: true })) dto: ImportarLeadsDto,
    @GetUser() user: LoginUserInfo,
  ) {
    if (!file) throw new BadRequestException('Falta el archivo (campo "archivo")');
    return this.service.importar(file, dto, user.empresa_id, user.id);
  }
}
