import { Body, Controller, Get, Post, Query, UseGuards } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import { ApiBearerAuth, ApiOperation, ApiQuery, 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 { TipoCambioService } from '../services/tipo-cambio.service';

@ApiTags('Contabilidad - Tipo de Cambio')
@Controller({ path: 'contabilidad/tipo-cambio', version: '1' })
@UseGuards(AuthGuard('jwt'), PermissionGuard)
@ApiBearerAuth()
export class TipoCambioController {
  constructor(private readonly service: TipoCambioService) {}

  @Get()
  @RequirePermission('CONTABILIDAD', 'CONT_TC_TIPO_CAMBIO_VER')
  @ApiOperation({ summary: 'Listar tipos de cambio (últimos 90 días)' })
  @ApiQuery({ name: 'moneda', required: false })
  listar(@GetUser() user: LoginUserInfo, @Query('moneda') moneda?: string) {
    return this.service.listar(user.empresa_id, moneda);
  }

  @Get('vigente')
  @RequirePermission('CONTABILIDAD', 'CONT_TC_TIPO_CAMBIO_VER')
  @ApiOperation({ summary: 'Obtener TC vigente para una moneda en una fecha' })
  @ApiQuery({ name: 'moneda', required: true })
  @ApiQuery({ name: 'fecha', required: false, description: 'YYYY-MM-DD (default: hoy)' })
  async vigente(
    @GetUser() user: LoginUserInfo,
    @Query('moneda') moneda: string,
    @Query('fecha') fecha?: string,
  ) {
    return this.service.getVigente(user.empresa_id, moneda, fecha ? new Date(fecha) : new Date());
  }

  @Post()
  @RequirePermission('CONTABILIDAD', 'CONT_TC_TIPO_CAMBIO_CREAR')
  @ApiOperation({ summary: 'Registrar tipo de cambio del día' })
  registrar(
    @GetUser() user: LoginUserInfo,
    @Body() body: { moneda: string; fecha: string; tasa: number },
  ) {
    return this.service.registrar(user.empresa_id, body);
  }
}
