import { Body, Controller, Get, Param, Post, Query, UseGuards } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import { ApiBearerAuth, ApiBody, ApiParam, ApiQuery } from '@nestjs/swagger';
import type { LoginUserInfo } from 'src/auth/dto/login.dto';
import { GetUser } from 'src/auth/get-user.decorator';
import { AutorizacionesCajaService } from './autorizaciones-caja.service';
import { CrearAutorizacionDto } from './dto/crear-autorizacion.dto';
import { AprobarAutorizacionDto, RechazarAutorizacionDto } from './dto/resolver-autorizacion.dto';

@Controller({ path: 'autorizaciones-caja', version: '1' })
export class AutorizacionesCajaController {
  constructor(private readonly service: AutorizacionesCajaService) {}

  @UseGuards(AuthGuard('jwt'))
  @ApiBearerAuth()
  @ApiBody({ type: CrearAutorizacionDto })
  @Post('solicitar')
  solicitar(@Body() dto: CrearAutorizacionDto, @GetUser() user: LoginUserInfo) {
    return this.service.solicitar(dto, user.empresa_id, user.id);
  }

  @UseGuards(AuthGuard('jwt'))
  @ApiBearerAuth()
  @ApiParam({ name: 'id', description: 'ID de la autorización' })
  @ApiBody({ type: AprobarAutorizacionDto })
  @Post(':id/aprobar')
  aprobar(
    @Param('id') id: string,
    @Body() dto: AprobarAutorizacionDto,
    @GetUser() user: LoginUserInfo,
  ) {
    return this.service.aprobar(id, user.id, dto.pin, user.empresa_id);
  }

  @UseGuards(AuthGuard('jwt'))
  @ApiBearerAuth()
  @ApiParam({ name: 'id', description: 'ID de la autorización' })
  @ApiBody({ type: RechazarAutorizacionDto })
  @Post(':id/rechazar')
  rechazar(
    @Param('id') id: string,
    @Body() dto: RechazarAutorizacionDto,
    @GetUser() user: LoginUserInfo,
  ) {
    return this.service.rechazar(id, user.id, dto.motivo, user.empresa_id);
  }

  @UseGuards(AuthGuard('jwt'))
  @ApiBearerAuth()
  @Get('pendientes')
  getPendientes(@GetUser() user: LoginUserInfo) {
    return this.service.getPendientes(user.empresa_id);
  }

  @UseGuards(AuthGuard('jwt'))
  @ApiBearerAuth()
  @ApiQuery({ name: 'page', required: false })
  @ApiQuery({ name: 'limit', required: false })
  @Get('historial')
  getHistorial(
    @GetUser() user: LoginUserInfo,
    @Query('page') page?: string,
    @Query('limit') limit?: string,
  ) {
    return this.service.getHistorial(user.empresa_id, Number(page) || 1, Number(limit) || 20);
  }

  @UseGuards(AuthGuard('jwt'))
  @ApiBearerAuth()
  @Post('validar-token')
  validarToken(@Body('token') token: string) {
    return this.service.validarToken(token);
  }
}
