UserLocationService.java

package org.petify.backend.services;

import org.petify.backend.dto.UserLocationRequest;
import org.petify.backend.dto.UserLocationResponse;
import org.petify.backend.models.ApplicationUser;
import org.petify.backend.repository.UserRepository;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;

@Service
@Transactional
public class UserLocationService {

    @Autowired
    private UserRepository userRepository;

    public UserLocationResponse getUserLocation(String username) {
        ApplicationUser user = userRepository.findByUsername(username)
                .orElseThrow(() -> new RuntimeException("User not found"));

        return new UserLocationResponse(
                user.getCity(),
                user.getLatitude(),
                user.getLongitude(),
                user.getPreferredSearchDistanceKm(),
                user.getAutoLocationEnabled(),
                user.getLocationUpdatedAt(),
                user.hasLocation(),
                user.hasCompleteLocationProfile()
        );
    }

    public UserLocationResponse updateUserLocation(String username, UserLocationRequest locationRequest) {
        ApplicationUser user = userRepository.findByUsername(username)
                .orElseThrow(() -> new RuntimeException("User not found"));

        if (locationRequest.city() != null) {
            user.setCity(locationRequest.city().trim());
        }

        if (locationRequest.latitude() != null && locationRequest.longitude() != null) {
            user.setLatitude(locationRequest.latitude());
            user.setLongitude(locationRequest.longitude());
        }

        if (locationRequest.preferredSearchDistanceKm() != null) {
            user.setPreferredSearchDistanceKm(locationRequest.preferredSearchDistanceKm());
        }

        if (locationRequest.autoLocationEnabled() != null) {
            user.setAutoLocationEnabled(locationRequest.autoLocationEnabled());
        }

        user.setLocationUpdatedAt(LocalDateTime.now());

        ApplicationUser savedUser = userRepository.save(user);

        return new UserLocationResponse(
                savedUser.getCity(),
                savedUser.getLatitude(),
                savedUser.getLongitude(),
                savedUser.getPreferredSearchDistanceKm(),
                savedUser.getAutoLocationEnabled(),
                savedUser.getLocationUpdatedAt(),
                savedUser.hasLocation(),
                savedUser.hasCompleteLocationProfile()
        );
    }

    public UserLocationResponse setUserLocationByCoordinates(String username, String city,
                                                             Double latitude, Double longitude,
                                                             Double preferredDistance) {
        ApplicationUser user = userRepository.findByUsername(username)
                .orElseThrow(() -> new RuntimeException("User not found"));

        user.setLocation(city, latitude, longitude);

        if (preferredDistance != null) {
            user.setPreferredSearchDistanceKm(preferredDistance);
        }

        ApplicationUser savedUser = userRepository.save(user);

        return new UserLocationResponse(
                savedUser.getCity(),
                savedUser.getLatitude(),
                savedUser.getLongitude(),
                savedUser.getPreferredSearchDistanceKm(),
                savedUser.getAutoLocationEnabled(),
                savedUser.getLocationUpdatedAt(),
                savedUser.hasLocation(),
                savedUser.hasCompleteLocationProfile()
        );
    }

    public UserLocationResponse clearUserLocation(String username) {
        ApplicationUser user = userRepository.findByUsername(username)
                .orElseThrow(() -> new RuntimeException("User not found"));

        user.clearLocation();
        user.setAutoLocationEnabled(false);

        ApplicationUser savedUser = userRepository.save(user);

        return new UserLocationResponse(
                null,
                null,
                null,
                savedUser.getPreferredSearchDistanceKm(),
                false,
                null,
                false,
                false
        );
    }

    public boolean userHasLocation(String username) {
        ApplicationUser user = userRepository.findByUsername(username)
                .orElseThrow(() -> new RuntimeException("User not found"));

        return user.hasLocation();
    }

    public Double getUserPreferredSearchDistance(String username) {
        ApplicationUser user = userRepository.findByUsername(username)
                .orElseThrow(() -> new RuntimeException("User not found"));

        return user.getPreferredSearchDistanceKm() != null
                ? user.getPreferredSearchDistanceKm() : 20.0;
    }
}