<?php
if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

/**
 * Sepetle ilgili tüm işlemleri yönetir.
 */
class KNSDD_Cart {
    /**
     * Re-entrancy guard for fee cleanup: when true, reset() won't remove fees
     * by session names, preventing mid-calculation removal.
     */
    private static $is_applying = false;

    public function __construct() {
        add_action( 'woocommerce_before_calculate_totals', array( $this, 'reset_prices_and_discounts' ), 10 );
        add_action( 'woocommerce_before_calculate_totals', array( $this, 'apply_all_discounts' ), 20 );
        add_action( 'woocommerce_checkout_create_order_fee_item', array( $this, 'add_rule_id_to_order_fee' ), 20, 4 );
        // Ürün satırlarına uygulanan indirimleri sipariş kalem meta'larına aktarmak için
        add_action( 'woocommerce_checkout_create_order_line_item', array( $this, 'add_rule_meta_to_order_line_item' ), 20, 4 );
    }

    /** Debug helper - disabled in production */
    private static function debug( $label, $data = null ) {
        // Debug logging devre dışı - production için kaldırıldı
        return;
    }

    /**
     * Her hesaplama öncesi tüm indirimleri ve fiyat değişikliklerini sıfırlar.
     * Bu, sepet güncellendiğinde çifte indirim uygulanmasını engeller.
     */
    public function reset_prices_and_discounts( $cart ) {
        if ( is_admin() && ! defined( 'DOING_AJAX' ) ) { return; }

        // Önceki indirim ücretini temizle
        // WooCommerce'te doğrudan WC_Cart::remove_fee() yok; mevcut ücretler içinden bizim ücreti kaldır.
        if ( method_exists( $cart, 'get_fees' ) ) {
            $fees_api = method_exists( $cart, 'fees_api' ) ? $cart->fees_api() : null;
            $fees     = $cart->get_fees();
            // Sepet toplamı indirimi kampanya adı
            $campaign_fee_name = class_exists('KNSDD_Utils') && method_exists('KNSDD_Utils','get_campaign_name_by_type')
                ? KNSDD_Utils::get_campaign_name_by_type( 'cart_total_discount' )
                : '';
            // Session'da tutulan, bu request'te eklentinin eklediği fee adları (güvenli temizlik için)
            $session_fee_names = [];
            if ( function_exists('WC') && WC()->session ) {
                $s = WC()->session->get( 'knsdd_fee_names', [] );
                $session_fee_names = is_array( $s ) ? $s : [];
            }
            foreach ( (array) $fees as $fee_key => $fee ) {
                $fee_name = is_object( $fee ) && isset( $fee->name ) ? $fee->name : '';
                // KNSDD eklentisinin eklediği tüm fee'leri temizle (kampanya isimleri veya özel mesajlar)
                // Not: Re-entrancy sırasında (apply_all_discounts çalışırken) session bazlı eşleşmeyi devre dışı bırak
                $session_match_allowed = ! self::$is_applying;
                $is_knsdd_fee = (
                    $fee_name === __( 'Miktar İndirimi', 'kns-dynamic-discounts-for-woocommerce' ) ||
                    ( ! empty( $campaign_fee_name ) && $fee_name === $campaign_fee_name ) ||
                    strpos( $fee_name, 'N. Ürüne İndirim' ) !== false ||
                    strpos( $fee_name, 'X Al, Y Öde' ) !== false ||
                    ( $session_match_allowed && ! empty( $session_fee_names ) && in_array( $fee_name, $session_fee_names, true ) )
                );
                
                if ( $is_knsdd_fee ) {
                    // Tercihen fees_api() üzerinden kaldır
                    if ( $fees_api && isset( $fees_api->fees[ $fee_key ] ) ) {
                        unset( $fees_api->fees[ $fee_key ] );
                    } elseif ( isset( $cart->fees[ $fee_key ] ) ) {
                        // Geriye dönük: WC_Cart::fees özelliği varsa
                        unset( $cart->fees[ $fee_key ] );
                    }
                }
            }
            // Temizlik sonrası session listesini sıfırla
            if ( function_exists('WC') && WC()->session ) {
                WC()->session->set( 'knsdd_fee_names', [] );
            }
        }
        WC()->session->set( 'knsdd_applied_rule_id', null );

        // Kampanyalar tarafından değiştirilmiş olabilecek fiyatları orijinal haline geri getir.
        foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
            $original_price = $cart_item['data']->get_meta('_knsdd_original_price');
            if ( $original_price ) {
                $cart_item['data']->set_price( $original_price );
                $cart_item['data']->delete_meta_data('_knsdd_original_price');
            }
            
            // BOGO ve diğer kampanyalar için cart_contents içindeki metadata'ları da temizle
            // Bu, sepet miktarı değiştiğinde eski indirimlerin kalmasını engeller
            if ( isset( $cart->cart_contents[ $cart_item_key ] ) ) {
                unset( $cart->cart_contents[ $cart_item_key ]['knsdd_rule_id'] );
                unset( $cart->cart_contents[ $cart_item_key ]['knsdd_group'] );
                unset( $cart->cart_contents[ $cart_item_key ]['knsdd_original_unit_price'] );
                unset( $cart->cart_contents[ $cart_item_key ]['knsdd_discounted_unit_price'] );
                unset( $cart->cart_contents[ $cart_item_key ]['knsdd_line_discount'] );
            }
        }
    }

    /**
     * Tüm geçerli indirim ve kampanyaları sepete uygular.
     */
    public function apply_all_discounts( $cart ) {
        if ( is_admin() && ! defined( 'DOING_AJAX' ) ) { return; }
        // Aynı request içinde yeniden girişleri engelle (WooCommerce bu hook'u birden fazla tetikleyebilir)
        static $processing = false;
        if ( $processing ) { return; }
        $processing = true;
        self::$is_applying = true;
        // Global pasif durumdaysa herhangi bir indirim uygulama
        if ( function_exists('KNSDD_Data::is_globally_enabled') ) {
            // function_exists static çağrılar için uygun değil; sınıf ve metod varlığını korumalı şekilde kontrol edelim
        }
        if ( class_exists('KNSDD_Data') && method_exists('KNSDD_Data', 'is_globally_enabled') ) {
            if ( ! KNSDD_Data::is_globally_enabled() ) {
                return;
            }
        }

        // Önce sepet tutarı kampanyalarını kontrol et
        $this->apply_cart_total_discounts( $cart );

        // BOGO kampanyalarını uygula (sepet bazlı kontrol gerektirir)
        $this->apply_bogo_campaigns( $cart );

        $rules_and_items = $this->get_applicable_rules_for_cart( $cart );
        
        // Müşteri kimliği ve kullanım verileri: sepet içinde aynı kuralın birden fazla ürüne uygulanmasını
        // per-customer limitin kalan hakkına göre sınırlandıracağız.
        $current_user_id = (int) get_current_user_id();
        if ( $current_user_id <= 0 && function_exists('WC') && WC()->customer ) {
            $wc_uid = (int) WC()->customer->get_id();
            if ( $wc_uid > 0 ) { $current_user_id = $wc_uid; }
        }
        $current_user_email = '';
        if ( function_exists('WC') && WC()->customer ) {
            $current_user_email = sanitize_email( WC()->customer->get_email() );
            if ( empty( $current_user_email ) ) {
                $current_user_email = sanitize_email( WC()->customer->get_billing_email() );
            }
        }
        if ( empty( $current_user_email ) && $current_user_id > 0 ) {
            $u = get_user_by( 'id', $current_user_id );
            if ( $u && ! empty( $u->user_email ) ) { $current_user_email = sanitize_email( $u->user_email ); }
        }

        // Grup bazlı tek-kullanım kilidi: aynı grup daha önce bu müşteri tarafından kullanıldıysa o gruba ait tüm kuralları atla
        $groups = [];
        foreach ( $rules_and_items as $rid => $data ) {
            if ( isset( $data['rule']['group'] ) && $data['rule']['group'] !== '' ) {
                $groups[] = $data['rule']['group'];
            }
        }
        // Grup kilidi sistemi kaldırıldı - group_usage_map artık kullanılmıyor

        $rule_ids = array_keys( $rules_and_items );
        $usage_rule_ids = [];
        foreach ( $rule_ids as $rid ) {
            $group_ids = method_exists( 'KNSDD_Data', 'get_tier_group_rule_ids' ) ? KNSDD_Data::get_tier_group_rule_ids( $rid ) : array( $rid );
            foreach ( (array) $group_ids as $gid ) {
                $usage_rule_ids[ (string) $gid ] = true;
            }
        }
        $usage_rule_ids = array_keys( $usage_rule_ids );
        $usage_map = ! empty( $usage_rule_ids ) ? KNSDD_Data::get_usage_for_multiple_rules( $usage_rule_ids ) : [];
        $email_usage_map = [];
        if ( ! empty( $current_user_email ) && ! empty( $usage_rule_ids ) ) {
            $email_usage_map = KNSDD_Data::get_usage_for_multiple_rules_by_email( $usage_rule_ids, $current_user_email );
        }

        // Not: Standart miktar indirimlerini artık negatif ücret (fee) yerine
        // ürün birim fiyatını düşürerek uygularız. Böylece mini sepet ve sepet
        // ekranındaki ara toplam da anında indirimli görünür.
        $total_fee_discount = 0; // Yalnızca özel kampanyalar (örn. sepet tutarı) için kullanılacak
        $applied_rule_id = null;
        $applied_group_name = null;

        foreach ( $rules_and_items as $rule_id => $data ) {
            $rule = $data['rule'];
            $items = $data['items'];

            // Grup kilidi kontrolü kaldırıldı - artık sadece per_customer_limit kontrolü yapılıyor

            // Per-customer limit kalanı kadar ürüne uygula (kademe grubu bazında)
            $remaining_allowance = PHP_INT_MAX; // Varsayılan: sınırsız
            $per_customer_limit = (int) ( $rule['per_customer_limit'] ?? 0 );
            if ( $per_customer_limit > 0 ) {
                $group_rule_ids = method_exists( 'KNSDD_Data', 'get_tier_group_rule_ids' ) ? KNSDD_Data::get_tier_group_rule_ids( $rule_id ) : array( $rule_id );
                $group_user_usage = 0;
                $group_email_usage = 0;
                foreach ( (array) $group_rule_ids as $gid ) {
                    $u = $usage_map[ $gid ] ?? [ 'users' => [] ];
                    if ( $current_user_id > 0 ) {
                        $group_user_usage += isset( $u['users'][ $current_user_id ] ) ? (int) $u['users'][ $current_user_id ] : 0;
                    }
                    if ( ! empty( $current_user_email ) ) {
                        $group_email_usage += isset( $email_usage_map[ $gid ] ) ? (int) $email_usage_map[ $gid ] : 0;
                    }
                }
                $already_used = max( $group_user_usage, $group_email_usage );
                $remaining_allowance = max( 0, $per_customer_limit - $already_used );
                if ( $remaining_allowance <= 0 ) {
                    // Bu müşteri için bu kampanya (kademe grubu) artık uygulanamaz
                    continue;
                }
            }

            // Kural tipine göre yönlendirme yap
            if ( isset( $rule['rule_type'] ) && 'special_campaign' === $rule['rule_type'] ) {
                // Özel kampanyaları KNSDD_Campaigns sınıfına devret
                KNSDD_Campaigns::apply( $cart, $rule, $items );
                $applied_rule_id = $rule_id; // Takip için ID'yi kaydet
                $applied_group_name = isset($rule['group']) ? $rule['group'] : $applied_group_name;
                self::debug( 'special_campaign.apply', [ 'rule_id' => $rule_id, 'group' => $applied_group_name ] );
            } else {
                // Standart miktar indirimlerini fiyat düşürerek uygula
                $applied_on_this_rule = 0;
                foreach ( $items as $item_key => $item ) {
                    if ( $per_customer_limit > 0 && $applied_on_this_rule >= $remaining_allowance ) {
                        // Kalan hak bitti, bu kuralı başka ürüne uygulama
                        break;
                    }
                    if ( empty( $item['data'] ) || ! is_a( $item['data'], 'WC_Product' ) ) { continue; }

                    $product = $item['data'];
                    $qty     = isset( $item['quantity'] ) ? (int) $item['quantity'] : 1;

                    // Orijinal fiyatı bir kez sakla
                    $original_price = $product->get_meta( '_knsdd_original_price' );
                    if ( ! $original_price ) {
                        $product->add_meta_data( '_knsdd_original_price', $product->get_price() );
                    }

                    $unit_price = (float) $product->get_price();
                    $new_unit_price = $unit_price;

                    if ( 'percent' === ( $rule['discount_type'] ?? 'percent' ) ) {
                        $percent = max( 0, min( 100, (float) ( $rule['discount_value'] ?? 0 ) ) );
                        $new_unit_price = $unit_price * ( 1 - ( $percent / 100 ) );
                    } else { // fixed
                        $per_unit_discount = (float) ( $rule['discount_value'] ?? 0 );
                        // Toplam sabit indirim miktarı birim başına uygulanır
                        $new_unit_price = max( 0, $unit_price - $per_unit_discount );
                    }

                    // Fiyat değiştiyse uygula
                    if ( $new_unit_price < $unit_price ) {
                        $product->set_price( $new_unit_price );
                        $applied_rule_id = $rule_id; // Takip için ID'yi kaydet
                        $applied_group_name = isset( $rule['group'] ) ? $rule['group'] : $applied_group_name;

                        // Checkout sırasında sipariş kalemine aktarılacak meta verileri
                        $line_discount = round( ( $unit_price - $new_unit_price ) * $qty, 2 );
                        if ( isset( $cart->cart_contents[ $item_key ] ) ) {
                            $cart->cart_contents[ $item_key ]['knsdd_rule_id'] = $rule_id;
                            if ( isset( $rule['group'] ) ) {
                                $cart->cart_contents[ $item_key ]['knsdd_group'] = $rule['group'];
                            }
                            $cart->cart_contents[ $item_key ]['knsdd_original_unit_price']   = (float) $unit_price;
                            $cart->cart_contents[ $item_key ]['knsdd_discounted_unit_price'] = (float) $new_unit_price;
                            $cart->cart_contents[ $item_key ]['knsdd_line_discount']         = (float) $line_discount;
                            self::debug( 'cart_item.meta_set', [ 'item_key' => $item_key, 'rule_id' => $rule_id, 'group' => isset($rule['group']) ? $rule['group'] : '' , 'line_discount' => $line_discount ] );
                        }
                        $applied_on_this_rule++;
                    }
                }
            }
        }

        // Not: Standart indirimlerde artık ücret eklemiyoruz. Sadece özel kampanyalar
        // toplam ücret olarak eklenir. $total_fee_discount burada kullanılmaz.

        // Takip için en son uygulanan kuralın ID'sini ve grup adını session'a kaydet
        if ( ! is_null( $applied_rule_id ) ) {
            WC()->session->set( 'knsdd_applied_rule_id', $applied_rule_id );
            if ( ! is_null( $applied_group_name ) ) {
                WC()->session->set( 'knsdd_applied_group', $applied_group_name );
            }
            self::debug( 'session.applied', [ 'rule_id' => $applied_rule_id, 'group' => $applied_group_name ] );
        }

        // İşlem bitti, yeniden giriş bayrağını kapat
        self::$is_applying = false;
        $processing = false;
    }

    /**
     * BOGO (A Al, B'ye İndirim) kampanyalarını sepet bazlı uygular.
     * Bu kampanyalar sepetteki farklı ürünler arasında ilişki kurar.
     */
    private function apply_bogo_campaigns( $cart ) {
        if ( ! $cart || $cart->is_empty() ) {
            return;
        }

        // Aktif gruplardan BOGO kurallarını topla
        $all_groups = KNSDD_Data::get_groups();
        $all_group_dates = KNSDD_Data::get_all_group_dates();
        
        $bogo_rules = [];
        foreach ( $all_groups as $group ) {
            if ( KNSDD_Data::is_group_paused( $group ) ) {
                continue;
            }
            
            $dates = isset( $all_group_dates[ $group ] ) ? $all_group_dates[ $group ] : null;
            if ( ! $dates || 'open' !== KNSDD_Utils::get_group_status_info( $dates )['status'] ) {
                continue;
            }
            
            $rules = KNSDD_Data::get_rules_for_group( $group );
            foreach ( $rules as $rule ) {
                if ( isset( $rule['rule_type'] ) 
                    && $rule['rule_type'] === 'special_campaign'
                    && isset( $rule['campaign_type'] )
                    && $rule['campaign_type'] === 'buy_x_get_y_discount' ) {
                    $rule['group'] = $group;
                    $bogo_rules[] = $rule;
                }
            }
        }
        
        if ( empty( $bogo_rules ) ) {
            return;
        }
        
        // Müşteri bilgilerini al (tüm kurallar için ortak)
        $current_user_id = get_current_user_id();
        $current_user_email = '';
        if ( WC()->customer ) {
            $current_user_email = sanitize_email( WC()->customer->get_email() );
            if ( empty( $current_user_email ) ) {
                $current_user_email = sanitize_email( WC()->customer->get_billing_email() );
            }
        }
        
        // Performans: Tüm BOGO kurallarının kullanım verilerini tek seferde çek
        $bogo_rule_ids = array_filter( array_column( $bogo_rules, 'rule_id' ) );
        $usage_map = ! empty( $bogo_rule_ids ) ? KNSDD_Data::get_usage_for_multiple_rules( $bogo_rule_ids ) : [];
        $email_usage_map = [];
        if ( ! empty( $current_user_email ) && ! empty( $bogo_rule_ids ) ) {
            $email_usage_map = KNSDD_Data::get_usage_for_multiple_rules_by_email( $bogo_rule_ids, $current_user_email );
        }
        
        // Grup kilidi için tüm grupları topla
        $bogo_groups = array_filter( array_unique( array_column( $bogo_rules, 'group' ) ) );
        $group_usage_map = [];
        if ( ! empty( $bogo_groups ) ) {
            $group_usage_map = KNSDD_Data::get_group_usage_for_customer( $bogo_groups, $current_user_id, $current_user_email );
        }
        
        // Her BOGO kuralını sepete uygula
        foreach ( $bogo_rules as $rule ) {
            $rule_id = isset( $rule['rule_id'] ) ? $rule['rule_id'] : '';
            if ( empty( $rule_id ) ) {
                continue;
            }
            
            // Müşteri koşullarını kontrol et (login_required, allowed_customers, first_order_only)
            if ( ! KNSDD_Discount_Engine::is_rule_conditions_met( $rule, $current_user_id, $usage_map, $current_user_email, $email_usage_map ) ) {
                continue;
            }
            
            // Grup kilidi kontrolü
            $rule_group = isset( $rule['group'] ) ? $rule['group'] : '';
            if ( ! empty( $rule_group ) && isset( $group_usage_map[ $rule_group ] ) && $group_usage_map[ $rule_group ] ) {
                continue; // Bu gruptan daha önce faydalanmış
            }
            
            // BOGO kampanyasını uygula
            KNSDD_Campaigns::apply( $cart, $rule, [] );
        }
    }

    /**
     * Sepet tutarına göre indirim kampanyalarını uygular.
     * Bu fonksiyon, diğer indirimlerden önce çalışmalıdır.
     */
    private function apply_cart_total_discounts( $cart ) {
        // Global pasif durumdaysa sepet toplamı indirimlerini de uygulama
        if ( class_exists('KNSDD_Data') && method_exists('KNSDD_Data', 'is_globally_enabled') ) {
            if ( ! KNSDD_Data::is_globally_enabled() ) {
                return;
            }
        }
        // Sepet ara toplamını robust şekilde hesapla (before_calculate_totals aşamasında get_subtotal() 0 dönebilir)
        $subtotal_api = (float) $cart->get_subtotal();
        $subtotal_sum = 0.0;
        foreach ( $cart->get_cart() as $ci ) {
            if ( isset( $ci['data'] ) && is_a( $ci['data'], 'WC_Product' ) ) {
                $qty = isset( $ci['quantity'] ) ? (int) $ci['quantity'] : 1;
                $price = (float) $ci['data']->get_price();
                $subtotal_sum += $price * max( 1, $qty );
            }
        }
        $cart_total = max( $subtotal_api, $subtotal_sum );
        $best_rule = KNSDD_Discount_Engine::get_best_cart_total_rule( $cart_total );

        if ( ! $best_rule ) {
            return;
        }

        $discount_amount = 0;
        $discount_value = floatval( $best_rule['discount_value'] );

        if ( $best_rule['discount_type'] === 'percentage' ) {
            $discount_amount = ( $cart_total * $discount_value ) / 100;
        } else { // amount
            $discount_amount = $discount_value;
        }

        if ( $discount_amount > 0 ) {
            // Not: Fee etiketi her zaman nötr kampanya adı olsun. Mesaj metni sadece
            // UI mesajlarında (mini sepet/sepet/ödeme) gösterilir; toplam satırına taşınmaz.
            $fee_name = KNSDD_Utils::get_campaign_name_by_type( $best_rule['campaign_type'] );
            $cart->add_fee( $fee_name, -$discount_amount, false );
            // Güvenli temizlik için bu fee adını session'da takip et
            if ( function_exists('WC') && WC()->session ) {
                $names = WC()->session->get( 'knsdd_fee_names', [] );
                if ( ! is_array( $names ) ) { $names = []; }
                $names[] = $fee_name;
                $names = array_values( array_unique( $names ) );
                WC()->session->set( 'knsdd_fee_names', $names );
            }
            
            // Takip için kural ID'sini ve grup adını session'a kaydet
            WC()->session->set( 'knsdd_applied_rule_id', $best_rule['rule_id'] );
            if ( isset( $best_rule['group'] ) ) {
                WC()->session->set( 'knsdd_applied_group', $best_rule['group'] );
            }
        }
    }

    /**
     * Sepetteki her ürün için en iyi kuralı bulur ve kurallara göre ürünleri gruplar.
     */
    private function get_applicable_rules_for_cart( $cart ) {
        $rules_and_items = [];
        foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
                        $best_rule = KNSDD_Discount_Engine::get_best_applicable_rule( $cart_item['product_id'], $cart_item['quantity'] );
            if ( $best_rule && ! empty( $best_rule['rule_id'] ) ) {
                $rule_id = $best_rule['rule_id'];
                if ( ! isset( $rules_and_items[ $rule_id ] ) ) {
                    $rules_and_items[ $rule_id ] = [
                        'rule' => $best_rule,
                        'items' => []
                    ];
                }
                $rules_and_items[ $rule_id ]['items'][ $cart_item_key ] = $cart_item;
            }
        }
        return $rules_and_items;
    }
    
    /**
     * Kural ID'sini siparişteki ücret satırına meta olarak ekler.
     */
    public function add_rule_id_to_order_fee( $item, $fee_key, $fee, $order ) {
        $rule_id = WC()->session->get( 'knsdd_applied_rule_id' );
        if ( ! empty( $rule_id ) && $fee->name === __( 'Miktar İndirimi', 'kns-dynamic-discounts-for-woocommerce' ) ) {
            $item->add_meta_data( '_knsdd_rule_id', $rule_id, true );
            $group = WC()->session->get( 'knsdd_applied_group' );
            if ( ! empty( $group ) ) {
                $item->add_meta_data( '_knsdd_group', $group, true );
            }
            self::debug( 'order_fee.meta_set_miktar_indirimi', [ 'rule_id' => $rule_id, 'group' => isset($group)?$group:'' ] );
        }
        // Sepet tutarı kampanyaları için de meta ekle
        if ( ! empty( $rule_id ) ) {
            $campaign_name = KNSDD_Utils::get_campaign_name_by_type( 'cart_total_discount' );
            if ( $fee->name === $campaign_name ) {
                $item->add_meta_data( '_knsdd_rule_id', $rule_id, true );
                $group = WC()->session->get( 'knsdd_applied_group' );
                if ( ! empty( $group ) ) {
                    $item->add_meta_data( '_knsdd_group', $group, true );
                }
                self::debug( 'order_fee.meta_set_cart_total', [ 'rule_id' => $rule_id, 'group' => isset($group)?$group:'' ] );
            }
        }
    }
    public function add_rule_meta_to_order_line_item( $item, $cart_item_key, $values, $order ) {
        // Cart item içine apply_all_discounts sırasında koyduğumuz verileri siparişe yazalım
        $rule_id = isset( $values['knsdd_rule_id'] ) ? $values['knsdd_rule_id'] : '';
        if ( ! empty( $rule_id ) ) {
            $item->add_meta_data( '_knsdd_rule_id', $rule_id, true );
            self::debug( 'order_line.meta_set_rule', [ 'order_item_id' => $item->get_id(), 'cart_item_key' => $cart_item_key, 'rule_id' => $rule_id ] );
        }

        $group = isset( $values['knsdd_group'] ) ? $values['knsdd_group'] : '';
        if ( ! empty( $group ) ) {
            $item->add_meta_data( '_knsdd_group', $group, true );
            self::debug( 'order_line.meta_set_group', [ 'order_item_id' => $item->get_id(), 'cart_item_key' => $cart_item_key, 'group' => $group ] );
        }

        $line_discount = isset( $values['knsdd_line_discount'] ) ? (float) $values['knsdd_line_discount'] : 0.0;
        if ( $line_discount > 0 ) {
            $item->add_meta_data( '_knsdd_line_discount', round( $line_discount, 2 ), true );
            self::debug( 'order_line.meta_set_line_discount', [ 'order_item_id' => $item->get_id(), 'cart_item_key' => $cart_item_key, 'line_discount' => round( $line_discount, 2 ) ] );
        }
    }
}
