import { Body, Controller, Delete, Get, Param, Patch, Post, Put, UseGuards, ValidationPipe } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import { ApiBearerAuth, ApiBody, ApiParam, ApiTags } from '@nestjs/swagger';
import type { LoginUserInfo } from '../auth/dto/login.dto';
import { GetUser } from '../auth/get-user.decorator';
import { CreateProductoPrecioCuotaDto } from './dto/create-producto-precio-cuota.dto';
import { UpdateProductoPrecioCuotaDto } from './dto/update-producto-precio-cuota.dto';
import { ProductoPrecioCuotasService } from './producto-precio-cuotas.service';

@ApiTags('Producto Precio Cuotas')
@Controller({ version: '1', path: 'producto-precio-cuotas' })
export class ProductoPrecioCuotasController {
  constructor(private readonly service: ProductoPrecioCuotasService) {}

  @Post()
  @UseGuards(AuthGuard('jwt'))
  @ApiBearerAuth()
  @ApiBody({ type: CreateProductoPrecioCuotaDto })
  async create(@Body(ValidationPipe) dto: CreateProductoPrecioCuotaDto, @GetUser() user: LoginUserInfo) {
    return this.service.create(dto, user.empresa_id, user.id);
  }

  @Get('por-producto/:productoId')
  @UseGuards(AuthGuard('jwt'))
  @ApiBearerAuth()
  @ApiParam({ name: 'productoId', description: 'ID del producto' })
  async findByProducto(@Param('productoId') productoId: string, @GetUser() user: LoginUserInfo) {
    return this.service.findByProducto(productoId, user.empresa_id);
  }

  @Post('por-productos')
  @UseGuards(AuthGuard('jwt'))
  @ApiBearerAuth()
  @ApiBody({
    description: 'Array de IDs de productos',
    schema: { type: 'object', properties: { productoIds: { type: 'array', items: { type: 'string' } } } },
  })
  async findByProductos(@Body('productoIds') productoIds: string[], @GetUser() user: LoginUserInfo) {
    return this.service.findByProductos(productoIds, user.empresa_id);
  }

  @Get(':id')
  @UseGuards(AuthGuard('jwt'))
  @ApiBearerAuth()
  @ApiParam({ name: 'id', description: 'ID del precio cuota' })
  async findOne(@Param('id') id: string) {
    return this.service.findOne(id);
  }

  @Put(':id')
  @UseGuards(AuthGuard('jwt'))
  @ApiBearerAuth()
  @ApiParam({ name: 'id', description: 'ID del precio cuota' })
  @ApiBody({ type: UpdateProductoPrecioCuotaDto })
  async update(
    @Param('id') id: string,
    @Body(ValidationPipe) dto: UpdateProductoPrecioCuotaDto,
    @GetUser() user: LoginUserInfo,
  ) {
    return this.service.update(id, dto, user.id);
  }

  @Patch(':id/toggle')
  @UseGuards(AuthGuard('jwt'))
  @ApiBearerAuth()
  @ApiParam({ name: 'id', description: 'ID del precio cuota' })
  async toggleActivo(@Param('id') id: string) {
    return this.service.toggleActivo(id);
  }

  @Delete(':id')
  @UseGuards(AuthGuard('jwt'))
  @ApiBearerAuth()
  @ApiParam({ name: 'id', description: 'ID del precio cuota' })
  async remove(@Param('id') id: string) {
    return this.service.remove(id);
  }
}
