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 { ReportesRentabilidadService } from './reportes-rentabilidad.service';

@ApiTags('Reportes - Rentabilidad')
@ApiBearerAuth()
@UseGuards(AuthGuard('jwt'), ModuleGuard, PermissionGuard)
@RequireModule('REPORTES')
@Controller({ path: 'reportes/rentabilidad', version: '1' })
export class ReportesRentabilidadController {
  constructor(private readonly reportesRentabilidadService: ReportesRentabilidadService) {}

  @Get('productos')
  @RequirePermission('REPORTES', 'REP_FAC_REPORTE_VER')
  @ApiOperation({ summary: 'Rentabilidad por producto (basado en costo capturado en factura_det)' })
  @ApiQuery({ name: 'fecha_desde', required: false })
  @ApiQuery({ name: 'fecha_hasta', required: false })
  @ApiQuery({ name: 'sucursal_id', required: false })
  @ApiQuery({ name: 'deposito_id', required: false })
  @ApiQuery({ name: 'producto_id', required: false })
  @ApiQuery({ name: 'cliente_id', required: false })
  @ApiQuery({ name: 'limit', required: false })
  getProductos(
    @GetUser() user: LoginUserInfo,
    @Query('fecha_desde') fecha_desde?: string,
    @Query('fecha_hasta') fecha_hasta?: string,
    @Query('sucursal_id') sucursal_id?: string,
    @Query('deposito_id') deposito_id?: string,
    @Query('producto_id') producto_id?: string,
    @Query('cliente_id') cliente_id?: string,
    @Query('limit') limit?: string,
  ) {
    return this.reportesRentabilidadService.getRentabilidadProductos(user.empresa_id, {
      fecha_desde,
      fecha_hasta,
      sucursal_id,
      deposito_id,
      producto_id,
      cliente_id,
      limit,
    }, user.id);
  }

  @Get('clientes')
  @RequirePermission('REPORTES', 'REP_FAC_REPORTE_VER')
  @ApiOperation({ summary: 'Rentabilidad por cliente (basado en costo capturado en factura_det)' })
  @ApiQuery({ name: 'fecha_desde', required: false })
  @ApiQuery({ name: 'fecha_hasta', required: false })
  @ApiQuery({ name: 'sucursal_id', required: false })
  @ApiQuery({ name: 'deposito_id', required: false })
  @ApiQuery({ name: 'producto_id', required: false })
  @ApiQuery({ name: 'cliente_id', required: false })
  @ApiQuery({ name: 'limit', required: false })
  getClientes(
    @GetUser() user: LoginUserInfo,
    @Query('fecha_desde') fecha_desde?: string,
    @Query('fecha_hasta') fecha_hasta?: string,
    @Query('sucursal_id') sucursal_id?: string,
    @Query('deposito_id') deposito_id?: string,
    @Query('producto_id') producto_id?: string,
    @Query('cliente_id') cliente_id?: string,
    @Query('limit') limit?: string,
  ) {
    return this.reportesRentabilidadService.getRentabilidadClientes(user.empresa_id, {
      fecha_desde,
      fecha_hasta,
      sucursal_id,
      deposito_id,
      producto_id,
      cliente_id,
      limit,
    }, user.id);
  }

  @Get('sucursales')
  @RequirePermission('REPORTES', 'REP_FAC_REPORTE_VER')
  @ApiOperation({ summary: 'Rentabilidad por sucursal (basado en costo capturado en factura_det)' })
  @ApiQuery({ name: 'fecha_desde', required: false })
  @ApiQuery({ name: 'fecha_hasta', required: false })
  @ApiQuery({ name: 'sucursal_id', required: false })
  @ApiQuery({ name: 'deposito_id', required: false })
  @ApiQuery({ name: 'producto_id', required: false })
  @ApiQuery({ name: 'cliente_id', required: false })
  @ApiQuery({ name: 'limit', required: false })
  getSucursales(
    @GetUser() user: LoginUserInfo,
    @Query('fecha_desde') fecha_desde?: string,
    @Query('fecha_hasta') fecha_hasta?: string,
    @Query('sucursal_id') sucursal_id?: string,
    @Query('deposito_id') deposito_id?: string,
    @Query('producto_id') producto_id?: string,
    @Query('cliente_id') cliente_id?: string,
    @Query('limit') limit?: string,
  ) {
    return this.reportesRentabilidadService.getRentabilidadSucursales(user.empresa_id, {
      fecha_desde,
      fecha_hasta,
      sucursal_id,
      deposito_id,
      producto_id,
      cliente_id,
      limit,
    }, user.id);
  }

  @Get('dashboard')
  @RequirePermission('REPORTES', 'REP_FAC_REPORTE_VER')
  @ApiOperation({ summary: 'Dashboard de rentabilidad (producto/cliente)' })
  @ApiQuery({ name: 'fecha_desde', required: false })
  @ApiQuery({ name: 'fecha_hasta', required: false })
  @ApiQuery({ name: 'sucursal_id', required: false })
  @ApiQuery({ name: 'deposito_id', required: false })
  @ApiQuery({ name: 'producto_id', required: false })
  @ApiQuery({ name: 'cliente_id', required: false })
  getDashboard(
    @GetUser() user: LoginUserInfo,
    @Query('fecha_desde') fecha_desde?: string,
    @Query('fecha_hasta') fecha_hasta?: string,
    @Query('sucursal_id') sucursal_id?: string,
    @Query('deposito_id') deposito_id?: string,
    @Query('producto_id') producto_id?: string,
    @Query('cliente_id') cliente_id?: string,
  ) {
    return this.reportesRentabilidadService.getRentabilidadDashboard(user.empresa_id, {
      fecha_desde,
      fecha_hasta,
      sucursal_id,
      deposito_id,
      producto_id,
      cliente_id,
    }, user.id);
  }
}
