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 { AbrirCajaDto } from 'src/tesoreria/dto/abrir-caja.dto';
import { CerrarCajaDto } from 'src/tesoreria/dto/cerrar-caja.dto';
import { IdempotencyInterceptor } from '../common/idempotency.interceptor';
import { RendirMobileDto } from './dto/rendir-mobile.dto';
import { MobileCajaService } from './mobile-caja.service';

/**
 * Caja del cobrador: apertura / cierre (sesiones_caja) y rendición.
 * Los POST son idempotentes (header Idempotency-Key).
 */
@ApiTags('Mobile · Caja')
@ApiBearerAuth()
@UseGuards(AuthGuard('jwt'))
@Controller({ path: 'mobile/caja', version: '1' })
export class MobileCajaController {
  constructor(private readonly caja: MobileCajaService) {}

  @Get('disponibles')
  @ApiOperation({ summary: 'Cajas de la empresa (para abrir), con flag de sesión abierta' })
  disponibles(@GetUser() user: LoginUserInfo) {
    return this.caja.disponibles(user.empresa_id);
  }

  @Get('actual')
  @ApiOperation({ summary: 'Sesión de caja abierta del cobrador (o null)' })
  actual(@GetUser() user: LoginUserInfo) {
    return this.caja.actual(user.empresa_id, user.id);
  }

  @Post('abrir')
  @UseInterceptors(IdempotencyInterceptor)
  @ApiHeader({ name: 'Idempotency-Key', required: true })
  @ApiOperation({ summary: 'Abrir caja (monto inicial)' })
  abrir(@GetUser() user: LoginUserInfo, @Body() dto: AbrirCajaDto) {
    return this.caja.abrir(dto, user.empresa_id, user.id);
  }

  @Post('cerrar/:sesion_id')
  @UseInterceptors(IdempotencyInterceptor)
  @ApiHeader({ name: 'Idempotency-Key', required: true })
  @ApiOperation({ summary: 'Cerrar caja (arqueo)' })
  cerrar(
    @GetUser() user: LoginUserInfo,
    @Param('sesion_id') sesionId: string,
    @Body() dto: CerrarCajaDto,
  ) {
    return this.caja.cerrar(sesionId, dto, user.empresa_id, user.id);
  }

  @Get('recibos-disponibles')
  @ApiOperation({ summary: 'Recibos del cobrador aún no rendidos (para la rendición)' })
  @ApiQuery({ name: 'fecha', required: false, description: 'YYYY-MM-DD' })
  @ApiQuery({ name: 'moneda_id', required: false })
  recibosDisponibles(
    @GetUser() user: LoginUserInfo,
    @Query('fecha') fecha?: string,
    @Query('moneda_id') monedaId?: string,
  ) {
    return this.caja.recibosDisponibles(user.empresa_id, user.id, fecha, monedaId);
  }

  @Post('rendir')
  @UseInterceptors(IdempotencyInterceptor)
  @ApiHeader({ name: 'Idempotency-Key', required: true })
  @ApiOperation({ summary: 'Rendir la cobranza del día' })
  rendir(@GetUser() user: LoginUserInfo, @Body() dto: RendirMobileDto) {
    return this.caja.rendir(user.empresa_id, user.id, dto);
  }
}
