import { Controller, Get, Post, Put, Delete, Param, Body, UseGuards } from '@nestjs/common';
import { ApiTags, ApiOperation, ApiResponse } from '@nestjs/swagger';
import { QualityControlService } from '../services/quality-control.service';
import { CreateQualityCheckDto } from '../dto/create-quality-check.dto';
import { UpdateQualityCheckDto } from '../dto/update-quality-check.dto';
import { Permissions } from '../auth/decorators/permissions.decorator';
import { RbacGuard } from '../auth/guards/rbac.guard';
import { JwtAuthGuard } from '../auth/guards/jwt-auth.guard';

@ApiTags('Quality Control')
@Controller('quality-control')
@UseGuards(JwtAuthGuard, RbacGuard)
export class QualityControlController {
  constructor(private readonly qualityControlService: QualityControlService) {}

  @Get('checks')
  @ApiOperation({ summary: 'Get all quality checks' })
  @ApiResponse({ status: 200, description: 'Returns list of quality checks' })
  @Permissions('manager:quality', 'admin:quality', 'worker:quality')
  async findAll() {
    return this.qualityControlService.getQualityChecks();
  }

  @Get('checks/:id')
  @ApiOperation({ summary: 'Get quality check by ID' })
  @ApiResponse({ status: 200, description: 'Returns quality check details' })
  @Permissions('manager:quality', 'admin:quality', 'worker:quality')
  async findOne(@Param('id') id: string) {
    // There is no getQualityCheck, so use getQualityChecks with id filter or implement a findOne in service
    const checks = await this.qualityControlService.getQualityChecks(undefined, undefined);
    return checks.find(check => check.id === id);
  }

  @Post('checks')
  @ApiOperation({ summary: 'Create new quality check' })
  @ApiResponse({ status: 201, description: 'Quality check created successfully' })
  @Permissions('manager:quality', 'admin:quality', 'worker:quality')
  async createQualityCheck(@Body() createDto: CreateQualityCheckDto) {
    return this.qualityControlService.createQualityCheck(createDto);
  }

  @Put('checks/:id')
  @ApiOperation({ summary: 'Update quality check' })
  @ApiResponse({ status: 200, description: 'Quality check updated successfully' })
  @Permissions('manager:quality', 'admin:quality')
  async updateQualityCheck(
    @Param('id') id: string,
    @Body() updateDto: UpdateQualityCheckDto,
  ) {
    return this.qualityControlService.updateQualityCheck(id, updateDto);
  }

  @Delete('checks/:id')
  @ApiOperation({ summary: 'Delete quality check' })
  @ApiResponse({ status: 200, description: 'Quality check deleted successfully' })
  @Permissions('admin:quality')
  async removeQualityCheck(@Param('id') id: string) {
    // There is no deleteQualityCheck, so you may want to implement a remove in the service or use updateQualityCheck to mark as deleted
    throw new Error('Delete quality check not implemented');
  }

  @Get('templates')
  @ApiOperation({ summary: 'Get quality templates' })
  @ApiResponse({ status: 200, description: 'Returns quality templates' })
  @Permissions('manager:quality', 'admin:quality', 'worker:quality')
  async getTemplates() {
    // There is no getQualityTemplates in the service
    throw new Error('Get quality templates not implemented');
  }

  @Get('inspections')
  @ApiOperation({ summary: 'Get inspections' })
  @ApiResponse({ status: 200, description: 'Returns inspections' })
  @Permissions('manager:quality', 'admin:quality', 'worker:quality')
  async getInspections() {
    // There is no getInspections in the service
    throw new Error('Get inspections not implemented');
  }
}
