/**
 * Zmiana statusu → jeśli processing, atomicznie zwiększ licznik w DB
 */
add_action('woocommerce_order_status_changed', function($order_id, $old_status, $new_status) {
    $order = wc_get_order($order_id);
    if (!$order) return;

    $order->update_meta_data('_previous_status', $old_status);
    $order->save_meta_data();

    if ($new_status === 'processing') {
        global $wpdb;
        $exists = $wpdb->get_var($wpdb->prepare(
            "SELECT meta_id FROM {$wpdb->postmeta} WHERE post_id = %d AND meta_key = '_fakturownia_counter' LIMIT 1",
            $order_id
        ));
        if ($exists) {
            $wpdb->query($wpdb->prepare(
                "UPDATE {$wpdb->postmeta} SET meta_value = meta_value + 1
                 WHERE post_id = %d AND meta_key = '_fakturownia_counter'",
                $order_id
            ));
        } else {
            $wpdb->insert($wpdb->postmeta, [
                'post_id'    => $order_id,
                'meta_key'   => '_fakturownia_counter',
                'meta_value' => 1,
            ]);
        }
        wp_cache_delete($order_id, 'post_meta');
    }
}, 5, 3);

/**
 * Filtr webhooka — przepuszcza dokładnie 1 żądanie na każdą zmianę na processing
 */
add_filter('woocommerce_webhook_should_deliver', function($should_deliver, $webhook, $arg) {
    if ($webhook->get_name() !== 'Intum webhook order update') {
        return $should_deliver;
    }

    $order = wc_get_order($arg);
    if (!$order) return false;

    $current  = $order->get_status();
    $previous = $order->get_meta('_previous_status');
    $logger   = wc_get_logger();
    $ctx      = ['source' => 'fakturownia-webhook'];
    $order_id = $order->get_id();

    // Blokuj wszystko co nie jest processing
    if ($current !== 'processing') {
        $logger->debug(sprintf(
            '[ZABLOKOWANO] Zamówienie #%d | %s → %s (nie processing) | Czas: %s',
            $order_id, $previous ?: '?', $current, current_time('Y-m-d H:i:s')
        ), $ctx);
        return false;
    }

    // Dedup w obrębie tego samego procesu PHP (synchroniczne duplikaty)
    static $delivered = [];
    if (isset($delivered[$order_id])) {
        $logger->debug(sprintf(
            '[ZABLOKOWANO] Zamówienie #%d | Duplikat w tej samej sesji | Czas: %s',
            $order_id, current_time('Y-m-d H:i:s')
        ), $ctx);
        return false;
    }

    // Atomiczny dekrement — tylko jeśli licznik > 0 (odporna na race condition)
    global $wpdb;
    $result = $wpdb->query($wpdb->prepare(
        "UPDATE {$wpdb->postmeta} SET meta_value = meta_value - 1
         WHERE post_id = %d AND meta_key = '_fakturownia_counter' AND CAST(meta_value AS SIGNED) > 0",
        $order_id
    ));

    if ($result === 0) {
        $logger->debug(sprintf(
            '[ZABLOKOWANO] Zamówienie #%d | Brak slotów (licznik = 0) | Czas: %s',
            $order_id, current_time('Y-m-d H:i:s')
        ), $ctx);
        return false;
    }

    wp_cache_delete($order_id, 'post_meta');
    $delivered[$order_id] = true;

    $logger->info(sprintf(
        '[PRZEPUSZCZONO] Zamówienie #%d | Status: %s → %s | Klient: %s %s (%s) | Wartość: %s %s | Webhook: %s | Czas: %s',
        $order_id,
        $previous ?: 'brak',
        $current,
        $order->get_billing_first_name(),
        $order->get_billing_last_name(),
        $order->get_billing_email(),
        $order->get_total(),
        $order->get_currency(),
        $webhook->get_name(),
        current_time('Y-m-d H:i:s')
    ), $ctx);

    return $should_deliver;
}, 10, 3);

/**
 * Reset licznika błędów — webhook nigdy nie zostanie wyłączony przez WC
 */
add_action('woocommerce_webhook_delivery', function($http_args, $response, $duration, $arg, $webhook_id) {
    $webhook = new WC_Webhook($webhook_id);
    if ($webhook->get_name() !== 'Intum webhook order update') return;
    if ($webhook->get_failure_count() > 0) {
        $webhook->set_failure_count(0);
        $webhook->save();
    }
}, 10, 5);