import { Controller, Get, Param, Query, UseGuards } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import { ApiBearerAuth, ApiParam, ApiQuery } from '@nestjs/swagger';
import { RequireModule } from 'src/auth/decorators/require-module.decorator';
import { RequirePermission } from 'src/auth/decorators/require-permission.decorator';
import { ModuleGuard } from 'src/auth/guards/module.guard';
import { PermissionGuard } from 'src/auth/guards/permission.guard';
import type { LoginUserInfo } from '../auth/dto/login.dto';
import { GetUser } from '../auth/get-user.decorator';
import { parseFechaValida } from 'src/utils/utilidades';
import { MovimientosInventarioService } from './movimientos-inventario.service';

@ApiBearerAuth()
@UseGuards(AuthGuard('jwt'), ModuleGuard)
@RequireModule('INVENTARIO')
@Controller({ version: '1', path: 'movimientos-inventario' })
export class MovimientosInventarioController {
  constructor(
    private readonly movimientosService: MovimientosInventarioService,
  ) {}

  @Get()
  @UseGuards(PermissionGuard)
  @RequirePermission('INVENTARIO', 'INV_MOV_MOVIMIENTO_VER')
  @ApiQuery({ name: 'page', required: false })
  @ApiQuery({ name: 'limit', required: false })
  @ApiQuery({ name: 'producto_id', required: false })
  @ApiQuery({ name: 'deposito_id', required: false })
  @ApiQuery({ name: 'sucursal_id', required: false })
  @ApiQuery({ name: 'tipo_movimiento_id', required: false })
  @ApiQuery({ name: 'documento_origen', required: false })
  @ApiQuery({ name: 'search', required: false })
  @ApiQuery({ name: 'fecha_desde', required: false })
  @ApiQuery({ name: 'fecha_hasta', required: false })
  async findAll(
    @GetUser() user: LoginUserInfo,
    @Query('page') page?: string,
    @Query('limit') limit?: string,
    @Query('producto_id') producto_id?: string,
    @Query('deposito_id') deposito_id?: string,
    @Query('sucursal_id') sucursal_id?: string,
    @Query('tipo_movimiento_id') tipo_movimiento_id?: string,
    @Query('documento_origen') documento_origen?: string,
    @Query('search') search?: string,
    @Query('fecha_desde') fecha_desde?: string,
    @Query('fecha_hasta') fecha_hasta?: string,
  ) {
    return this.movimientosService.findAll(user.empresa_id, {
      page: page ? Number(page) : 1,
      limit: limit ? Number(limit) : 25,
      producto_id,
      deposito_id,
      sucursal_id,
      tipo_movimiento_id,
      documento_origen,
      search,
      fecha_desde: parseFechaValida(fecha_desde),
      fecha_hasta: parseFechaValida(fecha_hasta),
      usuarioId: user.id,
    });
  }

  @Get('producto/:producto_id')
  @UseGuards(PermissionGuard)
  @RequirePermission('INVENTARIO', 'INV_MOV_MOVIMIENTO_VER')
  @ApiParam({ name: 'producto_id', description: 'ID del producto' })
  async findByProducto(
    @Param('producto_id') producto_id: string,
    @GetUser() user: LoginUserInfo,
  ) {
    return this.movimientosService.findByProducto(producto_id, user.empresa_id);
  }

  @Get('deposito/:deposito_id')
  @UseGuards(PermissionGuard)
  @RequirePermission('INVENTARIO', 'INV_MOV_MOVIMIENTO_VER')
  @ApiParam({ name: 'deposito_id', description: 'ID del depósito' })
  async findByDeposito(@Param('deposito_id') deposito_id: string, @GetUser() user: LoginUserInfo) {
    return this.movimientosService.findByDeposito(deposito_id, user.empresa_id);
  }
}
