<?php

namespace App\Services;

class ProximidadeService
{
    private const EARTH_RADIUS_KM = 6371;

    /**
     * Calcula a distância em KM entre dois pontos geográficos (fórmula Haversine).
     */
    public function distanciaKm(float $lat1, float $lng1, float $lat2, float $lng2): float
    {
        $dLat = deg2rad($lat2 - $lat1);
        $dLng = deg2rad($lng2 - $lng1);

        $a = sin($dLat / 2) ** 2
            + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * sin($dLng / 2) ** 2;

        $c = 2 * atan2(sqrt($a), sqrt(1 - $a));

        return self::EARTH_RADIUS_KM * $c;
    }

    /**
     * Retorna se a distância entre dois pontos é menor ou igual ao limite em metros.
     */
    public function dentroDoRaio(float $lat1, float $lng1, float $lat2, float $lng2, float $limiteMetros): bool
    {
        return $this->distanciaKm($lat1, $lng1, $lat2, $lng2) * 1000 <= $limiteMetros;
    }

    /**
     * Tempo estimado a pé (5 km/h).
     */
    public function tempoEstimadoMinutos(float $distanciaKm): int
    {
        return (int) round(($distanciaKm / 5) * 60);
    }
}
