import { Body, Controller, Get, Param, Patch, Post, Query, Res, UseGuards } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import { ApiBearerAuth, ApiOperation, ApiQuery, ApiTags } from '@nestjs/swagger';
import type { LoginUserInfo } from 'src/auth/dto/login.dto';
import { GetUser } from 'src/auth/get-user.decorator';
import { CancelarOrdenCompraDto } from './dto/cancelar-orden-compra.dto';
import { CreateOrdenCompraDto } from './dto/create-orden-compra.dto';
import { UpdateOrdenCompraDto } from './dto/update-orden-compra.dto';
import { OrdenesCompraService } from './ordenes-compra.service';

@ApiTags('Órdenes de Compra')
@Controller({ path: 'ordenes-compra', version: '1' })
export class OrdenesCompraController {
  constructor(private readonly ordenesCompraService: OrdenesCompraService) {}

  @Post()
  @UseGuards(AuthGuard('jwt'))
  @ApiBearerAuth()
  @ApiOperation({ summary: 'Crear orden de compra' })
  create(@Body() dto: CreateOrdenCompraDto, @GetUser() user: LoginUserInfo) {
    return this.ordenesCompraService.create(dto, user.empresa_id, user.id);
  }

  @Get()
  @UseGuards(AuthGuard('jwt'))
  @ApiBearerAuth()
  @ApiOperation({ summary: 'Listar órdenes de compra' })
  @ApiQuery({ name: 'page', required: false })
  @ApiQuery({ name: 'limit', required: false })
  @ApiQuery({ name: 'fecha_desde', required: false })
  @ApiQuery({ name: 'fecha_hasta', required: false })
  @ApiQuery({ name: 'proveedor_id', required: false })
  @ApiQuery({ name: 'sucursal_id', required: false })
  @ApiQuery({ name: 'estado', required: false })
  @ApiQuery({ name: 'search', required: false })
  findAll(
    @GetUser() user: LoginUserInfo,
    @Query('page') page?: string,
    @Query('limit') limit?: string,
    @Query('fecha_desde') fecha_desde?: string,
    @Query('fecha_hasta') fecha_hasta?: string,
    @Query('proveedor_id') proveedor_id?: string,
    @Query('sucursal_id') sucursal_id?: string,
    @Query('estado') estado?: string,
    @Query('search') search?: string,
  ) {
    return this.ordenesCompraService.findAll(user.empresa_id, {
      page,
      limit,
      fecha_desde,
      fecha_hasta,
      proveedor_id,
      sucursal_id,
      estado,
      search,
      usuarioId: user.id,
    });
  }

  @Get(':id')
  @UseGuards(AuthGuard('jwt'))
  @ApiBearerAuth()
  @ApiOperation({ summary: 'Obtener detalle de orden de compra' })
  findOne(@Param('id') id: string, @GetUser() user: LoginUserInfo) {
    return this.ordenesCompraService.findOne(id, user.empresa_id);
  }

  @Get(':id/matching-3-vias')
  @UseGuards(AuthGuard('jwt'))
  @ApiBearerAuth()
  @ApiOperation({ summary: 'Reporte formal de matching 3 vías para una orden de compra' })
  getMatching3Vias(@Param('id') id: string, @GetUser() user: LoginUserInfo) {
    return this.ordenesCompraService.getMatching3Vias(id, user.empresa_id);
  }

  @Get(':id/historial')
  @UseGuards(AuthGuard('jwt'))
  @ApiBearerAuth()
  @ApiOperation({ summary: 'Obtener historial operativo de una orden de compra' })
  getHistorial(@Param('id') id: string, @GetUser() user: LoginUserInfo) {
    return this.ordenesCompraService.getHistorial(id, user.empresa_id);
  }

  @Get(':id/pdf')
  @UseGuards(AuthGuard('jwt'))
  @ApiBearerAuth()
  @ApiOperation({ summary: 'Generar PDF A4 de una orden de compra' })
  async getPdf(@Param('id') id: string, @GetUser() user: LoginUserInfo, @Res() res: any) {
    const result = await this.ordenesCompraService.generatePdf(id, user.empresa_id);

    res.set({
      'Content-Type': 'application/pdf',
      'Content-Disposition': `inline; filename="${result.filename}"`,
      'Content-Length': result.pdfBuffer.length,
    });

    return res.send(result.pdfBuffer);
  }

  @Patch(':id')
  @UseGuards(AuthGuard('jwt'))
  @ApiBearerAuth()
  @ApiOperation({ summary: 'Actualizar orden de compra' })
  update(@Param('id') id: string, @Body() dto: UpdateOrdenCompraDto, @GetUser() user: LoginUserInfo) {
    return this.ordenesCompraService.update(id, dto, user.empresa_id, user.id);
  }

  @Patch(':id/aprobar')
  @UseGuards(AuthGuard('jwt'))
  @ApiBearerAuth()
  @ApiOperation({ summary: 'Aprobar orden de compra' })
  aprobar(@Param('id') id: string, @GetUser() user: LoginUserInfo) {
    return this.ordenesCompraService.aprobar(id, user.empresa_id, user.id);
  }

  @Patch(':id/cancelar')
  @UseGuards(AuthGuard('jwt'))
  @ApiBearerAuth()
  @ApiOperation({ summary: 'Cancelar orden de compra' })
  cancelar(@Param('id') id: string, @Body() dto: CancelarOrdenCompraDto, @GetUser() user: LoginUserInfo) {
    return this.ordenesCompraService.cancelar(id, dto, user.empresa_id, user.id);
  }
}
