import { Body, Controller, Delete, Get, Param, Patch, 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 { CreateOfertaDto } from './dto/create-oferta.dto';
import { EvaluarOfertasDto } from './dto/evaluar-ofertas.dto';
import { UpdateOfertaDto } from './dto/update-oferta.dto';
import { OfertasService } from './ofertas.service';

@ApiTags('Ofertas y Promociones')
@ApiBearerAuth()
@UseGuards(AuthGuard('jwt'), ModuleGuard)
@RequireModule('INVENTARIO')
@Controller('ofertas')
export class OfertasController {
  constructor(private readonly ofertasService: OfertasService) {}

  @Post()
  @UseGuards(PermissionGuard)
  @RequirePermission('INVENTARIO', 'INV_OFE_OFERTA_CREAR')
  @ApiOperation({ summary: 'Crear una nueva oferta' })
  create(@Body() dto: CreateOfertaDto, @GetUser() user: LoginUserInfo) {
    return this.ofertasService.create(dto, user.empresa_id, user.id);
  }

  @Get()
  @UseGuards(PermissionGuard)
  @RequirePermission('INVENTARIO', 'INV_OFE_OFERTA_VER')
  @ApiOperation({ summary: 'Listar ofertas de la empresa (paginado)' })
  @ApiQuery({ name: 'active', required: false })
  @ApiQuery({ name: 'tipo', required: false })
  @ApiQuery({
    name: 'q',
    required: false,
    description: 'Buscar por nombre o descripción',
  })
  @ApiQuery({ name: 'page', required: false, type: Number })
  @ApiQuery({ name: 'limit', required: false, type: Number })
  findAll(
    @GetUser() user: LoginUserInfo,
    @Query('active') active?: string,
    @Query('tipo') tipo?: string,
    @Query('q') q?: string,
    @Query('page') page?: string,
    @Query('limit') limit?: string,
  ) {
    return this.ofertasService.findAll(user.empresa_id, {
      active,
      tipo,
      q,
      page,
      limit,
    });
  }

  @Get('activas')
  @UseGuards(PermissionGuard)
  @RequirePermission('INVENTARIO', 'INV_OFE_OFERTA_VER')
  @ApiOperation({ summary: 'Obtener ofertas activas y vigentes (para POS)' })
  @ApiQuery({ name: 'sucursal_id', required: false })
  getActivas(@GetUser() user: LoginUserInfo, @Query('sucursal_id') sucursalId?: string) {
    return this.ofertasService.getOfertasActivas(user.empresa_id, sucursalId);
  }

  @Post('evaluar')
  @UseGuards(PermissionGuard)
  @RequirePermission('INVENTARIO', 'INV_OFE_OFERTA_VER')
  @ApiOperation({ summary: 'Evaluar ofertas aplicables a un carrito de items' })
  evaluar(@Body() dto: EvaluarOfertasDto, @GetUser() user: LoginUserInfo) {
    return this.ofertasService.evaluarOfertas(dto, user.empresa_id);
  }

  @Get(':id')
  @UseGuards(PermissionGuard)
  @RequirePermission('INVENTARIO', 'INV_OFE_OFERTA_VER')
  @ApiOperation({ summary: 'Obtener detalle de una oferta' })
  findOne(@Param('id') id: string) {
    return this.ofertasService.findOne(id);
  }

  @Get(':id/usos')
  @UseGuards(PermissionGuard)
  @RequirePermission('INVENTARIO', 'INV_OFE_OFERTA_VER')
  @ApiOperation({ summary: 'Historial de uso de una oferta' })
  getUsos(@Param('id') id: string) {
    return this.ofertasService.getUsos(id);
  }

  @Patch(':id')
  @UseGuards(PermissionGuard)
  @RequirePermission('INVENTARIO', 'INV_OFE_OFERTA_EDITAR')
  @ApiOperation({ summary: 'Actualizar una oferta' })
  update(@Param('id') id: string, @Body() dto: UpdateOfertaDto, @GetUser() user: LoginUserInfo) {
    return this.ofertasService.update(id, dto, user.id);
  }

  @Patch(':id/toggle')
  @UseGuards(PermissionGuard)
  @RequirePermission('INVENTARIO', 'INV_OFE_OFERTA_EDITAR')
  @ApiOperation({ summary: 'Activar/desactivar una oferta' })
  toggleActive(@Param('id') id: string, @GetUser() user: LoginUserInfo) {
    return this.ofertasService.toggleActive(id, user.id);
  }

  @Delete(':id')
  @UseGuards(PermissionGuard)
  @RequirePermission('INVENTARIO', 'INV_OFE_OFERTA_ELIMINAR')
  @ApiOperation({ summary: 'Desactivar una oferta (soft delete)' })
  remove(@Param('id') id: string, @GetUser() user: LoginUserInfo) {
    return this.ofertasService.remove(id, user.id);
  }
}
