import { Body, Controller, Get, Post, Put, UseGuards } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import { ApiBearerAuth, ApiOperation, ApiTags } from '@nestjs/swagger';
import type { LoginUserInfo } from 'src/auth/dto/login.dto';
import { RequirePermission } from 'src/auth/decorators/require-permission.decorator';
import { GetUser } from 'src/auth/get-user.decorator';
import { PermissionGuard } from 'src/auth/guards/permission.guard';
import { MapeoCuentasService } from '../services/mapeo-cuentas.service';
import { MapeoMediosPagoService, type FlujoMedioPago } from '../services/mapeo-medios-pago.service';
import { ContabilidadSeedService } from '../services/seed.service';

@ApiTags('Contabilidad - Mapeo de Cuentas')
@Controller({ path: 'contabilidad/mapeo-cuentas', version: '1' })
@UseGuards(AuthGuard('jwt'), PermissionGuard)
@ApiBearerAuth()
export class MapeoCuentasController {
  constructor(
    private readonly service: MapeoCuentasService,
    private readonly mediosPago: MapeoMediosPagoService,
    private readonly seedService: ContabilidadSeedService,
  ) {}

  @Get()
  @RequirePermission('CONTABILIDAD', 'CONT_MAP_MAPEO_VER')
  @ApiOperation({ summary: 'Ver mapeo de conceptos del sistema a cuentas contables' })
  listar(@GetUser() user: LoginUserInfo) {
    return this.service.listar(user.empresa_id);
  }

  @Get('asientos-ejemplo')
  @RequirePermission('CONTABILIDAD', 'CONT_MAP_MAPEO_VER')
  @ApiOperation({ summary: 'Cómo queda el debe y el haber de cada asiento automático con el mapeo actual' })
  asientosEjemplo(@GetUser() user: LoginUserInfo) {
    return this.service.previsualizacionAsientos(user.empresa_id);
  }

  @Put()
  @RequirePermission('CONTABILIDAD', 'CONT_MAP_MAPEO_EDITAR')
  @ApiOperation({ summary: 'Actualizar mapeo (bulk): [{concepto, cuenta_id}]' })
  actualizar(
    @GetUser() user: LoginUserInfo,
    @Body() body: Array<{ concepto: string; cuenta_id: string }>,
  ) {
    return this.service.actualizarBulk(user.empresa_id, body);
  }

  @Get('medios-pago')
  @RequirePermission('CONTABILIDAD', 'CONT_MAP_MAPEO_VER')
  @ApiOperation({ summary: 'Cuenta contable elegida para cada medio de pago, al cobrar y al pagar' })
  listarMediosPago(@GetUser() user: LoginUserInfo) {
    return this.mediosPago.listar(user.empresa_id);
  }

  @Put('medios-pago')
  @RequirePermission('CONTABILIDAD', 'CONT_MAP_MAPEO_EDITAR')
  @ApiOperation({ summary: 'Actualizar cuentas por medio de pago (bulk): [{medio_pago_id, flujo, cuenta_id}]. cuenta_id null borra el mapeo.' })
  actualizarMediosPago(
    @GetUser() user: LoginUserInfo,
    @Body() body: Array<{ medio_pago_id: string; flujo: FlujoMedioPago; cuenta_id: string | null }>,
  ) {
    return this.mediosPago.actualizarBulk(user.empresa_id, body);
  }

  @Post('sembrar-faltantes')
  @RequirePermission('CONTABILIDAD', 'CONT_MAP_MAPEO_EDITAR')
  @ApiOperation({ summary: 'Crear mapeos default solo para conceptos que aún no están mapeados (no sobrescribe los existentes)' })
  sembrarFaltantes(@GetUser() user: LoginUserInfo) {
    return this.seedService.seedMapeoFaltantes(user.empresa_id);
  }
}
