import { Controller, Get, Param, Post, Query, UseGuards } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import { ApiBearerAuth, ApiOperation, ApiQuery, ApiTags } from '@nestjs/swagger';
import { GetUser } from 'src/auth/get-user.decorator';
import type { LoginUserInfo } from 'src/auth/dto/login.dto';
import { RequireModule, RequirePermission } from 'src/auth/decorators';
import { ModuleGuard } from 'src/auth/guards/module.guard';
import { PermissionGuard } from 'src/auth/guards/permission.guard';
import { EcommercePagosService } from './ecommerce-pagos.service';

@ApiTags('ecommerce-pagos')
@ApiBearerAuth()
@UseGuards(AuthGuard('jwt'), ModuleGuard, PermissionGuard)
@RequireModule('ECOMMERCE')
@Controller({ path: 'ecommerce/pagos', version: '1' })
export class EcommercePagosController {
  constructor(private readonly service: EcommercePagosService) {}

  @Get()
  @RequirePermission('ECOMMERCE', 'EC_PAG_PAGO_VER')
  @ApiOperation({ summary: 'Pagos de la tienda: listado, resumen y estado del gateway' })
  @ApiQuery({ name: 'estado', required: false })
  @ApiQuery({ name: 'metodo', required: false })
  @ApiQuery({ name: 'q', required: false })
  list(
    @GetUser() user: LoginUserInfo,
    @Query('estado') estado?: string,
    @Query('metodo') metodo?: string,
    @Query('q') q?: string,
  ) {
    return this.service.list(user.empresa_id, { estado, metodo, q });
  }

  @Get('webhooks')
  @RequirePermission('ECOMMERCE', 'EC_PAG_PAGO_VER')
  @ApiOperation({ summary: 'Últimos webhooks recibidos del gateway (diagnóstico)' })
  webhooks(@GetUser() user: LoginUserInfo) {
    return this.service.webhooks(user.empresa_id);
  }

  // Sincronizar NO es una consulta inocua: si el gateway devuelve el pago
  // aprobado, confirma el pedido → crea el pedido ERP y reserva stock. Por eso
  // lleva permiso propio y no alcanza con EC_PAG_PAGO_VER.
  @Post(':id/sincronizar')
  @RequirePermission('ECOMMERCE', 'EC_PAG_PAGO_SINCRONIZAR')
  @ApiOperation({
    summary: 'Reconciliar un pago contra el gateway (si aprueba: crea pedido ERP y reserva stock)',
  })
  sincronizar(@Param('id') id: string, @GetUser() user: LoginUserInfo) {
    return this.service.sincronizar(user.empresa_id, id);
  }
}
