<?php

use Illuminate\Support\Facades\Broadcast;
use App\Models\Post;
use App\Models\Aderente;

/*
|--------------------------------------------------------------------------
| Canal global de boleyas
|--------------------------------------------------------------------------
| Usado para eventos como NovaBoleyaDisponivel.
| Apenas clientes autenticados podem escutar.
*/
Broadcast::channel('boleyas.global', function ($user) {
    return $user->typeUser === 'cliente'; // clientes
});

/*
|--------------------------------------------------------------------------
| Canal privado do cliente
|--------------------------------------------------------------------------
| Usado para eventos direcionados ao cliente, ex: notificações.
*/
Broadcast::channel('cliente.{clienteId}', function ($user, $clienteId) {
    return $user->typeUser === 'user' && $user->id == (int) $clienteId;
});

/*
|--------------------------------------------------------------------------
| Canal de solicitações de aderentes
|--------------------------------------------------------------------------
| Usado para eventos como AderenteCreated.
| Apenas o motorista da boleya ou o cliente podem escutar.
*/
Broadcast::channel('post.{postId}.{typeUser}', function ($user, $postId, $typeUser) {
    if ($typeUser === 'motorista' && $user->typeUser === 'motorista') {
        $post = Post::find($postId);
        return $post && $user->id === $post->user_id;
    }

    if ($typeUser === 'cliente' && $user->typeUser === 'cliente') {
        return Aderente::where('post_id', $postId)
            ->where('cliente_id', $user->id)
            ->exists();
    }

    return false;
});

/*
|--------------------------------------------------------------------------
| Canal de status da boleya (assentos, localização, etc.)
|--------------------------------------------------------------------------
| Motorista e aderentes aceites podem escutar eventos como RideSeatsUpdated.
*/
Broadcast::channel('post.{postId}.status', function ($user, $postId) {
    $post = Post::find($postId);
    if (!$post) return false;

    // Motorista
    if ($user->typeUser === 'motorista' && $user->id === $post->user_id) return true;

    // Aderente aceite
    if ($user->typeUser === 'cliente') {
        return Aderente::where('post_id', $postId)
            ->where('cliente_id', $user->id)
            ->where('status', Aderente::STATUS_ACEITE)
            ->exists();
    }

    return false;
});

/*
|--------------------------------------------------------------------------
| Canal de ride específico
|--------------------------------------------------------------------------
| Apenas motorista dono da boleya.
*/
Broadcast::channel('ride.{postId}', function ($user, $postId) {
    $post = Post::find($postId);
    return $user->typeUser === 'motorista' && $post && $user->id === $post->user_id;
});

/*
|--------------------------------------------------------------------------
| Canal GPS do motorista
|--------------------------------------------------------------------------
| Somente o motorista dono do ID pode transmitir localização.
*/
Broadcast::channel('gps.{motoristaId}', function ($user, $motoristaId) {
    return $user->typeUser === 'drive' && $user->id === $motoristaId;
});
