package com.walkguide.service; import com.walkguide.dto.response.DashboardResponse; import com.walkguide.enums.PairingStatus; import com.walkguide.exception.ResourceNotFoundException; import com.walkguide.repository.*; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.PageRequest; import org.springframework.stereotype.Service; import java.time.LocalDateTime; import java.time.LocalTime; import java.util.HashMap; import java.util.Map; @Service @RequiredArgsConstructor public class GuardianDashboardService { private final PairingRelationRepository pairingRelationRepository; private final LocationService locationService; private final ActivityLogService activityLogService; private final SosEventRepository sosEventRepository; private final GuardianNotificationRepository notifRepository; private final ObstacleLogRepository obstacleLogRepository; public DashboardResponse getDashboard(Long guardianId) { var pairing = pairingRelationRepository .findByGuardian_IdAndStatus(guardianId, PairingStatus.ACTIVE) .orElse(null); if (pairing == null) { return DashboardResponse.builder() .recentActivity(java.util.List.of()) .unreadSosCount(0).unreadNotifCount(0).build(); } var user = pairing.getUser(); Long userId = user.getId(); var lastLocation = locationService.getLastLocation(userId).orElse(null); var recentActivity = activityLogService.getLogs(userId, PageRequest.of(0, 5)) .getContent(); // Count unresolved SOS long unreadSos = sosEventRepository.findByUserIdOrderByCreatedAtDesc(userId, PageRequest.of(0, 100)) .stream().filter(s -> s.getStatus().name().equals("TRIGGERED")).count(); long unreadNotif = notifRepository.countByUserIdAndIsReadFalse(userId); long obstaclesToday = obstacleLogRepository.countByUserIdAndCreatedAtAfter( userId, LocalDateTime.of(LocalDateTime.now().toLocalDate(), LocalTime.MIN) ); Map userStatus = new HashMap<>(); userStatus.put("displayName", user.getDisplayName()); userStatus.put("email", user.getEmail()); userStatus.put("online", lastLocation != null && lastLocation.getCreatedAt() != null && lastLocation.getCreatedAt().isAfter(LocalDateTime.now().minusMinutes(2))); userStatus.put("lastSeenAt", lastLocation != null ? lastLocation.getCreatedAt() : null); userStatus.put("battery", lastLocation != null ? lastLocation.getBatteryLevel() : null); userStatus.put("lastSpeed", lastLocation != null ? lastLocation.getSpeed() : null); userStatus.put("obstaclesToday", obstaclesToday); return DashboardResponse.builder() .pairedUserId(userId) .pairedUserName(user.getDisplayName()) .pairedUserEmail(user.getEmail()) .uniqueUserId(user.getUniqueUserId()) .lastLocation(lastLocation) .unreadSosCount(unreadSos) .unreadNotifCount(unreadNotif) .obstaclesToday(obstaclesToday) .userStatus(userStatus) .recentActivity(recentActivity) .build(); } }