setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $prefix = $p['database_prefix']; $id = 20792; echo "
\n";

// Product rows
$cnt = $pdo->query("SELECT COUNT(*) FROM {$prefix}omnibus_eu_free WHERE id_product = $id")->fetchColumn();
echo "=== Produkt $id: $cnt wierszy ===\n";

// Table structure
echo "\n=== Kolumny tabeli ===\n";
$stmt = $pdo->query("DESCRIBE {$prefix}omnibus_eu_free");
foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) {
    echo "{$row['Field']} ({$row['Type']})\n";
}

// Combinations
$combCount = $pdo->query("SELECT COUNT(*) FROM {$prefix}product_attribute WHERE id_product = $id")->fetchColumn();
echo "\n=== Kombinacje: $combCount ===\n";

// SELECT speed
$start = microtime(true);
$pdo->query("SELECT * FROM {$prefix}omnibus_eu_free WHERE id_product = $id AND is_last = 1")->fetchAll();
echo "SELECT is_last=1: " . round((microtime(true) - $start) * 1000, 1) . " ms\n";

// All action hooks with modules
echo "\n=== actionProductAttributeUpdate ===\n";
$stmt = $pdo->query("
    SELECT m.name, hm.position
    FROM {$prefix}hook h
    JOIN {$prefix}hook_module hm ON h.id_hook = hm.id_hook
    JOIN {$prefix}module m ON hm.id_module = m.id_module AND m.active = 1
    WHERE h.name = 'actionProductAttributeUpdate'
    ORDER BY hm.position
");
foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) {
    echo "  {$row['name']} (pos {$row['position']})\n";
}

echo "\n=== actionProductUpdate ===\n";
$stmt = $pdo->query("
    SELECT m.name, hm.position
    FROM {$prefix}hook h
    JOIN {$prefix}hook_module hm ON h.id_hook = hm.id_hook
    JOIN {$prefix}module m ON hm.id_module = m.id_module AND m.active = 1
    WHERE h.name = 'actionProductUpdate'
    ORDER BY hm.position
");
foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) {
    echo "  {$row['name']} (pos {$row['position']})\n";
}

echo "\n=== actionProductSave ===\n";
$stmt = $pdo->query("
    SELECT m.name, hm.position
    FROM {$prefix}hook h
    JOIN {$prefix}hook_module hm ON h.id_hook = hm.id_hook
    JOIN {$prefix}module m ON hm.id_module = m.id_module AND m.active = 1
    WHERE h.name = 'actionProductSave'
    ORDER BY hm.position
");
foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) {
    echo "  {$row['name']} (pos {$row['position']})\n";
}

echo "\n=== actionObjectProductUpdateAfter ===\n";
$stmt = $pdo->query("
    SELECT m.name, hm.position
    FROM {$prefix}hook h
    JOIN {$prefix}hook_module hm ON h.id_hook = hm.id_hook
    JOIN {$prefix}module m ON hm.id_module = m.id_module AND m.active = 1
    WHERE h.name = 'actionObjectProductUpdateAfter'
    ORDER BY hm.position
");
foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) {
    echo "  {$row['name']} (pos {$row['position']})\n";
}

// How many times does actionProductAttributeUpdate fire?
echo "\n=== Ile razy odpala sie actionProductAttributeUpdate ===\n";
echo "Raz na kazda kombinacje = $combCount razy!\n";
echo "Kazdy modul na tym hooku odpala sie $combCount razy.\n";

// Check gm_omniprice module
echo "\n=== gm_omniprice hooki ===\n";
$stmt = $pdo->query("
    SELECT h.name, hm.position
    FROM {$prefix}hook h
    JOIN {$prefix}hook_module hm ON h.id_hook = hm.id_hook
    JOIN {$prefix}module m ON hm.id_module = m.id_module
    WHERE m.name = 'gm_omniprice'
    ORDER BY h.name
");
foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) {
    echo "  {$row['name']} (pos {$row['position']})\n";
}

// Check creativeelements module hooks
echo "\n=== creativeelements hooki actionProduct* ===\n";
$stmt = $pdo->query("
    SELECT h.name, hm.position
    FROM {$prefix}hook h
    JOIN {$prefix}hook_module hm ON h.id_hook = hm.id_hook
    JOIN {$prefix}module m ON hm.id_module = m.id_module
    WHERE m.name = 'creativeelements' AND h.name LIKE 'action%'
    ORDER BY h.name
");
foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) {
    echo "  {$row['name']} (pos {$row['position']})\n";
}

echo "
\n";