import {
  Body,
  Controller,
  Get,
  Param,
  Patch,
  Post,
  Put,
  Query,
  Request,
  UseGuards,
  UseInterceptors,
} from "@nestjs/common";
import { ApiBearerAuth, ApiOperation, ApiQuery, 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 { TenantGuard } from "../tenancy/tenant.guard";
import { TenantReleaseInterceptor } from "../tenancy/tenant-release.interceptor";
import { CreateMecanicoDto } from "./dto/create-mecanico.dto";
import { UpdateMecanicoDto } from "./dto/update-mecanico.dto";
import { MecanicosService } from "./mecanicos.service";

function parseBooleanQuery(value: unknown): boolean | undefined {
  if (value === undefined || value === null || value === "") return undefined;
  const normalized = String(value).trim().toLowerCase();
  if (normalized === "true" || normalized === "1") return true;
  if (normalized === "false" || normalized === "0") return false;
  return undefined;
}

@ApiTags("mecanicos")
@ApiBearerAuth()
@UseGuards(JwtAuthGuard, TenantGuard, PermissionGuard)
@UseInterceptors(TenantReleaseInterceptor)
@RequirePermission("catalogos", "read")
@Controller("mecanicos")
export class MecanicosController {
  constructor(private readonly mecanicosService: MecanicosService) {}

  @Get()
  @ApiOperation({ summary: "Listar mecanicos" })
  @ApiQuery({ name: "activo", required: false, type: Boolean })
  async findAll(@Query("activo") activoRaw: string, @Request() req: any) {
    return this.mecanicosService.findAll(
      { activo: parseBooleanQuery(activoRaw) },
      req.user,
    );
  }

  @Post()
  @RequirePermission("catalogos", "write")
  @ApiOperation({ summary: "Crear mecanico" })
  async create(@Body() dto: CreateMecanicoDto, @Request() req: any) {
    return this.mecanicosService.create(dto, req.user);
  }

  @Put(":id")
  @RequirePermission("catalogos", "write")
  @ApiOperation({ summary: "Actualizar mecanico" })
  async update(
    @Param("id") id: number,
    @Body() dto: UpdateMecanicoDto,
    @Request() req: any,
  ) {
    return this.mecanicosService.update(id, dto, req.user);
  }

  @Patch(":id/activo")
  @RequirePermission("catalogos", "write")
  @ApiOperation({ summary: "Activar o dar de baja mecanico" })
  async setActive(
    @Param("id") id: number,
    @Query("value") value: string,
    @Request() req: any,
  ) {
    return this.mecanicosService.setActive(
      id,
      parseBooleanQuery(value) !== false,
      req.user,
    );
  }
}
