<?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;
$idMotorista = (int) ($data['id_motorista'] ?? $data['id_usuario'] ?? 0);

if ($idMotorista <= 0) {
    json_fail('Motorista nao informado.');
}

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

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

    return $idCorrida;
}

function suporte_validar_veiculo_motorista(PDO $pdo, int $idVeiculo, int $idMotorista): ?int
{
    if ($idVeiculo <= 0) {
        return null;
    }

    $stmt = $pdo->prepare('SELECT id FROM veiculos WHERE id = ? AND id_motorista = ? LIMIT 1');
    $stmt->execute([$idVeiculo, $idMotorista]);
    if (!$stmt->fetch()) {
        json_fail('Veiculo nao encontrado para este motorista.', 404);
    }

    return $idVeiculo;
}

try {
    $pdo = db();
    usuario_garantir_motorista($idMotorista, $pdo);

    $usuarioStmt = $pdo->prepare('SELECT id, nome FROM usuarios WHERE id = ? AND tipo = "motorista" LIMIT 1');
    $usuarioStmt->execute([$idMotorista]);
    $usuario = $usuarioStmt->fetch();
    if (!$usuario) {
        json_fail('Motorista 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_motorista($pdo, (int) ($data['id_corrida'] ?? 0), $idMotorista);
        $idVeiculo = suporte_validar_veiculo_motorista($pdo, (int) ($data['id_veiculo'] ?? 0), $idMotorista);

        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, id_veiculo, categoria, subcategoria, prioridade, titulo, descricao, ultima_mensagem_em)
             VALUES (?, "motorista", ?, ?, ?, ?, ?, ?, ?, NOW())'
        );
        $stmt->execute([
            $idMotorista,
            $idCorrida,
            $idVeiculo,
            $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 (?, "motorista", ?, ?, ?, 1, 0)'
        );
        $msg->execute([$idChamado, $idMotorista, (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,
                v.marca AS veiculo_marca,
                v.modelo AS veiculo_modelo,
                v.placa AS veiculo_placa,
                (
                    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 veiculos v ON v.id = sc.id_veiculo
         WHERE sc.id_usuario = ? AND sc.tipo_usuario = "motorista"
         ORDER BY sc.ultima_mensagem_em DESC, sc.id DESC
         LIMIT 100'
    );
    $ticketsStmt->execute([$idMotorista]);
    $chamados = $ticketsStmt->fetchAll();

    $corridasStmt = $pdo->prepare(
        'SELECT c.id, c.status, c.valor, c.forma_pagamento, c.categoria_veiculo,
                c.origem_lat, c.origem_lng, c.origem_endereco,
                c.destino_lat, c.destino_lng, c.destino_endereco,
                c.distancia, c.tempo_estimado, c.criada_em, c.finalizada_em,
                p.nome AS passageiro_nome
         FROM corridas c
         INNER JOIN usuarios p ON p.id = c.id_passageiro
         WHERE c.id_motorista = ?
         ORDER BY c.criada_em DESC
         LIMIT 40'
    );
    $corridasStmt->execute([$idMotorista]);
    $corridas = $corridasStmt->fetchAll();

    $veiculosStmt = $pdo->prepare(
        'SELECT id, marca, modelo, ano_fabricacao, ano_modelo, cor, placa, status
         FROM veiculos
         WHERE id_motorista = ?
         ORDER BY criado_em DESC, id DESC'
    );
    $veiculosStmt->execute([$idMotorista]);
    $veiculos = $veiculosStmt->fetchAll();

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