import { Body, Controller, Delete, Get, Param, Post, 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 { CreateNotaRemisionDto } from './dto/create-nota-remision.dto';
import { NotaRemisionService } from './nota-remision.service';

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

  @Post()
  @RequirePermission('VENTAS', 'VEN_NR_NOTA_REMISION_CREAR')
  @ApiOperation({ summary: 'Crear nota de remisión' })
  create(@Body() dto: CreateNotaRemisionDto, @GetUser() user: LoginUserInfo) {
    return this.service.create(dto, user.empresa_id, user.username, user.id);
  }

  @Get('resumen')
  @RequirePermission('VENTAS', 'VEN_NR_NOTA_REMISION_VER')
  @ApiOperation({ summary: 'Resumen/KPIs de notas de remisión' })
  getResumen(
    @GetUser() user: LoginUserInfo,
    @Query('search') search?: string,
    @Query('estado') estado?: string,
    @Query('estado_sifen') estadoSifen?: string,
    @Query('fechaDesde') fechaDesde?: string,
    @Query('fechaHasta') fechaHasta?: string,
    @Query('transportista_id') transportistaId?: string,
    @Query('chofer_id') choferId?: string,
    @Query('vehiculo_id') vehiculoId?: string,
    @Query('agente_id') agenteId?: string,
  ) {
    return this.service.getResumen(user.empresa_id, {
      search, estado, estado_sifen: estadoSifen,
      fechaDesde, fechaHasta,
      transportista_id: transportistaId, chofer_id: choferId,
      vehiculo_id: vehiculoId, agente_id: agenteId,
      usuarioId: user.id,
    });
  }

  @Get()
  @RequirePermission('VENTAS', 'VEN_NR_NOTA_REMISION_VER')
  @ApiQuery({ name: 'page', required: false })
  @ApiQuery({ name: 'limit', required: false })
  @ApiQuery({ name: 'search', required: false })
  @ApiQuery({ name: 'estado', required: false, enum: ['Pendiente', 'Aprobado', 'Rechazado', 'Anulado'] })
  @ApiQuery({ name: 'estado_sifen', required: false })
  @ApiQuery({ name: 'fechaDesde', required: false })
  @ApiQuery({ name: 'fechaHasta', 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: 'agente_id', required: false })
  findAll(
    @GetUser() user: LoginUserInfo,
    @Query('page') page?: string,
    @Query('limit') limit?: string,
    @Query('search') search?: string,
    @Query('estado') estado?: string,
    @Query('estado_sifen') estadoSifen?: string,
    @Query('fechaDesde') fechaDesde?: string,
    @Query('fechaHasta') fechaHasta?: string,
    @Query('cliente_id') clienteId?: string,
    @Query('transportista_id') transportistaId?: string,
    @Query('chofer_id') choferId?: string,
    @Query('vehiculo_id') vehiculoId?: string,
    @Query('agente_id') agenteId?: string,
  ) {
    return this.service.findAll(user.empresa_id, Number(page) || 1, Number(limit) || 20, {
      search, estado, estado_sifen: estadoSifen,
      fechaDesde, fechaHasta,
      cliente_id: clienteId, transportista_id: transportistaId,
      chofer_id: choferId, vehiculo_id: vehiculoId, agente_id: agenteId,
      usuarioId: user.id,
    });
  }

  @Post('sifen/sincronizar')
  @RequirePermission('VENTAS', 'VEN_NR_NOTA_REMISION_VER')
  @ApiOperation({ summary: 'Consultar y actualizar estado SIFEN de remisiones pendientes' })
  sincronizarSifen(@GetUser() user: LoginUserInfo) {
    return this.service.sincronizarSifen(user.empresa_id);
  }

  @Get('por-factura/:facturaId')
  @RequirePermission('VENTAS', 'VEN_NR_NOTA_REMISION_VER')
  @ApiOperation({ summary: 'Remisiones vinculadas a una factura (1 factura → N remisiones)' })
  findByFactura(@Param('facturaId') facturaId: string, @GetUser() user: LoginUserInfo) {
    return this.service.findByFactura(facturaId, user.empresa_id);
  }

  @Get('facturables/:clienteId')
  @RequirePermission('VENTAS', 'VEN_NR_NOTA_REMISION_VER')
  @ApiOperation({ summary: 'Remisiones sin factura pendientes de facturar de un cliente' })
  findFacturables(@Param('clienteId') clienteId: string, @GetUser() user: LoginUserInfo) {
    return this.service.findFacturables(user.empresa_id, clienteId);
  }

  @Get(':id')
  @RequirePermission('VENTAS', 'VEN_NR_NOTA_REMISION_VER')
  findOne(@Param('id') id: string, @GetUser() user: LoginUserInfo) {
    return this.service.findOne(id, user.empresa_id);
  }

  @Post(':id/sifen')
  @RequirePermission('VENTAS', 'VEN_NR_NOTA_REMISION_CREAR')
  @ApiOperation({ summary: 'Enviar (o reenviar) nota de remisión a SIFEN' })
  enviarSifen(@Param('id') id: string, @GetUser() user: LoginUserInfo) {
    return this.service.enviarSifen(id, user.empresa_id, user.id);
  }

  @Delete(':id/anular')
  @RequirePermission('VENTAS', 'VEN_NR_NOTA_REMISION_ANULAR')
  @ApiOperation({ summary: 'Anular nota de remisión y revertir cantidades aplicadas' })
  anular(@Param('id') id: string, @GetUser() user: LoginUserInfo) {
    return this.service.anular(id, user.empresa_id, user.id);
  }
}
