import { Controller, Get, Post, Put, Delete, Param, Body, UseGuards, Query } from '@nestjs/common';
import { ApiTags, ApiOperation, ApiResponse } from '@nestjs/swagger';
import { MaintenanceService } from '../services/maintenance.service';
import { CreateMaintenanceRequestDto } from '../dto/create-maintenance-request.dto';
import { UpdateMaintenanceRequestDto } from '../dto/update-maintenance-request.dto';
import { Permissions } from '../auth/decorators/permissions.decorator';
import { RbacGuard } from '../auth/guards/rbac.guard';
import { JwtAuthGuard } from '../auth/guards/jwt-auth.guard';

@ApiTags('Maintenance')
@Controller('maintenance')
@UseGuards(JwtAuthGuard, RbacGuard)
export class MaintenanceController {
  constructor(private readonly maintenanceService: MaintenanceService) {}

  @Get('requests')
  @ApiOperation({ summary: 'Get all maintenance requests' })
  @ApiResponse({ status: 200, description: 'Returns list of maintenance requests' })
  @Permissions('manager:maintenance', 'admin:maintenance', 'worker:maintenance')
  async findAll(@Query() query: any) {
    return this.maintenanceService.findAll(query);
  }

  @Get('requests/:id')
  @ApiOperation({ summary: 'Get maintenance request by ID' })
  @ApiResponse({ status: 200, description: 'Returns maintenance request details' })
  @Permissions('manager:maintenance', 'admin:maintenance', 'worker:maintenance')
  async findOne(@Param('id') id: string) {
    return this.maintenanceService.findOne(id);
  }

  @Post('requests')
  @ApiOperation({ summary: 'Create new maintenance request' })
  @ApiResponse({ status: 201, description: 'Maintenance request created successfully' })
  @Permissions('manager:maintenance', 'admin:maintenance', 'worker:maintenance')
  async create(@Body() createMaintenanceRequestDto: CreateMaintenanceRequestDto) {
    return this.maintenanceService.create(createMaintenanceRequestDto);
  }

  @Put('requests/:id')
  @ApiOperation({ summary: 'Update maintenance request' })
  @ApiResponse({ status: 200, description: 'Maintenance request updated successfully' })
  @Permissions('manager:maintenance', 'admin:maintenance')
  async update(
    @Param('id') id: string,
    @Body() updateMaintenanceRequestDto: UpdateMaintenanceRequestDto,
  ) {
    return this.maintenanceService.update(id, updateMaintenanceRequestDto);
  }

  @Delete('requests/:id')
  @ApiOperation({ summary: 'Delete maintenance request' })
  @ApiResponse({ status: 200, description: 'Maintenance request deleted successfully' })
  @Permissions('admin:maintenance')
  async remove(@Param('id') id: string) {
    return this.maintenanceService.remove(id);
  }

  @Get('requests/status/:status')
  @ApiOperation({ summary: 'Get maintenance requests by status' })
  @ApiResponse({ status: 200, description: 'Returns maintenance requests by status' })
  @Permissions('manager:maintenance', 'admin:maintenance', 'worker:maintenance')
  async findByStatus(@Param('status') status: string) {
    return this.maintenanceService.findByStatus(status);
  }

  @Get('requests/priority/:priority')
  @ApiOperation({ summary: 'Get maintenance requests by priority' })
  @ApiResponse({ status: 200, description: 'Returns maintenance requests by priority' })
  @Permissions('manager:maintenance', 'admin:maintenance', 'worker:maintenance')
  async findByPriority(@Param('priority') priority: string) {
    return this.maintenanceService.findByPriority(priority);
  }

  @Get('requests/machine/:machineId')
  @ApiOperation({ summary: 'Get maintenance requests by machine' })
  @ApiResponse({ status: 200, description: 'Returns maintenance requests by machine' })
  @Permissions('manager:maintenance', 'admin:maintenance', 'worker:maintenance')
  async findByMachine(@Param('machineId') machineId: string) {
    return this.maintenanceService.findByMachine(machineId);
  }

  @Get('schedules')
  @ApiOperation({ summary: 'Get maintenance schedules' })
  @ApiResponse({ status: 200, description: 'Returns maintenance schedules' })
  @Permissions('manager:maintenance', 'admin:maintenance', 'worker:maintenance')
  async getSchedules() {
    return this.maintenanceService.getSchedules();
  }

  @Get('history')
  @ApiOperation({ summary: 'Get maintenance history' })
  @ApiResponse({ status: 200, description: 'Returns maintenance history' })
  @Permissions('manager:maintenance', 'admin:maintenance', 'worker:maintenance')
  async getHistory() {
    return this.maintenanceService.getHistory();
  }
} 