import {
  Body,
  Controller,
  Get,
  Param,
  Post,
  Query,
  UseGuards,
} from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import { GetUser } from 'src/auth/get-user.decorator';
import type { LoginUserInfo } from 'src/auth/dto/login.dto';
import { RequireModule } from 'src/auth/decorators/require-module.decorator';
import { RequirePermission } from 'src/auth/decorators/require-permission.decorator';
import { ModuleGuard } from 'src/auth/guards/module.guard';
import { PermissionGuard } from 'src/auth/guards/permission.guard';
import { BancardVposService } from './bancard.service';
import { InitPaymentDto } from './dto/init-payment.dto';

@Controller('bancard')
@UseGuards(AuthGuard('jwt'), ModuleGuard, PermissionGuard)
@RequireModule('FISCAL')
export class BancardController {
  constructor(private readonly bancardService: BancardVposService) {}

  @Post('init')
  @RequirePermission('FISCAL', 'FIS_BAN_BANCARD_VER')
  initPayment(@Body() dto: InitPaymentDto, @GetUser() user: LoginUserInfo) {
    return this.bancardService.initPayment({
      empresaId: user.empresa_id,
      monto: dto.monto,
      moneda: dto.moneda ?? 'PYG',
      descripcion: dto.descripcion,
      clienteId: dto.clienteId,
      usuarioId: user.id,
      origenModulo: dto.origenModulo,
      origenId: dto.origenId,
    });
  }

  @Get('pagos')
  @RequirePermission('FISCAL', 'FIS_BAN_BANCARD_VER')
  getPagos(
    @GetUser() user: LoginUserInfo,
    @Query('page') page = '1',
    @Query('limit') limit = '20',
  ) {
    return this.bancardService.getPagosByEmpresa(user.empresa_id, +page, +limit);
  }

  @Post('rollback/:shopProcessId')
  @RequirePermission('FISCAL', 'FIS_BAN_BANCARD_VER')
  rollback(@Param('shopProcessId') shopProcessId: string, @GetUser() user: LoginUserInfo) {
    return this.bancardService.rollback(BigInt(shopProcessId), user.empresa_id);
  }

  @Post('refund/:pagoId')
  @RequirePermission('FISCAL', 'FIS_BAN_BANCARD_VER')
  refund(
    @Param('pagoId') pagoId: string,
    @Body('monto') monto: number | undefined,
    @GetUser() user: LoginUserInfo,
  ) {
    return this.bancardService.refund(pagoId, user.empresa_id, monto);
  }
}
