package com.sapolar.maintenance; import com.sapolar.auth.SecurityUser; import com.sapolar.common.dto.ApiResponse; import com.sapolar.finance.expense.ExpenseCategory; import com.sapolar.finance.expense.ExpenseCategoryRepository; import lombok.RequiredArgsConstructor; import org.springframework.format.annotation.DateTimeFormat; import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.*; import java.time.LocalDate; import java.util.List; @RestController @RequestMapping("/api/maintenance") @RequiredArgsConstructor public class MaintenanceController { private final MaintenanceService maintenanceService; private final ExpenseCategoryRepository expenseCategoryRepository; @GetMapping public ResponseEntity>> findAll( @RequestParam(required = false) Long propertyId) { if (propertyId != null) { return ResponseEntity.ok(ApiResponse.success(maintenanceService.findByProperty(propertyId))); } return ResponseEntity.ok(ApiResponse.success(maintenanceService.findAll())); } @GetMapping("/pending") public ResponseEntity>> getPending() { return ResponseEntity.ok(ApiResponse.success(maintenanceService.findPending())); } @GetMapping("/upcoming") public ResponseEntity>> getUpcoming( @RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate from, @RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate to) { return ResponseEntity.ok(ApiResponse.success(maintenanceService.findUpcoming(from, to))); } @GetMapping("/{id}") public ResponseEntity> findById(@PathVariable Long id) { return ResponseEntity.ok(ApiResponse.success(maintenanceService.findById(id))); } @GetMapping("/expense-categories") public ResponseEntity>> getExpenseCategories() { return ResponseEntity.ok(ApiResponse.success(expenseCategoryRepository.findAll())); } @PostMapping public ResponseEntity> create(@RequestBody ScheduledMaintenance maintenance, @AuthenticationPrincipal SecurityUser user) { return ResponseEntity.ok(ApiResponse.success("Mantenimiento creado", maintenanceService.create(maintenance, user.userId()))); } @PutMapping("/{id}") public ResponseEntity> update(@PathVariable Long id, @RequestBody ScheduledMaintenance maintenance) { return ResponseEntity.ok(ApiResponse.success("Mantenimiento actualizado", maintenanceService.update(id, maintenance))); } @PatchMapping("/{id}/complete") public ResponseEntity> complete(@PathVariable Long id, @AuthenticationPrincipal SecurityUser user) { return ResponseEntity.ok(ApiResponse.success("Mantenimiento completado", maintenanceService.markCompleted(id, user.userId()))); } @PatchMapping("/{id}/reopen") public ResponseEntity> reopen(@PathVariable Long id) { return ResponseEntity.ok(ApiResponse.success("Mantenimiento reabierto", maintenanceService.reopen(id))); } @DeleteMapping("/{id}") public ResponseEntity> delete(@PathVariable Long id) { maintenanceService.delete(id); return ResponseEntity.ok(ApiResponse.success("Mantenimiento eliminado", null)); } }