import { Controller, Get, Query, UseGuards } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import { ApiBearerAuth, ApiOperation, ApiQuery, ApiTags } from '@nestjs/swagger';
import { RequireModule } from 'src/auth/decorators/require-module.decorator';
import { RequirePermission } from 'src/auth/decorators/require-permission.decorator';
import type { LoginUserInfo } from 'src/auth/dto/login.dto';
import { GetUser } from 'src/auth/get-user.decorator';
import { ModuleGuard } from 'src/auth/guards/module.guard';
import { PermissionGuard } from 'src/auth/guards/permission.guard';
import {
  AgruparPor,
  EstadoFacturacion,
  FiltrosReporteRemision,
  ReportesRemisionService,
} from './reportes-remision.service';

const AGRUPACIONES: AgruparPor[] = ['chofer', 'transportista', 'vehiculo', 'cliente', 'destino', 'motivo', 'estado'];

@ApiTags('Reportes de Remisión')
@ApiBearerAuth()
@UseGuards(AuthGuard('jwt'), ModuleGuard, PermissionGuard)
@RequireModule('VENTAS')
@Controller({ path: 'reportes-remision', version: '1' })
export class ReportesRemisionController {
  constructor(private readonly service: ReportesRemisionService) {}

  @Get('resumen')
  @RequirePermission('VENTAS', 'VEN_NR_NOTA_REMISION_VER')
  @ApiOperation({ summary: 'Resumen de traslados agrupado por dimensión + KPIs' })
  @ApiQuery({ name: 'fecha_desde', required: false })
  @ApiQuery({ name: 'fecha_hasta', required: false })
  @ApiQuery({ name: 'agrupar_por', required: false, enum: AGRUPACIONES })
  @ApiQuery({ name: 'estado', required: false })
  @ApiQuery({ name: 'estado_sifen', required: false })
  @ApiQuery({ name: 'cliente_id', required: false })
  @ApiQuery({ name: 'transportista_id', required: false })
  @ApiQuery({ name: 'chofer_id', required: false })
  @ApiQuery({ name: 'vehiculo_id', required: false })
  @ApiQuery({ name: 'motivo_id', required: false })
  @ApiQuery({ name: 'facturacion', required: false, enum: ['sin_facturar', 'parcial', 'facturada'] })
  getResumen(@GetUser() user: LoginUserInfo, @Query('agrupar_por') agruparPor?: string, @Query() query?: Record<string, string>) {
    const dim: AgruparPor = AGRUPACIONES.includes(agruparPor as AgruparPor) ? (agruparPor as AgruparPor) : 'chofer';
    return this.service.getResumen(user.empresa_id, dim, this.filtros(query), user.id);
  }

  @Get('detalle')
  @RequirePermission('VENTAS', 'VEN_NR_NOTA_REMISION_VER')
  @ApiOperation({ summary: 'Detalle de remisiones (una fila por remisión, paginado)' })
  getDetalle(
    @GetUser() user: LoginUserInfo,
    @Query() query: Record<string, string>,
    @Query('page') page?: string,
    @Query('pageSize') pageSize?: string,
  ) {
    return this.service.getDetalle(user.empresa_id, this.filtros(query), Number(page) || 1, Number(pageSize) || 20, user.id);
  }

  @Get('pendientes-facturar')
  @RequirePermission('VENTAS', 'VEN_NR_NOTA_REMISION_VER')
  @ApiOperation({ summary: 'Remisiones aprobadas sin factura con saldo, agrupadas por cliente' })
  @ApiQuery({ name: 'fecha_desde', required: false })
  @ApiQuery({ name: 'fecha_hasta', required: false })
  @ApiQuery({ name: 'cliente_id', required: false })
  @ApiQuery({ name: 'dias_min', required: false })
  getPendientesFacturar(@GetUser() user: LoginUserInfo, @Query() query: Record<string, string> = {}) {
    return this.service.getPendientesFacturar(user.empresa_id, {
      fecha_desde: query.fecha_desde || undefined,
      fecha_hasta: query.fecha_hasta || undefined,
      cliente_id: query.cliente_id || undefined,
      dias_min: query.dias_min ? Number(query.dias_min) : undefined,
    });
  }

  private filtros(query: Record<string, string> = {}): FiltrosReporteRemision {
    const fac = query.facturacion as EstadoFacturacion;
    return {
      fecha_desde: query.fecha_desde || undefined,
      fecha_hasta: query.fecha_hasta || undefined,
      estado: query.estado || undefined,
      estado_sifen: query.estado_sifen || undefined,
      cliente_id: query.cliente_id || undefined,
      transportista_id: query.transportista_id || undefined,
      chofer_id: query.chofer_id || undefined,
      vehiculo_id: query.vehiculo_id || undefined,
      motivo_id: query.motivo_id || undefined,
      facturacion: ['sin_facturar', 'parcial', 'facturada'].includes(fac) ? fac : undefined,
    };
  }
}
