import { Controller, Get, Param, 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 { GetUser } from 'src/auth/get-user.decorator';
import { MobileRendicionesService } from './mobile-rendiciones.service';

/**
 * Endpoints mobile-only para que el cobrador en ruta consulte el estado
 * de sus rendiciones. La creación sigue siendo POST /mobile/caja/rendir
 * (Submódulo Caja).
 */
@ApiTags('Mobile · Mis rendiciones')
@ApiBearerAuth()
@UseGuards(AuthGuard('jwt'))
@Controller({ path: 'mobile/rendiciones', version: '1' })
export class MobileRendicionesController {
  constructor(private readonly service: MobileRendicionesService) {}

  @Get('resumen-cobrador')
  @ApiOperation({ summary: 'KPIs del cobrador: pendientes, observadas, mes en curso' })
  resumen(@GetUser() user: LoginUserInfo) {
    return this.service.resumenCobrador(user.empresa_id, user.id);
  }

  @Get('pendientes-dias-anteriores')
  @ApiOperation({
    summary:
      'Recibos EMITIDOS sin rendir de días calendario anteriores (agrupados por día × moneda)',
  })
  pendientesDiasAnteriores(@GetUser() user: LoginUserInfo) {
    return this.service.pendientesDiasAnteriores(user.empresa_id, user.id);
  }

  @Get()
  @ApiOperation({ summary: 'Mis rendiciones (paginadas, con filtros opcionales)' })
  @ApiQuery({ name: 'estado', required: false, description: 'BORRADOR | PENDIENTE | APROBADO | OBSERVADO | RECHAZADO' })
  @ApiQuery({ name: 'fecha_desde', required: false, description: 'YYYY-MM-DD' })
  @ApiQuery({ name: 'fecha_hasta', required: false, description: 'YYYY-MM-DD' })
  @ApiQuery({ name: 'page', required: false, type: Number })
  @ApiQuery({ name: 'limit', required: false, type: Number })
  listar(
    @GetUser() user: LoginUserInfo,
    @Query('estado') estado?: string,
    @Query('fecha_desde') fecha_desde?: string,
    @Query('fecha_hasta') fecha_hasta?: string,
    @Query('page') page?: string,
    @Query('limit') limit?: string,
  ) {
    return this.service.listarMisRendiciones(user.empresa_id, user.id, {
      estado,
      fecha_desde,
      fecha_hasta,
      page: page ? parseInt(page) : 1,
      limit: limit ? parseInt(limit) : 20,
    });
  }

  @Get(':id')
  @ApiOperation({ summary: 'Detalle de una rendición propia, con historial y recibos' })
  detalle(@GetUser() user: LoginUserInfo, @Param('id') id: string) {
    return this.service.detalle(user.empresa_id, user.id, id);
  }
}
