<?php

namespace App\Http\Controllers;

use App\Models\Post;
use App\Models\Aderente;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Http;
use Kreait\Firebase\Factory;
use Kreait\Firebase\Messaging\CloudMessage;
use Kreait\Firebase\Messaging\Notification;
use Kreait\Firebase\ServiceAccount;
use Kreait\Firebase\Messaging\AndroidConfig;
use Kreait\Firebase\Messaging\ApnsConfig;
use Illuminate\Support\Str;

class PostController extends Controller
{
    public function index()
    {
        return Post::with('user')->latest()->get();
    }
    
    public function active(Request $request)
    {
        $user = $request->user();

        // Verifica se existe boleya ativa (status = 1)
        $active = Post::where('user_id', $user->id)
                      ->where('status', 1)
                      ->exists();

        return response()->json([
            'active' => $active
        ], 200);
    }

public function store(Request $request)
{
    $validated = $request->validate([
        'origem' => 'required|string',
        'destino' => 'required|string',
        'preco' => 'required|numeric',
        'origem_lat' => 'required|numeric',
        'origem_lng' => 'required|numeric',
        'destino_lat' => 'required|numeric',
        'destino_lng' => 'required|numeric',
    ]);

    // 🔥 Pegar dados do usuário logado
    $user = Auth::user();
    
    if (!$user) {
        return response()->json([
            'success' => false,
            'message' => 'Usuário não autenticado.'
        ], 401);
    }

    $validated['user_id'] = $user->id;
    $validated['assentos'] = $user->assento ?? 0; // Usar lugares do usuário ou 1 por padrão
    $validated['cor_carro'] = $user->marca_carro . '-' . $user->cor_carro; // Ex: "Toyota-Branco"
    $validated['matricula'] = $user->matricula;
    $validated['status'] = 1;

    // Verificar se já existe boleya ativa com esta matrícula
    if (Post::where('matricula', $validated['matricula'])
        ->whereIn('status', [
            Post::STATUS_DISPONIVEL,      // 1
            Post::STATUS_EM_ANDAMENTO,    // 2
            Post::STATUS_COM_PARAGEM      // 3
        ])
        ->exists()) {
        return response()->json([
            'success' => false,
            'message' => 'Já existe uma boleya ativa com esta matrícula.'
        ], 422);
    }

    $post = Post::create(array_merge($validated, [
        'notificado_motorista' => false,
        'notificado_aderente' => false,
    ]));

    $fcm_token = $request->fcm_token;

    // Chamar notificação para todos passageiros
    $this->notifyPassengers($post, $fcm_token);

    return response()->json([
        'success' => true,
        'message' => 'Boleya criada com sucesso.',
        'boleya' => $post,
    ], 201);
}

protected function notifyPassengers(Post $boleya,$fcm_token)
{
    try {
        $serviceAccountPath = storage_path('app/firebase/firebase_credentials.json');
        $factory = (new Factory)->withServiceAccount($serviceAccountPath);
        $messaging = $factory->createMessaging();

        // Título e corpo da notificação
        $title = 'Nova boleya disponível 🚖';
        $body  = "De {$boleya->origem} para {$boleya->destino}, preço {$boleya->preco} kz";

        // Cria a mensagem para o tópico "passageiros"
        //$message = CloudMessage::withTarget('topic', 'passageiros')
        $message = CloudMessage::withTarget('token', $fcm_token)
            ->withNotification(Notification::create($title, $body))
            ->withData([
                'boleya_id' => (string) $boleya->id,
                'title'     => $title,
                'body'      => $body,
                'screen'    => 'boleya_detail', // Opcional para deep link
            ])
            ->withAndroidConfig(AndroidConfig::fromArray([
                'priority' => 'high',
                'notification' => [
                    'channel_id' => 'boleya_high_channel', // 👈 mesmo do Flutter
                    'sound'      => 'default',
                    'title'      => $title,
                    'body'       => $body,
                    'click_action' => 'FLUTTER_NOTIFICATION_CLICK', // Para abrir app
                ],
            ]))
            ->withApnsConfig(ApnsConfig::fromArray([
                'headers' => [
                    'apns-priority' => '10', // entrega imediata
                ],
                'payload' => [
                    'aps' => [
                        'alert' => [
                            'title' => $title,
                            'body'  => $body,
                        ],
                        'sound' => 'default',
                        'badge' => 1,
                        'content-available' => 1,
                    ],
                ],
            ]));

        // Envia a mensagem
        $messaging->send($message);

        \Log::info('✅ Notificação enviada com sucesso para passageiros.');
    } catch (\Throwable $e) {
        \Log::error('❌ Erro ao enviar notificação: ' . $e->getMessage());
    }
}



public function atualizarStatus(Request $request)
{
    try {
        $request->validate([
            'status' => 'required|integer|in:1,2,3,4',
        ]);

        // 👤 Pega o motorista autenticado
        $motorista = $request->user();

        if (!$motorista) {
            return response()->json([
                'success' => false,
                'message' => 'Usuário não autenticado.'
            ], 401);
        }

        // 🔍 Busca a boleya ativa desse motorista
        $boleya = Post::where('user_id', $motorista->id)
                      ->whereIn('status', [1, 2, 3]) // apenas boleyas ativas
                      ->latest()
                      ->first();

        if (!$boleya) {
            return response()->json([
                'success' => false,
                'message' => 'Nenhuma boleya ativa encontrada para este motorista.'
            ], 404);
        }

        // ✅ Atualiza o status
        $boleya->status = $request->status;
        $boleya->save();

        \Log::info('🚗 Boleya terminada pelo motorista', [
            'motorista_id' => $motorista->id,
            'boleya_id' => $boleya->id,
            'novo_status' => $request->status
        ]);

        return response()->json([
            'success' => true,
            'boleya' => $boleya
        ]);
    } catch (\Exception $e) {
        \Log::error('❌ Erro ao atualizar boleya:', [
            'error' => $e->getMessage(),
            'trace' => $e->getTraceAsString()
        ]);

        return response()->json([
            'success' => false,
            'message' => 'Erro interno ao atualizar boleya'
        ], 500);
    }
}



public function listarAderidos(Request $request)
{
    $user = $request->user();

    if (!$user) {
        return response()->json(['error' => 'Usuário não autenticado'], 401);
    }

    try {
        $posts = $user->postsAderidos()
            ->with('motorista')
            ->wherePivotIn('status', [Aderente::STATUS_ACEITO])
            ->orderBy('posts.created_at', 'desc')
            ->take(10)
            ->get();

        return response()->json([
            'posts' => $posts
        ]);
    } catch (\Exception $e) {
        \Log::error("Erro em listarAderidos: " . $e->getMessage(), [
            'trace' => $e->getTraceAsString()
        ]);
        return response()->json([
            'error' => 'Erro interno',
            'message' => config('app.debug') ? $e->getMessage() : 'internal_server_error'
        ], 500);
    }
}



public function listarAderidosMT(Request $request)
{
    $user = $request->user();

    if (!$user) {
        return response()->json(['error' => 'Usuário não autenticado'], 401);
    }

    try {
        $posts = \App\Models\Post::with('motorista') // carrega também o usuário dono do post
            ->where('user_id', $user->id) // só posts do user logado
            ->where('status', \App\Models\Post::STATUS_TERMINADO) // status = 4 (terminado)
            ->latest('created_at')
            ->take(10)
            ->get();

        return response()->json([
            'posts' => $posts
        ]);
    } catch (\Exception $e) {
        \Log::error("Erro em listarAderidosMT: " . $e->getMessage());
        return response()->json([
            'error'   => 'Erro interno',
            'message' => $e->getMessage()
        ], 500);
    }
}

public function buscarLocalizacao(Request $request)
{
    $query = $request->input('query');

    if (!$query || strlen($query) < 3) {
        return response()->json(['error' => 'Consulta inválida'], 400);
    }

    // 🔄 Normaliza a string (remove acentos, converte para minúsculas)
    $queryNormalizado = Str::lower(Str::ascii($query));

    // 🔍 Busca flexível em origem
    $porOrigem = Endereco::whereRaw("LOWER(origem) COLLATE utf8_general_ci LIKE ?", ["%{$queryNormalizado}%"])
        ->orderByDesc('id')
        ->first();

    // 🔍 Busca flexível em destino
    $porDestino = Endereco::whereRaw("LOWER(destino) COLLATE utf8_general_ci LIKE ?", ["%{$queryNormalizado}%"])
        ->orderByDesc('id')
        ->first();

    $resultado = $porOrigem ?? $porDestino;

    if (!$resultado) {
        return response()->json(['error' => 'Localização não encontrada'], 404);
    }

    return response()->json([
        'tipo' => $porOrigem ? 'origem' : 'destino',
        'local' => $porOrigem ? $resultado->origem : $resultado->destino,
        'lat' => $porOrigem ? $resultado->origem_lat : $resultado->destino_lat,
        'lng' => $porOrigem ? $resultado->origem_lng : $resultado->destino_lng,
    ]);
}


}
