﻿import {
  Body,
  Controller,
  Delete,
  Get,
  Param,
  Patch,
  Post,
  Put,
  Query,
  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 { ChangeEstadoDto } from "./dto/change-estado.dto";
import { CreateDanoDto } from "./dto/create-dano.dto";
import { CreateFirmaDto } from "./dto/create-firma.dto";
import { CreateFotoDto } from "./dto/create-foto.dto";
import { CreateOtDto } from "./dto/create-ot.dto";
import { SearchOtDto } from "./dto/search-ot.dto";
import { UpdateOtDto } from "./dto/update-ot.dto";
import { OtsService } from "./ots.service";

@ApiTags("ots")
@ApiBearerAuth()
@UseGuards(JwtAuthGuard, PermissionGuard)
@RequirePermission("ots", "read")
@Controller("ots")
export class OtsController {
  constructor(private readonly otsService: OtsService) {}

  @Get()
  @ApiOperation({ summary: "Listar OTs con filtros y paginación" })
  async findAll(@Query() query: SearchOtDto) {
    return this.otsService.findAll(query);
  }

  @Get(":id")
  @ApiOperation({ summary: "Obtener OT por ID con todos los detalles" })
  async findById(@Param("id") id: number) {
    return this.otsService.findById(id);
  }

  @Get("numero/:numeroOt")
  @ApiOperation({ summary: "Obtener OT por número" })
  async findByNumero(@Param("numeroOt") numeroOt: string) {
    return this.otsService.findByNumero(numeroOt);
  }

  @Post()
  @RequirePermission("ots", "write")
  @ApiOperation({ summary: "Crear nueva OT" })
  async create(@Body() dto: CreateOtDto, @Request() req: any) {
    return this.otsService.create(dto, req.user?.id);
  }

  @Put(":id")
  @RequirePermission("ots", "write")
  @ApiOperation({ summary: "Actualizar OT" })
  async update(
    @Param("id") id: number,
    @Body() dto: UpdateOtDto,
    @Request() req: any,
  ) {
    return this.otsService.update(id, dto, req.user?.id);
  }

  @Patch(":id/estado")
  @RequirePermission("ots", "write")
  @ApiOperation({ summary: "Cambiar estado de OT" })
  async changeEstado(
    @Param("id") id: number,
    @Body() dto: ChangeEstadoDto,
    @Request() req: any,
  ) {
    return this.otsService.changeEstado(
      id,
      dto.estado,
      dto.fechaSalida,
      req.user?.id,
    );
  }

  @Post(":id/danos")
  @RequirePermission("ots", "write")
  @ApiOperation({ summary: "Agregar daño a OT" })
  async addDano(@Param("id") id: number, @Body() dto: CreateDanoDto) {
    return this.otsService.addDano(id, dto);
  }

  @Delete(":id/danos/:danoId")
  @RequirePermission("ots", "write")
  @ApiOperation({ summary: "Eliminar daño de OT" })
  async removeDano(@Param("id") id: number, @Param("danoId") danoId: number) {
    return this.otsService.removeDano(id, danoId);
  }

  @Post(":id/fotos")
  @RequirePermission("ots", "write")
  @ApiOperation({ summary: "Agregar foto a OT" })
  async addFoto(@Param("id") id: number, @Body() dto: CreateFotoDto) {
    return this.otsService.addFoto(id, dto);
  }

  @Delete(":id/fotos/:fotoId")
  @RequirePermission("ots", "write")
  @ApiOperation({ summary: "Eliminar foto de OT" })
  async removeFoto(@Param("id") id: number, @Param("fotoId") fotoId: number) {
    return this.otsService.removeFoto(id, fotoId);
  }

  @Post(":id/firmas")
  @RequirePermission("ots", "write")
  @ApiOperation({ summary: "Guardar firmas de OT" })
  async saveFirmas(@Param("id") id: number, @Body() dto: CreateFirmaDto) {
    return this.otsService.saveFirmas(id, dto);
  }

  @Post(":id/pdf")
  @RequirePermission("ots", "write")
  @ApiOperation({ summary: "Asociar PDF escáner a OT" })
  async savePdf(
    @Param("id") id: number,
    @Body("pdfUrl") pdfUrl: string,
    @Request() req: any,
  ) {
    return this.otsService.savePdfEscaner(id, pdfUrl, req.user?.id);
  }
}
