import {
  Body,
  Controller,
  Get,
  Param,
  Post,
  Query,
  UseGuards,
  UseInterceptors,
} from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import { ApiBearerAuth, ApiHeader, ApiOperation, ApiQuery, ApiTags } from '@nestjs/swagger';
import type { LoginUserInfo } from 'src/auth/dto/login.dto';
import { GetUser } from 'src/auth/get-user.decorator';
import { PreviewDistribucionDto } from 'src/cobros/dto/create-cobro.dto';
import { IdempotencyInterceptor } from '../common/idempotency.interceptor';
import { CrearCobroMobileDto } from './dto/crear-cobro-mobile.dto';
import { CrearDesdeDistribucionMobileDto } from './dto/crear-desde-distribucion-mobile.dto';
import { MobileCobrosService } from './mobile-cobros.service';

@ApiTags('Mobile · Cobros')
@ApiBearerAuth()
@UseGuards(AuthGuard('jwt'))
@Controller({ path: 'mobile/cobros', version: '1' })
export class MobileCobrosController {
  constructor(private readonly cobros: MobileCobrosService) {}

  @Post()
  @UseInterceptors(IdempotencyInterceptor)
  @ApiHeader({ name: 'Idempotency-Key', required: true, description: 'UUID v4 generado por la app' })
  @ApiOperation({ summary: 'Registrar un cobro (idempotente). Devuelve datos para imprimir.' })
  crear(@GetUser() user: LoginUserInfo, @Body() dto: CrearCobroMobileDto) {
    return this.cobros.crear(user.empresa_id, user.id, dto);
  }

  @Get('mios')
  @ApiOperation({ summary: 'Mis cobros en un rango de fechas' })
  @ApiQuery({ name: 'desde', required: false })
  @ApiQuery({ name: 'hasta', required: false })
  mios(
    @GetUser() user: LoginUserInfo,
    @Query('desde') desde?: string,
    @Query('hasta') hasta?: string,
  ) {
    return this.cobros.mios(user.empresa_id, user.id, desde, hasta);
  }

  @Post('preview-distribucion')
  @ApiOperation({ summary: 'Preview de distribución automática (sin persistir)' })
  previewDistribucion(@GetUser() user: LoginUserInfo, @Body() dto: PreviewDistribucionDto) {
    return this.cobros.previewDistribucion(user.empresa_id, dto);
  }

  @Post('crear-desde-distribucion')
  @UseInterceptors(IdempotencyInterceptor)
  @ApiHeader({ name: 'Idempotency-Key', required: true })
  @ApiOperation({ summary: 'Crear cobro a partir de la distribución (sin pagos parciales libres)' })
  crearDesdeDistribucion(
    @GetUser() user: LoginUserInfo,
    @Body() dto: CrearDesdeDistribucionMobileDto,
  ) {
    return this.cobros.crearDesdeDistribucion(user.empresa_id, user.id, dto);
  }

  @Get('medios-pago')
  @ApiOperation({ summary: 'Medios de pago activos para la empresa' })
  mediosPago(@GetUser() user: LoginUserInfo) {
    return this.cobros.mediosPago(user.empresa_id);
  }

  @Get('factura/:facturaId/descuento-activo')
  @ApiOperation({ summary: 'Descuento autorizado vigente para una factura (o null)' })
  descuentoActivo(@GetUser() user: LoginUserInfo, @Param('facturaId') facturaId: string) {
    return this.cobros.getDescuentoActivoFactura(facturaId, user.id, user.empresa_id);
  }

  @Get('bancos')
  @ApiOperation({ summary: 'Bancos de la empresa (cheque / transferencia)' })
  bancos(@GetUser() user: LoginUserInfo) {
    return this.cobros.bancos(user.empresa_id);
  }

  @Get('cliente/:clienteId/cuotas')
  @ApiOperation({ summary: 'Cuotas pendientes del cliente (con factura_cuota_id para imputar)' })
  cuotas(@GetUser() user: LoginUserInfo, @Param('clienteId') clienteId: string) {
    return this.cobros.cuotasPendientes(clienteId, user.empresa_id);
  }

  @Get(':id/recibo-data')
  @ApiOperation({ summary: 'Datos del recibo para reimprimir (ESC/POS)' })
  reciboData(@Param('id') id: string, @GetUser() user: LoginUserInfo) {
    return this.cobros.reciboData(id, user.empresa_id);
  }
}
