<?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);

if ($idPassageiro <= 0) {
    json_fail('Passageiro nao informado.');
}

function suporte_categorias_passageiro(): array
{
    return [
        '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',
    ];
}

function suporte_validar_corrida_passageiro(PDO $pdo, int $idCorrida, int $idPassageiro): ?int
{
    if ($idCorrida <= 0) {
        return null;
    }

    $stmt = $pdo->prepare('SELECT id FROM corridas WHERE id = ? AND id_passageiro = ? LIMIT 1');
    $stmt->execute([$idCorrida, $idPassageiro]);
    if (!$stmt->fetch()) {
        json_fail('Corrida nao encontrada para este passageiro.', 404);
    }

    return $idCorrida;
}

try {
    $pdo = db();

    $usuarioStmt = $pdo->prepare('SELECT id, nome FROM usuarios WHERE id = ? LIMIT 1');
    $usuarioStmt->execute([$idPassageiro]);
    $usuario = $usuarioStmt->fetch();
    if (!$usuario) {
        json_fail('Passageiro nao encontrado.', 404);
    }

    if ($method === 'POST') {
        $categorias = suporte_categorias();
        $prioridades = suporte_prioridades();
        $categoria = suporte_normalizar_opcao((string) ($data['categoria'] ?? 'outros'), $categorias, 'outros');
        $prioridade = suporte_normalizar_opcao((string) ($data['prioridade'] ?? 'normal'), $prioridades, 'normal');
        $titulo = trim((string) ($data['titulo'] ?? ''));
        $descricao = trim((string) ($data['descricao'] ?? $data['mensagem'] ?? ''));
        $subcategoria = trim((string) ($data['subcategoria'] ?? ''));
        $idCorrida = suporte_validar_corrida_passageiro($pdo, (int) ($data['id_corrida'] ?? 0), $idPassageiro);

        if (strlen($titulo) < 4) {
            json_fail('Informe um titulo com pelo menos 4 caracteres.');
        }
        if (strlen($descricao) < 10) {
            json_fail('Descreva o problema com pelo menos 10 caracteres.');
        }

        $pdo->beginTransaction();

        $stmt = $pdo->prepare(
            'INSERT INTO suporte_chamados
             (id_usuario, tipo_usuario, id_corrida, categoria, subcategoria, prioridade, titulo, descricao, ultima_mensagem_em)
             VALUES (?, "passageiro", ?, ?, ?, ?, ?, ?, NOW())'
        );
        $stmt->execute([
            $idPassageiro,
            $idCorrida,
            $categoria,
            $subcategoria === '' ? null : $subcategoria,
            $prioridade,
            $titulo,
            $descricao,
        ]);
        $idChamado = (int) $pdo->lastInsertId();

        $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, (string) $usuario['nome'], $descricao]);

        $pdo->commit();

        json_ok([
            'id_chamado' => $idChamado,
            'message' => 'Chamado aberto com sucesso.',
        ]);
    }

    $ticketsStmt = $pdo->prepare(
        'SELECT sc.*,
                c.status AS corrida_status,
                c.valor AS corrida_valor,
                c.criada_em AS corrida_criada_em,
                m.nome AS motorista_nome,
                (
                    SELECT sm.mensagem
                    FROM suporte_mensagens sm
                    WHERE sm.id_chamado = sc.id
                    ORDER BY sm.criado_em DESC, sm.id DESC
                    LIMIT 1
                ) AS ultima_mensagem,
                (
                    SELECT COUNT(*)
                    FROM suporte_mensagens sm
                    WHERE sm.id_chamado = sc.id
                      AND sm.remetente_tipo = "admin"
                      AND sm.lido_motorista = 0
                ) AS nao_lidas
         FROM suporte_chamados sc
         LEFT JOIN corridas c ON c.id = sc.id_corrida
         LEFT JOIN usuarios m ON m.id = c.id_motorista
         WHERE sc.id_usuario = ? AND sc.tipo_usuario = "passageiro"
         ORDER BY sc.ultima_mensagem_em DESC, sc.id DESC
         LIMIT 100'
    );
    $ticketsStmt->execute([$idPassageiro]);
    $chamados = $ticketsStmt->fetchAll();

    $corridasStmt = $pdo->prepare(
        'SELECT c.id, c.status, c.valor, c.forma_pagamento, c.criada_em, c.finalizada_em,
                m.nome AS motorista_nome
         FROM corridas c
         LEFT JOIN usuarios m ON m.id = c.id_motorista
         WHERE c.id_passageiro = ?
         ORDER BY c.criada_em DESC
         LIMIT 40'
    );
    $corridasStmt->execute([$idPassageiro]);

    json_ok([
        'categorias' => suporte_categorias_passageiro(),
        'prioridades' => suporte_prioridades(),
        'statuses' => suporte_statuses(),
        'chamados' => $chamados,
        'corridas' => $corridasStmt->fetchAll(),
    ]);
} catch (Throwable $e) {
    if (isset($pdo) && $pdo->inTransaction()) {
        $pdo->rollBack();
    }
    json_fail('Erro ao processar suporte.', 500, ['error' => $e->getMessage()]);
}
