<?php

namespace App\Services;

use App\Models\Post;
use App\Models\Aderente;
use App\Events\ParagemProxima;
use App\Events\ParagemClienteProxima;
use App\Events\ParagemMotoristaProxima;
use Illuminate\Support\Facades\Log;

class ParagemService
{
    public function verificarParagemProxima(Post $post): void
    {
        $motorista = $post->user;
        $paragens = $post->paragens;

        if (!$motorista->latitude || !$motorista->longitude) {
            Log::warning("Coordenadas ausentes para motorista ID {$motorista->id}");
            return;
        }

        foreach ($paragens as $paragem) {
            if (
                empty($paragem['lat']) ||
                empty($paragem['lng'])
            ) {
                continue;
            }

            $distancia = $this->haversine(
                $motorista->latitude,
                $motorista->longitude,
                $paragem['lat'],
                $paragem['lng']
            );

            if ($distancia < 0.3) {
                broadcast(new ParagemProxima($post->id, $paragem))->toOthers();

                $notificado = false;

                foreach ($post->aderentes()->where('status', Aderente::STATUS_ACEITE)->get() as $aderente) {
                    if (
                        $aderente->paragem_lat == $paragem['lat'] &&
                        $aderente->paragem_long == $paragem['lng']
                    ) {
                        broadcast(new ParagemClienteProxima(
                            $aderente->cliente_id,
                            $paragem['nome'],
                            $aderente->cliente->typeUser // segmentação por papel
                        ))->toOthers();

                        if (!$notificado) {
                            broadcast(new ParagemMotoristaProxima(
                                $post->id,
                                $aderente->cliente->nome,
                                $paragem['nome'],
                                $aderente->cliente->typeUser
                            ))->toOthers();

                            $notificado = true;
                        }
                    }
                }

                break;
            }
        }
    }

    private function haversine(float $lat1, float $lng1, float $lat2, float $lng2): float
    {
        $earthRadius = 6371;

        $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 $earthRadius * $c;
    }
}
