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

class KNSDD_I18n
{

    const TEXT_DOMAIN = 'kns-dynamic-discounts-for-woocommerce';
    const COOKIE_NAME = 'knsdd_lang';

    private static $textdomain_loaded = false;

    public static function init()
    {
        add_filter('plugin_locale', array(__CLASS__, 'filter_plugin_locale'), 10, 2);
        add_action('init', array(__CLASS__, 'load_textdomain'), 0);
        add_filter('gettext', array(__CLASS__, 'runtime_gettext_fallback'), 10, 3);
        add_shortcode('knsdd_language_switcher', array(__CLASS__, 'render_language_switcher'));
    }

    public static function filter_plugin_locale($locale, $domain)
    {
        if ($domain !== self::TEXT_DOMAIN) {
            return $locale;
        }
        return self::determine_locale();
    }

    public static function load_textdomain()
    {
        $locale = self::determine_locale();
        $mofile = 'knsdd-' . $locale . '.mo';

        // Olası MO yollarını sırayla dene (farklı kurulum dizinlerine dayanıklı)
        $candidate_dirs = array(
            trailingslashit(KNSDD_PLUGIN_DIR) . 'languages/',
            trailingslashit(KNSDD_PLUGIN_DIR) . 'includes/languages/',
            trailingslashit(dirname(KNSDD_PLUGIN_DIR)) . 'languages/',
        );

        foreach ($candidate_dirs as $dir) {
            $abs_path = $dir . $mofile;
            if (file_exists($abs_path)) {
                self::$textdomain_loaded = load_textdomain(self::TEXT_DOMAIN, $abs_path);
                if (self::$textdomain_loaded) {
                    return;
                }
            }
        }

        // Son çare: WordPress'in standart mekanizması (relatif path ile) — başarısız olabilir ama denemeye değer
        self::$textdomain_loaded = load_plugin_textdomain(self::TEXT_DOMAIN, false, 'languages')
            || load_plugin_textdomain(self::TEXT_DOMAIN, false, 'includes/languages');
    }

    public static function runtime_gettext_fallback($translated, $text, $domain)
    {
        if ($domain !== self::TEXT_DOMAIN) {
            return $translated;
        }
        // Sadece en_US için, çeviri bulunamamışsa (translated === original) çalışma zamanı sözlüğünü kullan
        if (self::determine_locale() !== 'en_US') {
            return $translated;
        }
        if ($translated === $text) {
            $map = self::get_en_map();
            if (isset($map[$text])) {
                return $map[$text];
            }
        }
        return $translated;
    }

    private static function get_en_map()
    {
        // Türkçe kaynak -> İngilizce çeviri (asgari gerekli set)
        return array(
            'Kns Dynamic Discounts Ayarları' => 'Kns Dynamic Discounts Settings',
            'Genel Ayarlar' => 'General Settings',
            'Eklentinin Genel Durumu' => 'Plugin Global Status',
            'Aktif' => 'Active',
            'Pasif' => 'Inactive',
            'Grup Durumu' => 'Group Status',
            'Devam eden' => 'Active',
            'Tümü' => 'All',
            // Settings tabs (Turkish UI labels)
            'Genel' => 'General',
            'Tarih Yönetimi' => 'Date Management',
            'Arayüz ve Erişilebilirlik' => 'UI & Accessibility',
            'Yerelleştirme' => 'Localization',
            'Dil Ayarları' => 'Language Settings',
            'Sepet Sayfası' => 'Cart Page',
            'Ödeme Sayfası' => 'Checkout Page',
            'Mesajları Kaydet' => 'Save Messages',
            'Gelişmiş' => 'Advanced',
            'Hakkında' => 'About',
            'Mevcut Gruplar' => 'Existing Groups',
            'Grup Adını Düzenle' => 'Edit Group Name',
            'Grup Adı' => 'Group Name',
            'Durum' => 'Status',
            'Durum Bilgisi' => 'Status Info',
            'Tüm Durumlar' => 'All Statuses',
            'Manuel Pasif' => 'Manually Paused',
            'Bu anahtar kapalıysa, hiçbir indirim kuralı çalışmaz. Eklentiyi geçici olarak durdurmak için kullanabilirsiniz.' => 'If this switch is off, no discount rules will run. Use it to temporarily pause the plugin.',
            'Değişiklikleri Kaydet' => 'Save Changes',
            'Dil Ayarları' => 'Language Settings',
            'Dil Modu' => 'Language Mode',
            'Dil' => 'Language',
            'Otomatik (WordPress site diline göre)' => 'Automatic (Based on WordPress site language)',
            'Manuel' => 'Manual',
            'Manuel mod seçiliyse geçerli olur. Aksi halde WordPress site dili kullanılır. Desteklenen diller arasında değilse varsayılan İngilizce (en_US) kullanılır.' => 'Takes effect only in Manual mode. Otherwise, the WordPress site language is used. Falls back to English (en_US) if not supported.',
            'Eklenti başarı ile aktif hale getirilmiştir.' => 'The plugin has been activated successfully.',
            'Eklenti pasif hale getirilmiştir.' => 'The plugin has been deactivated.',
            'Miktar İndirimi' => 'Quantity Discount',
            'Kural Yönetimi' => 'Rule Management',
            'Yönetilecek Grubu Seçin:' => 'Select Group to Manage:',
            'Kategori' => 'Category',
            'Ürün' => 'Product',
            'Min' => 'Min',
            'Max' => 'Max',
            'Sadece Üyeler' => 'Members Only',
            'Geçerli Müşteriler' => 'Eligible Customers',
            'Kampanya Türü' => 'Campaign Type',
            'İşlemler' => 'Actions',
            'Kural Ekle' => 'Add Rule',
            'Kuralları Kaydet' => 'Save Rules',
            'Yönetilecek kural bulunamadı. Lütfen önce Grup Yönetimi sayfasından bir grup oluşturun.' => 'No rules to manage. Please create a group first on the Group Management page.',
            'Kural Kullanım Limitleri' => 'Rule Usage Limits',
            'Toplam Kullanım Limiti' => 'Total Usage Limit',
            'Limitsiz' => 'Unlimited',
            'Müşteri Başına Kullanım Limiti' => 'Usage Limit per Customer',
            'Mevcut Durum' => 'Current Status',
            'İptal' => 'Cancel',
            'Devam Et' => 'Continue',
            'Limitleri Kaydet' => 'Save Limits',
            // Tier group limit messages
            '"%s" için Kademeli İndirim Tespit Edildi: %d kademe' => 'Tiered Discount Detected for "%s": %d tiers',
            'Toplam kullanım ve müşteri başına kullanım limitleri, tüm kademeler için ortak olarak uygulanır.' => 'Total usage and per-customer usage limits apply to all tiers collectively.',
            'Limitler %d kademe için güncellendi. Değişiklikleri kalıcı yapmak için "Kuralları Kaydet" butonuna tıklayın.' => 'Limits updated for %d tiers. Click "Save Rules" to make changes permanent.',
            've %d diğer ürün' => 'and %d other products',
            'Bu kural' => 'This rule',
            'Özel Kampanyayı Yapılandır' => 'Configure Special Campaign',
            'Kampanya Türü' => 'Campaign Type',
            'Seçiniz...' => 'Select...',
            'X Al, Y Öde' => 'Buy X, Pay Y',
            'Kampanyayı Kaydet' => 'Save Campaign',
            'Mesajları Yapılandır' => 'Configure Messages',
            'Ürün Sayfası (Tanıtım)' => 'Product Page (Promo)',
            'Mesaj Metni' => 'Message Text',
            'Mesaj Rengi' => 'Message Color',
            'Ürün Sayfasıda Göster' => 'Show on Product Page',
            'Sepet & Ödeme (Onay)' => 'Cart & Checkout (Confirmation)',
            'Gösterim Alanları' => 'Display Locations',
            'Mini Sepet' => 'Mini Cart',
            'Sepet/Ödeme mesaj alanı boş olamaz. Lütfen bir metin girin veya tüm gösterim tiklerini kaldırın.' => 'Cart/Checkout message field cannot be empty. Please enter text or remove all display options.',
            'Test Sayfasına Git' => 'Go to Test Page',
            'Bu Sistem Ne Zaman Çalışır?' => 'When Does This System Work?',
            'Tavsiye Edilen Uzun Format:' => 'Recommended Long Format:',
            'Opsiyonel Kısa Format:' => 'Optional Short Format:',
            'Kaydet' => 'Save',
            'Tarih Belirtilmedi' => 'Date Not Set',
            'Aktif Kural' => 'Active Rule',
            'Beklemede' => 'Pending',
            'Tamamlandı' => 'Completed',
            'Tamamlanmış kampanyaların tarihleri değiştirilemez.' => 'Completed campaigns cannot have their dates changed.',
            'Grup "%s": Tamamlanmış kampanyaların tarihleri değiştirilemez.' => 'Group "%s": Completed campaigns cannot have their dates changed.',
            'Geçersiz Tarih' => 'Invalid Date',
            'Müşteri #%d' => 'Customer #%d',
            // JS fallbacks
            'Veri yok' => 'No data',
            'Yükleniyor…' => 'Loading…',
            'Kopyalandı!' => 'Copied!',
            'Hata!' => 'Error!',
            'Kopyala' => 'Copy',
            // Icon picker & messages UI (new)
            'İkon Paketi' => 'Icon Package',
            'Seç' => 'Select',
            'İkon kullan' => 'Use Icon',
            'İkon rengi' => 'Icon Color',
            'İkon pozisyonu' => 'Icon Position',
            'Önce' => 'Before',
            'Sonra' => 'After',
            'İkon boyutu' => 'Icon Size',
            'Küçük' => 'Small',
            'Orta' => 'Medium',
            'Büyük' => 'Large',
            'İkon Seç' => 'Choose Icon',
            // Tier Table (Product Page)
            'Kademe İndirimi' => 'Tiered Discount',
            'Adet' => 'Quantity',
            'İndirim' => 'Discount',
            'Ürün Sayfası Kademe Tablosu' => 'Product Page Tier Table',
            'Kademe Tablosu Konumu' => 'Tier Table Location',
            'Otomatik (Fiyat üstü - önerilen)' => 'Automatic (Above price - recommended)',
            'Ürün özeti' => 'Product summary',
            'Sepete ekle üstü' => 'Above add to cart',
            'Sepete ekle altı' => 'Below add to cart',
            'Ürün tabları altı' => 'Below product tabs',
            'Ürün sayfasında miktar kademelerini göster' => 'Show quantity tiers on product page',
            'Kademeler fiyat etiketinin hemen üstünde yer alır (Otomatik konum).' => 'Tiers appear just above the price (Automatic location).',
            // Tier Table Color Settings (Admin)
            'Özel renk kullan' => 'Use custom color',
            'Kademe Tablosu Renk Teması' => 'Tier Table Color Theme',
            'Tema Renk Ayarı (Özel renk)' => 'Theme Color Setting (Custom color)',
            'Tema rengine uyarlansın (özel renk seçimi)' => 'Adapt to theme color (custom color)',
            'Özel renk' => 'Custom color',
            'İşaretliyse tablo tonu bu renge göre ayarlanır.' => 'If checked, the table tint is based on this color.',
            'İşaretliyse aşağıdaki renk uygulanır. Değilse üstteki Renk Teması geçerli olur.' => 'If checked, the color below applies. Otherwise, the Color Theme above is used.',
            'Kutucuk işaretli değilse aşağıdaki Renk Teması seçimi uygulanır.' => 'If unchecked, the Color Theme selection below is applied.',
            'Özel renk kapalıyken satır arka planı, seçtiğiniz paletin rengine göre hafifçe tonlanır (zebra efekti). Varsayılan: Gökyüzü (blue).' => 'When custom color is off, the row background is lightly tinted based on the palette you choose (zebra effect). Default: Sky (blue).',
            'Özel renk seçimi kapalıyken, zebra satır tonu bu paletten üretilir.' => 'When custom color is off, zebra tint is generated from this palette.',

            // Buttons & Modals (Admin/Groups/Import/Export)
            'İçe Aktar' => 'Import',
            'Dışa Aktar' => 'Export',
            'Doğrula' => 'Validate',
            'Dosya Seç' => 'Choose File',
            'Grupları İçe Aktar' => 'Import Groups',
            'Grupları Dışa Aktar' => 'Export Groups',
            'Doğrulama Raporu' => 'Validation Report',
            'İçe Aktarılıyor...' => 'Importing...',
            'Lütfen bekleyin...' => 'Please wait...',
            'İçe Aktarma Tamamlandı' => 'Import Completed',
            'JSON formatında dışa aktarılmış grup dosyasını seçin:' => 'Select the group file exported in JSON format:',
            'Dosyayı buraya sürükleyin veya tıklayarak seçin' => 'Drag and drop the file here or click to select',
            'Tüm Gruplar' => 'All Groups',
            'Dışa aktarma durum seçenekleri' => 'Export status options',
            // Admin uyarı metinleri (validators / modals)
            'Geçersiz değer: N ≥ 1 ve % 1–100 arasında olmalı.' => 'Invalid value: N ≥ 1 and % must be between 1–100.',
            'Uyarı: Yüzde indirimi 100\'den küçük olmalıdır.' => 'Warning: Percentage discount must be less than 100.',
            'Geçersiz renk değeri. Lütfen #RGB veya #RRGGBB biçiminde girin.' => 'Invalid color value. Please enter in #RGB or #RRGGBB format.',
            'Geçersiz ikon anahtarı. Lütfen listeden bir ikon seçin.' => 'Invalid icon key. Please select an icon from the list.',
            'Lütfen tetikleyici kategori ve/veya ürün seçin.' => 'Please select a trigger category and/or product.',
        );
    }

    /**
     * knsdd-<locale>.mo dosyasının olası konumlarını döndürür.
     * WP'nin standart dil klasörünü de (WP_LANG_DIR/plugins) kontrol eder.
     */
    private static function get_mo_candidate_paths($locale)
    {
        $paths = array();
        if (empty($locale)) {
            return $paths;
        }
        $mofile = 'knsdd-' . $locale . '.mo';
        $candidate_dirs = array(
            trailingslashit(KNSDD_PLUGIN_DIR) . 'languages/',
            trailingslashit(KNSDD_PLUGIN_DIR) . 'includes/languages/',
            trailingslashit(dirname(KNSDD_PLUGIN_DIR)) . 'languages/',
        );
        if (defined('WP_LANG_DIR')) {
            $candidate_dirs[] = trailingslashit(WP_LANG_DIR) . 'plugins/';
        }
        foreach ($candidate_dirs as $dir) {
            $paths[] = $dir . $mofile;
        }
        return $paths;
    }

    /**
     * Verilen locale için .mo dosyası mevcut mu?
     * en_US için her zaman true (çalışma zamanı fallback haritası kullanılacak).
     */
    private static function mo_exists($locale)
    {
        if ($locale === 'en_US') {
            return true;
        }
        $candidates = self::get_mo_candidate_paths($locale);
        foreach ($candidates as $path) {
            if (file_exists($path)) {
                return true;
            }
        }
        return false;
    }

    public static function determine_locale()
    {
        $supported = KNSDD_Utils::get_supported_locales();
        $supported_keys = array_keys($supported);

        // Aday locale'i belirle
        $candidate = '';

        // 1) Kullanıcı çerezi
        if (isset($_COOKIE[self::COOKIE_NAME])) {
            $cookie_locale = sanitize_text_field(wp_unslash($_COOKIE[self::COOKIE_NAME]));
            if (in_array($cookie_locale, $supported_keys, true)) {
                $candidate = $cookie_locale;
            }
        }

        // 2) Yönetici manuel seçimi
        if (!$candidate) {
            $options = get_option('knsdd_global_settings', array());
            $mode = isset($options['language_mode']) ? $options['language_mode'] : 'auto';
            $manual = isset($options['language_locale']) ? $options['language_locale'] : 'en_US';
            if ($mode === 'manual' && in_array($manual, $supported_keys, true)) {
                $candidate = $manual;
            }
        }

        // 3) WordPress site dili
        if (!$candidate) {
            $wp_locale = get_locale();
            if (in_array($wp_locale, $supported_keys, true)) {
                $candidate = $wp_locale;
            }
        }

        // 4) Varsayılan İngilizce
        if (!$candidate) {
            $candidate = 'en_US';
        }

        // Eğer seçilen locale için .mo yoksa en_US'a düş
        if ($candidate !== 'en_US' && !self::mo_exists($candidate)) {
            $candidate = 'en_US';
        }

        return $candidate;
    }

    public static function render_language_switcher($atts)
    {
        $supported = KNSDD_Utils::get_supported_locales();
        $current = self::determine_locale();

        // Register a minimal handle for the inline script
        wp_register_script('knsdd-lang-switcher', false, array(), KNSDD_VERSION, true);

        $js = '(function(){' .
            'var sel = document.getElementById("knsdd-lang-select");' .
            'if (!sel) return;' .
            'sel.addEventListener("change", function(){' .
            'var locale = sel.value;' .
            'var maxAge = 60*60*24*365;' .
            'document.cookie = "' . esc_js(self::COOKIE_NAME) . '=" + encodeURIComponent(locale) + ";path=/;max-age=" + maxAge;' .
            'window.location.reload();' .
            '});' .
            '})();';

        wp_add_inline_script('knsdd-lang-switcher', $js);
        wp_enqueue_script('knsdd-lang-switcher');

        ob_start();
        ?>
        <div class="knsdd-language-switcher">
            <label
                for="knsdd-lang-select"><strong><?php echo esc_html__('Language', 'kns-dynamic-discounts-for-woocommerce'); ?></strong></label>
            <select id="knsdd-lang-select">
                <?php foreach ($supported as $locale => $label): ?>
                    <option value="<?php echo esc_attr($locale); ?>" <?php selected($current, $locale); ?>>
                        <?php echo esc_html($label); ?>
                    </option>
                <?php endforeach; ?>
            </select>
        </div>
        <?php
        return ob_get_clean();
    }

    /**
     * Settings sayfası için JS i18n metinleri
     */
    public static function get_settings_js_i18n()
    {
        return array(
            'warnings_title' => __('Uyarılar', 'kns-dynamic-discounts-for-woocommerce'),
            'focus_title' => __('Son Odak', 'kns-dynamic-discounts-for-woocommerce'),
            'a11y_title' => __('Erişilebilirlik', 'kns-dynamic-discounts-for-woocommerce'),
            'promo_title' => __('Ürün Mesajı', 'kns-dynamic-discounts-for-woocommerce'),
            'tier_title' => __('Kademe İndirim Tablosu', 'kns-dynamic-discounts-for-woocommerce'),
            'cart_msgs_title' => __('Mini Sepet & Sepet & Ödeme Mesajları', 'kns-dynamic-discounts-for-woocommerce'),
            'sample_table_tone' => __('Örnek tablo tonu', 'kns-dynamic-discounts-for-woocommerce'),
            'confirm_reset' => __('Varsayılanlara dönmek istediğinize emin misiniz? Bu işlem kaydedilmeden uygulanmaz.', 'kns-dynamic-discounts-for-woocommerce'),
            'copied' => __('Kopyalandı!', 'kns-dynamic-discounts-for-woocommerce'),
            'error' => __('Hata!', 'kns-dynamic-discounts-for-woocommerce'),
        );
    }


    /**
     * Notification system i18n metinleri
     */
    public static function get_notifications_js_i18n()
    {
        return array(
            'notifications' => __('Bildirimler', 'kns-dynamic-discounts-for-woocommerce'),
            'noNotifications' => __('Bildirim bulunmuyor', 'kns-dynamic-discounts-for-woocommerce'),
            'loadMore' => __('Daha Fazla Yükle', 'kns-dynamic-discounts-for-woocommerce'),
            'loading' => __('Yükleniyor...', 'kns-dynamic-discounts-for-woocommerce'),
            'error' => __('Bildirimler yüklenirken hata oluştu', 'kns-dynamic-discounts-for-woocommerce'),
            'extendDate' => __('Tarihi Uzat', 'kns-dynamic-discounts-for-woocommerce'),
            'editDate' => __('Tarihi Düzenle', 'kns-dynamic-discounts-for-woocommerce'),
            'edit' => __('Düzenle', 'kns-dynamic-discounts-for-woocommerce'),
            'view' => __('Görüntüle', 'kns-dynamic-discounts-for-woocommerce'),
            'viewRules' => __('Kuralları Görüntüle', 'kns-dynamic-discounts-for-woocommerce'),
            'dismiss' => __('Gizle', 'kns-dynamic-discounts-for-woocommerce'),
            'close' => __('Kapat', 'kns-dynamic-discounts-for-woocommerce'),
            'remaining' => __('kaldı', 'kns-dynamic-discounts-for-woocommerce'),
            'markAsRead' => __('Okundu', 'kns-dynamic-discounts-for-woocommerce'),
        );
    }
}
