<?php
declare(strict_types=1);

require_once __DIR__ . '/../config/helpers.php';
require_once __DIR__ . '/../config/suporte_helpers.php';

$method = $_SERVER['REQUEST_METHOD'] ?? 'GET';
$data = $method === 'POST' ? input_json() : $_GET;
$idPassageiro = (int) ($data['id_passageiro'] ?? $data['id_usuario'] ?? 0);
$idChamado = (int) ($data['id_chamado'] ?? $data['id'] ?? 0);

if ($idPassageiro <= 0 || $idChamado <= 0) {
    json_fail('Chamado ou passageiro nao informado.');
}

function suporte_buscar_chamado_passageiro(PDO $pdo, int $idChamado, int $idPassageiro): array
{
    $stmt = $pdo->prepare(
        'SELECT sc.*,
                u.nome AS usuario_nome,
                u.email AS usuario_email,
                u.celular AS usuario_celular,
                c.status AS corrida_status,
                c.valor AS corrida_valor,
                c.forma_pagamento AS corrida_pagamento,
                c.criada_em AS corrida_criada_em,
                m.nome AS motorista_nome
         FROM suporte_chamados sc
         INNER JOIN usuarios u ON u.id = sc.id_usuario
         LEFT JOIN corridas c ON c.id = sc.id_corrida
         LEFT JOIN usuarios m ON m.id = c.id_motorista
         WHERE sc.id = ? AND sc.id_usuario = ? AND sc.tipo_usuario = "passageiro"
         LIMIT 1'
    );
    $stmt->execute([$idChamado, $idPassageiro]);
    $chamado = $stmt->fetch();
    if (!$chamado) {
        json_fail('Chamado nao encontrado.', 404);
    }

    return $chamado;
}

try {
    $pdo = db();
    $chamado = suporte_buscar_chamado_passageiro($pdo, $idChamado, $idPassageiro);

    if ($method === 'POST') {
        $mensagem = trim((string) ($data['mensagem'] ?? ''));
        if (strlen($mensagem) < 1) {
            json_fail('Digite uma mensagem.');
        }

        $usuarioStmt = $pdo->prepare('SELECT nome FROM usuarios WHERE id = ? LIMIT 1');
        $usuarioStmt->execute([$idPassageiro]);
        $nomePassageiro = (string) ($usuarioStmt->fetchColumn() ?: 'Passageiro');

        $novoStatus = (string) $chamado['status'];
        if (in_array($novoStatus, ['resolvido', 'fechado'], true)) {
            $novoStatus = 'aberto';
        } elseif ($novoStatus === 'aguardando_motorista') {
            $novoStatus = 'em_atendimento';
        }

        $pdo->beginTransaction();

        $msg = $pdo->prepare(
            'INSERT INTO suporte_mensagens
             (id_chamado, remetente_tipo, id_remetente, nome_remetente, mensagem, lido_motorista, lido_admin)
             VALUES (?, "passageiro", ?, ?, ?, 1, 0)'
        );
        $msg->execute([$idChamado, $idPassageiro, $nomePassageiro, $mensagem]);

        $up = $pdo->prepare(
            'UPDATE suporte_chamados
             SET status = ?, ultima_mensagem_em = NOW()
             WHERE id = ?'
        );
        $up->execute([$novoStatus, $idChamado]);

        $pdo->commit();
    }

    $read = $pdo->prepare(
        'UPDATE suporte_mensagens
         SET lido_motorista = 1
         WHERE id_chamado = ? AND remetente_tipo = "admin"'
    );
    $read->execute([$idChamado]);

    $chamado = suporte_buscar_chamado_passageiro($pdo, $idChamado, $idPassageiro);

    $mensagensStmt = $pdo->prepare(
        'SELECT id, remetente_tipo, id_remetente, nome_remetente, mensagem, anexo_url, criado_em
         FROM suporte_mensagens
         WHERE id_chamado = ?
         ORDER BY criado_em ASC, id ASC'
    );
    $mensagensStmt->execute([$idChamado]);

    json_ok([
        'categorias' => [
            'corrida' => 'Corrida especifica',
            'conta' => 'Conta e cadastro',
            'ganhos_pagamentos' => 'Pagamento e carteira',
            'item_encontrado' => 'Item perdido',
            'seguranca' => 'Seguranca',
            'problema_app' => 'Problema no app',
            'outros' => 'Outros assuntos',
        ],
        'prioridades' => suporte_prioridades(),
        'statuses' => suporte_statuses(),
        'chamado' => $chamado,
        'mensagens' => $mensagensStmt->fetchAll(),
        'message' => $method === 'POST' ? 'Mensagem enviada.' : 'Chamado carregado.',
    ]);
} catch (Throwable $e) {
    if (isset($pdo) && $pdo->inTransaction()) {
        $pdo->rollBack();
    }
    json_fail('Erro ao carregar chamado.', 500, ['error' => $e->getMessage()]);
}
