﻿import {
  Body,
  Controller,
  Delete,
  Get,
  Param,
  Patch,
  Post,
  Put,
  Request,
  UseGuards,
} from "@nestjs/common";
import { ApiBearerAuth, ApiOperation, ApiTags } from "@nestjs/swagger";
import { RequirePermission } from "../auth/decorators/require-permission.decorator";
import { JwtAuthGuard } from "../auth/guards/jwt-auth.guard";
import { PermissionGuard } from "../auth/guards/permission.guard";
import { CotizacionesService } from "./cotizaciones.service";
import { AddLineaDto } from "./dto/add-linea.dto";
import { CreateCotizacionDto } from "./dto/create-cotizacion.dto";
import { UpdateLineaDto } from "./dto/update-linea.dto";

@ApiTags("cotizaciones")
@ApiBearerAuth()
@UseGuards(JwtAuthGuard, PermissionGuard)
@RequirePermission("cotizaciones", "read")
@Controller("cotizaciones")
export class CotizacionesController {
  constructor(private readonly cotizacionesService: CotizacionesService) {}

  @Get("ot/:otId")
  @ApiOperation({ summary: "Obtener cotización por OT" })
  async findByOt(@Param("otId") otId: number) {
    return this.cotizacionesService.findByOt(otId);
  }

  @Get(":id")
  @ApiOperation({ summary: "Obtener cotización por ID" })
  async findById(@Param("id") id: number) {
    return this.cotizacionesService.findById(id);
  }

  @Post()
  @RequirePermission("cotizaciones", "write")
  @ApiOperation({ summary: "Crear cotización para OT" })
  async create(@Body() dto: CreateCotizacionDto) {
    return this.cotizacionesService.create(dto);
  }

  @Post(":id/lineas")
  @RequirePermission("cotizaciones", "write")
  @ApiOperation({ summary: "Agregar línea a cotización" })
  async addLinea(@Param("id") id: number, @Body() dto: AddLineaDto) {
    return this.cotizacionesService.addLinea(id, dto);
  }

  @Put(":id/lineas/:lineaId")
  @RequirePermission("cotizaciones", "write")
  @ApiOperation({ summary: "Actualizar línea de cotización" })
  async updateLinea(
    @Param("id") id: number,
    @Param("lineaId") lineaId: number,
    @Body() dto: UpdateLineaDto,
  ) {
    return this.cotizacionesService.updateLinea(id, lineaId, dto);
  }

  @Delete(":id/lineas/:lineaId")
  @RequirePermission("cotizaciones", "write")
  @ApiOperation({ summary: "Eliminar línea de cotización" })
  async removeLinea(
    @Param("id") id: number,
    @Param("lineaId") lineaId: number,
  ) {
    return this.cotizacionesService.removeLinea(id, lineaId);
  }

  @Patch(":id/aprobar")
  @RequirePermission("cotizaciones", "write")
  @ApiOperation({ summary: "Aprobar cotización" })
  async aprobar(@Param("id") id: number, @Request() req: any) {
    return this.cotizacionesService.aprobar(
      id,
      req.user?.nombre || req.user?.username,
    );
  }
}
