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

/**
 * KNSDD_Smart_Message_Service
 * 
 * "Sepet Tutarına Göre İndirim" kampanyaları için akıllı mesaj hesaplama servisi.
 * Koşul sağlanmadıysa: "X₺ daha eklerseniz %Y indirim kazanacaksınız"
 * Koşul sağlandıysa: Modal mesajı gösterilir
 */
class KNSDD_Smart_Message_Service {
    
    /**
     * Sepet için tüm aktif "Sepet Tutarına Göre İndirim" kampanyalarını alır
     * 
     * @return array Kampanya kuralları dizisi
     */
    public function get_active_cart_total_campaigns() {
        if ( ! KNSDD_Data::is_globally_enabled() ) {
            return array();
        }

        $all_groups = KNSDD_Data::get_groups();
        $all_group_dates = KNSDD_Data::get_all_group_dates();
        
        $campaigns = array();
        
        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'] === 'cart_total_discount' ) {
                    
                    $rule['group'] = $group;
                    $campaigns[] = $rule;
                }
            }
        }
        
        return $campaigns;
    }
    
    /**
     * Sepet için akıllı mesaj hesaplar
     * 
     * @param string $location_key Gösterim konumu (show_mini_cart, show_cart, show_checkout)
     * @return array|null Mesaj verisi veya null
     */
    public function get_smart_message_for_location( $location_key ) {
        if ( ! WC()->cart || WC()->cart->is_empty() ) {
            return null;
        }
        
        $campaigns = $this->get_active_cart_total_campaigns();
        if ( empty( $campaigns ) ) {
            return null;
        }
        
        // Sepet toplamını hesapla
        $cart_total = $this->calculate_cart_total();
        
        // Kullanıcı kimlik bilgilerini al
        $current_user_id = get_current_user_id();
        $current_user_email = '';
        if ( $current_user_id > 0 ) {
            $user = get_userdata( $current_user_id );
            if ( $user ) {
                $current_user_email = $user->user_email;
            }
        }
        
        // Kampanyaları filtrele ve sırala
        $applicable_campaigns = array();
        
        foreach ( $campaigns as $campaign ) {
            // Kullanım limiti ve koşul kontrolü
            if ( ! $this->is_campaign_applicable( $campaign, $current_user_id, $current_user_email ) ) {
                continue;
            }
            
            $min_cart_total = isset( $campaign['min_cart_total'] ) ? (float) $campaign['min_cart_total'] : 0;
            if ( $min_cart_total <= 0 ) {
                continue;
            }
            
            $campaign['_min_cart_total'] = $min_cart_total;
            $applicable_campaigns[] = $campaign;
        }
        
        if ( empty( $applicable_campaigns ) ) {
            return null;
        }
        
        // En yakın hedefe göre sırala (küçükten büyüğe)
        usort( $applicable_campaigns, function( $a, $b ) {
            return $a['_min_cart_total'] <=> $b['_min_cart_total'];
        });
        
        // En yakın kampanyayı seç
        $target_campaign = null;
        $next_campaign = null;
        
        foreach ( $applicable_campaigns as $campaign ) {
            if ( $cart_total >= $campaign['_min_cart_total'] ) {
                // Koşul sağlandı - bu kampanya aktif
                $target_campaign = $campaign;
            } else {
                // Koşul sağlanmadı - bu bir sonraki hedef
                if ( ! $next_campaign ) {
                    $next_campaign = $campaign;
                }
                break;
            }
        }
        
        // Koşul sağlandıysa: Modal mesajı döndür
        if ( $target_campaign ) {
            return $this->format_success_message( $target_campaign, $location_key );
        }
        
        // Koşul sağlanmadıysa: Akıllı mesaj döndür
        if ( $next_campaign ) {
            return $this->format_smart_message( $next_campaign, $cart_total, $location_key );
        }
        
        return null;
    }
    
    /**
     * Sepet toplamını hesaplar
     * 
     * @return float Sepet toplamı
     */
    private function calculate_cart_total() {
        $subtotal_api = (float) WC()->cart->get_subtotal();
        $subtotal_sum = 0.0;
        
        foreach ( WC()->cart->get_cart() as $cart_item ) {
            if ( isset( $cart_item['data'] ) && is_a( $cart_item['data'], 'WC_Product' ) ) {
                $qty = isset( $cart_item['quantity'] ) ? (int) $cart_item['quantity'] : 1;
                $price = (float) $cart_item['data']->get_price();
                $subtotal_sum += $price * max( 1, $qty );
            }
        }
        
        return max( $subtotal_api, $subtotal_sum );
    }
    
    /**
     * Kampanyanın uygulanabilir olup olmadığını kontrol eder
     * 
     * @param array $campaign Kampanya kuralı
     * @param int $user_id Kullanıcı ID
     * @param string $user_email Kullanıcı e-posta
     * @return bool
     */
    private function is_campaign_applicable( $campaign, $user_id, $user_email ) {
        if ( empty( $campaign['rule_id'] ) ) {
            return false;
        }
        
        // Kullanım limiti kontrolü için veri çek
        $rule_ids = array( $campaign['rule_id'] );
        $all_rules_usage = KNSDD_Data::get_usage_for_multiple_rules( $rule_ids );
        
        $email_usage_map = array();
        if ( ! empty( $user_email ) ) {
            $email_usage_map = KNSDD_Data::get_usage_for_multiple_rules_by_email( $rule_ids, $user_email );
        }
        
        // Discount Engine'in koşul kontrolünü kullan
        return KNSDD_Discount_Engine::is_rule_conditions_met( 
            $campaign, 
            $user_id, 
            $all_rules_usage, 
            $user_email, 
            $email_usage_map 
        );
    }
    
    /**
     * Başarı mesajını formatlar (koşul sağlandı)
     * 
     * @param array $campaign Kampanya kuralı
     * @param string $location_key Gösterim konumu
     * @return array|null Mesaj verisi
     */
    private function format_success_message( $campaign, $location_key ) {
        // Mini sepet için özel CTA mesajı (indirim satırı olmadığı için)
        if ( $location_key === 'show_mini_cart' ) {
            $discount_type = isset( $campaign['discount_type'] ) ? $campaign['discount_type'] : 'percentage';
            $discount_value = isset( $campaign['discount_value'] ) ? (float) $campaign['discount_value'] : 0;
            
            if ( $discount_value <= 0 ) {
                return null;
            }
            
            // İndirim değerini formatla
            $currency_symbol = get_woocommerce_currency_symbol();
            if ( $discount_type === 'percentage' ) {
                $discount_text = '%' . number_format( $discount_value, 0 );
            } else {
                $discount_text = number_format( $discount_value, 2, ',', '.' ) . $currency_symbol;
            }
            
            // CTA mesajı oluştur
            $message_text = sprintf(
                /* translators: %s: İndirim değeri */
                __( '%s indirim kazandınız. Sepette görüntüleyebilirsiniz', 'kns-dynamic-discounts-for-woocommerce' ),
                $discount_text
            );
            
            return array(
                'type' => 'success',
                'text' => $message_text,
                'color' => '',
                'highlight' => false,
                'icon' => array(
                    'enabled' => false,
                ),
                'scope' => 'cart_total_smart',
            );
        }
        
        // Sepet ve ödeme sayfaları için admin panelinden belirlenen mesaj
        if ( empty( $campaign['messages'] ) || empty( $campaign['messages']['cart'] ) ) {
            return null;
        }
        
        $msg_data = $campaign['messages']['cart'];
        
        // Mesaj metni boşsa çık
        if ( empty( $msg_data['text'] ) ) {
            return null;
        }
        
        // Location key mapping: show_mini_cart -> show_mini
        $location_map = array(
            'show_mini_cart' => 'show_mini',
            'show_cart' => 'show_cart',
            'show_checkout' => 'show_checkout',
        );
        
        $db_key = isset( $location_map[ $location_key ] ) ? $location_map[ $location_key ] : $location_key;
        
        // İlgili konumda gösterim aktif mi kontrol et
        if ( empty( $msg_data[ $db_key ] ) ) {
            return null;
        }
        
        return array(
            'type' => 'success',
            'text' => $msg_data['text'],
            'color' => isset( $msg_data['color'] ) ? $msg_data['color'] : '',
            'highlight' => ! empty( $msg_data['highlight'] ),
            'icon' => array(
                'enabled'  => ! empty( $msg_data['icon']['enabled'] ),
                'pack'     => isset( $msg_data['icon']['pack'] ) ? $msg_data['icon']['pack'] : '',
                'value'    => isset( $msg_data['icon']['value'] ) ? $msg_data['icon']['value'] : '',
                'color'    => isset( $msg_data['icon']['color'] ) ? $msg_data['icon']['color'] : '',
                'position' => isset( $msg_data['icon']['position'] ) ? $msg_data['icon']['position'] : 'before',
                'size'     => isset( $msg_data['icon']['size'] ) ? $msg_data['icon']['size'] : 'md',
            ),
            'scope' => 'cart_total_smart',
        );
    }
    
    /**
     * Akıllı mesajı formatlar (koşul sağlanmadı)
     * 
     * @param array $campaign Kampanya kuralı
     * @param float $current_total Mevcut sepet toplamı
     * @param string $location_key Gösterim konumu
     * @return array|null Mesaj verisi
     */
    private function format_smart_message( $campaign, $current_total, $location_key ) {
        $min_cart_total = isset( $campaign['min_cart_total'] ) ? (float) $campaign['min_cart_total'] : 0;
        $discount_type = isset( $campaign['discount_type'] ) ? $campaign['discount_type'] : 'percentage';
        $discount_value = isset( $campaign['discount_value'] ) ? (float) $campaign['discount_value'] : 0;
        
        if ( $min_cart_total <= 0 || $discount_value <= 0 ) {
            return null;
        }
        
        // Kalan tutarı hesapla
        $remaining = $min_cart_total - $current_total;
        if ( $remaining <= 0 ) {
            return null; // Koşul zaten sağlanmış
        }
        
        // Para birimi sembolünü al
        $currency_symbol = get_woocommerce_currency_symbol();
        
        // Kalan tutarı formatla (düz metin)
        $remaining_formatted = number_format( $remaining, 2, ',', '.' ) . $currency_symbol;
        
        // İndirim değerini formatla (düz metin)
        $discount_text = '';
        if ( $discount_type === 'percentage' ) {
            $discount_text = '%' . number_format( $discount_value, 0 );
        } else {
            $discount_text = number_format( $discount_value, 2, ',', '.' ) . $currency_symbol;
        }
        
        // Mesaj metnini oluştur
        $message_text = sprintf(
            /* translators: 1: Kalan tutar, 2: İndirim değeri */
            __( 'Sepetinize %1$s daha ekleyin, %2$s indirim kazanın!', 'kns-dynamic-discounts-for-woocommerce' ),
            $remaining_formatted,
            $discount_text
        );
        
        return array(
            'type' => 'smart',
            'text' => $message_text,
            'color' => '',
            'highlight' => false,
            'icon' => array(
                'enabled' => false,
            ),
            'scope' => 'cart_total_smart',
            'remaining_amount' => $remaining,
            'target_amount' => $min_cart_total,
            'discount_value' => $discount_value,
            'discount_type' => $discount_type,
        );
    }
}
