<?php

class ModelEntegrasyonAddproduct extends Model
{
    private $markalarim = array('nikadu', 'woodhub', 'teknotrust', 'teknotrust', 'NIDAGE', 'MEDITERIAN','ozbience','AboutThePerfect');
    private $yasakli_kelimeler = array("irtibat", "topuk dikeni", "Selülit Giderici ", "Smart", "smartwatch", "SMART", "Selülit", ' sim kart', 'ortam dinleme', "ağrı", "menşe", "selülit", "cyclo", "kargo", "mikrop", "bakteri", "Cyclo", "iletişim", "trendyol", "delici", "kesici", "bakteri", "Bakteri", "kırışıklık", "airpods");
    private $yasakli_urunler = array("deprem", "ilkyardım", "yangın", "afet");

    private $markalar = array("arzum", "LENOVO", "Elenberg", "Karcher", "Miele", "Mabel", "HiTech", "Rose", "dede", "sunplus", "MAGBOX", "Globex", "Skytech", " NEXT NEXTSTAR ", "Astra", "FANTOM", "Tois Baby", "ALDEBA", "Star", "Dede Oyuncak", "LETS GO BABY", "Tois Baby", "Mikado", "Maxword", "TCL", " DailyTech", "Samsung", "DailyLink", "Vestel", "Urban Sound", "Jopus", "Jameson", "Bestway", "arçelik", "inFace", "beko", "Stilevs", "Bosch", "Profilo", "Electrolux", " Siemens", "Nilfisk", "Karcher", "Intex", 'grundig', 'phillips', 'arnica', "hutt", "altus", "wiami", "npo", "onvo", "altus", "singer", "rubenis", "ALTUNAY", "king", "Uğur", "babyliss");
    private function cleanTrendyolDescription($text) {
        // URL'leri kaldır
        $patterns = [
            '/https?:\/\/\S+/i',      // http:// veya https:// ile başlayanlar
            '/www\.\S+/i',            // www. ile başlayanlar
            '/\S+\.(com|net|org|biz|info|co|io|tr)\S*/i', // domain uzantıları
            '/[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}/i',   // e-posta adresleri
            '/(facebook|instagram|youtube|whatsapp|telegram)[^\s]*/i', // sosyal medya mention
        ];

        $clean = preg_replace($patterns, '', $text);

        // Birden fazla boşluğu tek boşluğa indir
        $clean = preg_replace('/\s{2,}/', ' ', $clean);

        return strip_tags(trim($clean));
    }

    public function check429Status()
    {

        $query = $this->db->query("select count(*) as total from product_url where httpcode=429");
        return $query->row['total'];

    }


    public function fetchTrendyolProductViaApi(string $query): array
    {
        //--- 1) Arama API’sini çağır ---------------------------------------------------
        $searchUrl = 'https://apigw.trendyol.com/discovery-web-searchgw-service/v2/api/filter/sr?q=' . $query;


        $ch = curl_init($searchUrl);
        curl_setopt_array($ch, [
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_FOLLOWLOCATION => true,
            CURLOPT_TIMEOUT => 15,
            CURLOPT_HTTPHEADER => [
                'Accept: application/json, text/plain, */*',
                'Accept-Language: tr-TR,tr;q=0.9,en-US;q=0.8,en;q=0.7',
                'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)'
            ],
        ]);
        $json = curl_exec($ch);
        curl_close($ch);


        if (!$json) {
            // ağ hatası veya engellendik
            return [];
        }

        $data = json_decode($json, true);
        if (
            empty($data['result']['products']) ||
            count($data['result']['products']) !== 1
        ) {
            // bulunamadı ya da birden fazla ürün var
            return [];
        }

        //--- 2) Tek ürünü al -------------------------------------------------------------
        $p = $data['result']['products'][0];

        $image = $p['images'][0];
        $name = $p['name'];
        $tax = $p['tax'];
        $productId = $query;
        $link = explode('?', $p['url'])[0];
        $price = $p['price']['sellingPrice']   // öncelikli
            ?? $p['price']['discountedPrice']
            ?? null;
        if ($price === null) {
            return [];
        }

        //--- 3) Detay API’sini çağır (barkod ve resim için) -----------------------------
        $detailUrl = "https://public.trendyol.com/discovery-web-productgw-service/api/productDetail/{$productId}";
        $ch = curl_init($detailUrl);
        curl_setopt_array($ch, [
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_TIMEOUT => 10,
            CURLOPT_HTTPHEADER => ['Accept: application/json'],
        ]);
        $detailJson = curl_exec($ch);
        curl_close($ch);


        //--- 4) Sonuç --------------------------------------------------------------------
        return [
            'price' => $price,
            'barcode' => $query,
            'image' => $image,
            'link' => $link,
        ];
    }


    public function get_products(string $rawUrl, array $user, int $page)
    {

        // 1) Girdi URL’sindeki HTML encode edilmiş &amp; karakterlerini düzelt
        $rawUrl = str_replace('&amp;', '&', $rawUrl);

        // 2) Filtre yolunu elde et (örneğin: "brand/marca1?some=param")
        $filterPath = str_replace(['https://www.trendyol.com/', '&pi=1'], '', $rawUrl);
        $filterPath = str_replace('&amp;', '&', $filterPath);

        // 3) API çağrısı için son hâlindeki URL
        $apiUrl = "https://apigw.trendyol.com/discovery-web-searchgw-service/v2/api/filter/"
            . $filterPath
            . "&pi=" . intval($page);

        $productUrls = [];
        $markaListesi = $this->markalarim; // Marka kontrolü için bir defa alın
        $currentUserId = isset($user['user_id']) ? intval($user['user_id']) : null;

        // 4) API’den JSON verisini çek
        $jsonData = @file_get_contents($apiUrl);
        if ($jsonData === false) {
            return 'API Hatası: Veri alınamadı.';
        }

        $decoded = json_decode($jsonData, true);
        if (json_last_error() !== JSON_ERROR_NONE) {
            return 'JSON Hatası: ' . json_last_error_msg();
        }

        if (empty($decoded['result']['products'])) {
            return []; // Ürün yoksa boş dizi döndür
        }





        // 5) Her bir ürünü işleyelim
        foreach ($decoded['result']['products'] as $item) {
            // 5.a) API’den gelen URL’den query string’i sıfırla
            $productPath = explode('?', $item['url'])[0];
            $fullProductUrl = $productPath;

            // 5.b) Veritabanında bu URL kaydı var mı kontrol et
            $escapedPath = $this->db->escape($productPath);
            $existingUrl = $this->db
                ->query("SELECT * FROM product_url WHERE url LIKE '{$escapedPath}' and (hb=1 and ty=1)")
                ->row;

            // 5.c) Eğer aynı ürün adı daha önceden işlenmemişse devam edelim
            if (in_array($item['name'], $productUrls, true)) {
                continue;
            }

            $markaAdi = $item['brand']['name'] ?? '';
            if (in_array($markaAdi, $markaListesi, true)) {
                // Kendi markalarımızdan biri ise pas geç
                continue;
            }

            // 5.d) Henüz veritabanında yoksa doğrudan ekle
            if (!$existingUrl) {
                $productUrls[] = $fullProductUrl;
                continue;
            }

            // 5.e) Aynı kullanıcıya ait kayıt varsa ve hb/ty alanları boşsa ekle
            if ($existingUrl['user_id'] === $currentUserId) {
                $hbEmpty = empty($existingUrl->hb);
                $tyEmpty = empty($existingUrl->ty);
                if ($hbEmpty || $tyEmpty) {
                    $productUrls[] = $fullProductUrl;
                }
            }
        }

        return $productUrls;
    }


    public function tum_bosluklari_temizle($metin)
    {
        $metin = str_replace("/s+/", "", $metin);
        $metin = str_replace(" ", "", $metin);
        $metin = str_replace(" ", "", $metin);
        $metin = str_replace(" ", "", $metin);
        $metin = str_replace("/s/g", "", $metin);
        $metin = str_replace("/s+/g", "", $metin);
        $metin = trim($metin);
        return $metin;
    }


    public function getTyProduct($url)
    {
        $url = 'https://www.trendyol.com/' . $url;
        $content = file_get_contents($url);


        //preg_match('#"barcode":"(.*?)"#si',$content,$veri);
        preg_match('#<script type="application/javascript">(.*?)</script>#si', $content, $attr);
        preg_match('#<div class="envoy" data-reactroot=""></div><script>(.*?)</script>#si', $content, $attr_private);


        if (!$attr && !$attr_private) {

            //echo 'Veri Alınamadı!';
            return array();
        }



        if (isset($attr_sec[1])) {
            if (preg_match('#window\.__PRODUCT_DETAIL_APP_INITIAL_STATE__\s*=\s*(\{.*?\})\s*;#s', $attr_sec[1], $m)) {
                $json_x = $m[1];

                $json = json_decode($json_x, true);
                if (json_last_error() !== JSON_ERROR_NONE || empty($decoded['product'])) {
                    return [];
                }

                $p = $decoded['product'];

            }

        } else if (isset($attr_private[1])) {


            $json = json_decode(explode('window["__envoy__PROPS"]=', $attr_private[1])[1], 1);
            $p = $json['product'];

        } else {


            return array();

        }


        return $p['images'];


    }


    public function get_product($url, $user_info)
    {

        sleep(1);


        $content = file_get_contents($url);


        $props = $this->fetchAdditionalProperties($content);


        //preg_match('#"barcode":"(.*?)"#si',$content,$veri);
        preg_match('#inStock(.*?)</script>#si', $content, $attr);




        if (!$attr) {

            //echo 'Veri Alınamadı!';
            return array();
        }


        $exploded_data = explode('STATE__=', $attr[1]);
        $exploded_data2 = explode('window.__PRODUCT_DETAIL_APP_INITIAL_STATE__ =', $attr[1]);


        if (isset($exploded_data2[1])) {
            $exploded_data3 = explode('window.TYPageName="product_detail"', $exploded_data2[1]);

        } else {
            $exploded_data3[0] = array();
        }

        //print_r($exploded_data2);return;

        if (isset($exploded_data[1])) {
            $exploded_data = explode(';window.TYPageName', $exploded_data[1]);
            $product = json_decode($exploded_data[0], 1)['product'];

        } else if (isset($exploded_data3[0])) {

            $exploded_data[0] = $exploded_data3[0];
            $product = json_decode(str_replace(';', '', $exploded_data3[0]), 1)['product'];


        } else {

            preg_match('#window.__PRODUCT_DETAIL_APP_INITIAL_STATE__ = {(.*?)#si', $attr[1], $attr2);

        }


        if (!empty($product['name'])) {
            foreach ($this->yasakli_urunler as $yasak) {
                // stripos: büyük/küçük harf duyarsız arama
                if (stripos($product['name'], $yasak) !== false) {
                    // Yasaklı kelime bulundu, boş dizi dön
                    return array();
                }
            }
        }


        $attributes_list = array();

        foreach ($product['attributes'] as $attribute) {

            if ($attribute['value']['name'] != 'Var' || $attribute['value']['name'] == 'Yok')
                $attributes_list[] = $attribute['value']['name'];

        }


        $attributes = array();

        // print_r($product['attributes']);return;
        $prefix = $this->config->get('ty_setting_model_prefix');


        $images = array();


        foreach ($product['images'] as $index => $item) {


            if ($index < 7) {

                // $images[] = 'https://easyentegre3.b-cdn.net/' . $this->model_tool_image->upload('https://cdn.dsmcdn.com' . $item, $product['id'] . '_' . $index, $user_info['username']);

                // $images[] =  BUNNY_DOMAIN.$this->model_tool_image->upload('https://cdn.dsmcdn.com'.$item, $product['id'] . '_' . $index, $user_info['username']);

                $images[] = 'https://cdn.dsmcdn.com' . $item;

            }


        }

        $this->load->model('catalog/product_finder');

        $product['images'] = $images;


        //shuffle($images);

        $query = $this->db->query("select * from " . DB_PREFIX . "category_attribute where category_id='" . $product['originalCategory']['id'] . "' and required=1");

        //$attributes = $this->model_catalog_product_finder->get_attributes($product['originalCategory']['id'], $product['attributes']);
        $attributes = $this->model_catalog_product_finder->get_attributes2($product, $product['originalCategory']['id'], $user_info['database_id']);

        //print_r($attributes);return;
        $category_attr = $this->getTyAttributes($attributes, $props);


        if (in_array(strtolower($product['metaBrand']['name']), $this->markalar)) {

            $brand_id = $product['metaBrand']['id'];
            //echo "marka=".$product['metaBrand']['name'];
            $product['marka'] = $product['metaBrand']['name'];

        } else {

            $brand_id = BRAND_ID;
            $product['marka'] = BRAND;


        }


        $barcode = $product['variants'][0]['barcode'] . $prefix;
        //$brand_id = 1879199;
        //$product['name']=$product['name'];
        $product_code = $product['productCode'] . $prefix;

        // $product['marka']=$product['metaBrand']['name'];


        // $description='575 tl değerinde 17 dil seçenekli sıfırdan ileri seviye eLLC interaktif yabancil dil eğitim programı hediyeli, 7 den 77 ye herkes için dil eğitimi.<br>';
        $description = $product['name'] . '<br>' . $this->model_catalog_product_finder->get_description($product['descriptions']);


        $price = $this->model_catalog_product_finder->calculate_price($product['price']['sellingPrice']['value']);

        //$quanatity = 2;

        $product['price'] = $price;


        $product['quantity'] = 2;
        $product['description'] = $description;
        $product['url'] = $url;
        shuffle($attributes_list);

        /*    if (isset($attributes_list[0])) {
                $ilk = $attributes_list[0];
                unset($attributes_list[0]);
                $product_name = (string)mb_substr($ilk . ' ' . $product['name'] . ' ' , 0, 99);

            } else {

                $product_name = (string)mb_substr($product['name'] . ' ' . implode(' ', $attributes_list), 0, 99);

            }*/

        $product_name = (string)mb_substr($product['name'] . ' ', 0, 99);


        $product['brand_id'] = $brand_id;
        $product['product_name'] = $product_name;
        $product['barcode'] = $barcode;
        $product['product_code'] = $product_code;
        $product['attributes'] = $category_attr['present'];

        return $product;


    }


    public function get_trendyol_products(array $items, array $user_info)
    {



        $allProducts = [];

        if (empty($items)) {
            return $allProducts;
        }

        // URL listesini 5’erli batch’lere böl
        $batches = array_chunk($items, 5);

        foreach ($batches as $batch) {
            // cURL Multi Handle oluştur
            $multiHandle = curl_multi_init();
            $curlHandles = [];

            // 1) Batch içindeki her item için hem indeks hem de item alın
            foreach ($batch as $i => $item) {
                $ch = curl_init();
                curl_setopt_array($ch, [
                    CURLOPT_URL => 'https://www.trendyol.com' . $item['url'],
                    CURLOPT_RETURNTRANSFER => true,
                    CURLOPT_FOLLOWLOCATION => true,
                    CURLOPT_TIMEOUT => 15,
                    CURLOPT_USERAGENT => 'Mozilla/5.0 (compatible; +test)',
                ]);

                curl_multi_add_handle($multiHandle, $ch);

                // Burada anahtar olarak $i kullanıyoruz,
                // böylece sonraki aşamada doğru item’a erişebiliriz
                $curlHandles[$i] = $ch;
            }

            // 2) Tüm istekleri paralel çalıştır
            $running = null;
            do {
                curl_multi_exec($multiHandle, $running);
                curl_multi_select($multiHandle, 0.5);
            } while ($running > 0);

            // 3) Her bir response’u al ve parse et
            foreach ($curlHandles as $i => $ch) {
                $response = curl_multi_getcontent($ch);
                $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

                curl_multi_remove_handle($multiHandle, $ch);
                curl_close($ch);

                if ($httpCode !== 200 || $response === false || $response === '') {
                    continue;
                }

                // Burada $i sayesinde doğru $item’ı elde ediyoruz
                $correctItem = $batch[$i];





                $parsed = $this->parse_single_product2($response, $correctItem, $user_info);



                if (!empty($parsed)) {
                    $allProducts[] = $parsed;
                }
            }

            curl_multi_close($multiHandle);

            // Opsiyonel: Her batch arasında kısa bir bekleme gerekirse
            // usleep(200000); // 0.2 saniye bekle
        }

        return $allProducts;
    }

    /**
     * Tek bir ürün sayfası içeriğini parse eden yardımcı fonksiyon.
     * description_text alanı, ürüne ait temel verileri ve dikkat çekici özellikleri
     * kullanıcıya anlamlı bir açıklama şeklinde sundu.
     *
     * @param string $html Ürünün HTML/JS içeriği
     * @param string $url İstek yapılmış olan ürün sayfası URL’si
     * @param array $user_info Kullanıcı bilgileri (örneğin ['username'=>..., 'database_id'=>...])
     * @return array             Normalleştirilmiş ürün bilgileri ya da boş dizi
     */
    private function parse_single_product2(string $html, array $correctitem, array $user_info, $url = '')
    {



        // 1) Ek özellikleri (additionalProperties) çek
        $props = $this->fetchAdditionalProperties($html);


        preg_match('#<div class="envoy" data-reactroot=""></div><script>(.*?)</script>#si', $html, $attr_private);

        preg_match('/window\["__envoy__PROPS"\]\s*=\s*({.*?});?\s*<\/script>/s', $html, $attr_third);

        // 2) <script> içinden window.__PRODUCT_DETAIL_APP_INITIAL_STATE__ objesini yakala
        preg_match('#<script type="application/javascript">(.*?)</script>#si', $html, $attr_sec);

        if (!isset($attr_sec[1]) && !isset($attr_private[1]) && !isset($attr_third[1])) {
            return [];
        }

        // 3) JSON kısmını ayıkla
        $json = null;
        if(isset($attr_third[1])){



            $json = json_decode($attr_third[1], true);
            $p = $json['product'];


        }else if (isset($attr_sec[1])) {
            if (preg_match('#window\.__PRODUCT_DETAIL_APP_INITIAL_STATE__\s*=\s*(\{.*?\})\s*;#s', $attr_sec[1], $m)) {
                $json_x = $m[1];

                $json = json_decode($json_x, true);
                if (json_last_error() !== JSON_ERROR_NONE || empty($decoded['product'])) {
                    return [];
                }

                $p = $decoded['product'];

            }

        } else if (isset($attr_private[1])) {


            $json = json_decode(explode('window["__envoy__PROPS"]=', $attr_private[1])[1], 1);
            $p = $json['product'];

        } else {


            return array();

        }




        // 5) Ürün adı boşsa veya yasaklı kelime içeriyorsa atla
        $productName = $p['name'] ?? '';
        if ($productName === '') {
            return [];
        }
        foreach ($this->yasakli_urunler as $yasak) {
            if (stripos($productName, $yasak) !== false) {
                return [];
            }
        }



        // 6) Temel alanları ayıkla
        $listingId = $p['listingId'] ?? null;
        $url=$correctitem['url'];
        $productId = $p['id'] ?? null;
        $productCode = $p['productCode'] ?? '';
        $productMainId = $p['productGroupId'];
        $sku = $p['productCode'] ?? null;
        $barcodeRaw = $p['productCode'] ?? '';
        $color = 'Görsel';
        $category = $p['category'] ?? [];
        $originalCat = $p['originalCategory'] ?? [];
        $brandMeta = $p['metaBrand'] ?? [];
        $brandInfo = $p['brand'] ?? [];
        $merchant = $p['merchant'] ?? [];
        $taxRate = $p['tax'] ?? null;
        $isSellable = $p['isSellable'] ?? false;
        $hasStock = $p['hasStock'] ?? $p['merchantListing']['winnerVariant']['price']['sellingPrice']['value'] ?? false;

        $imagesRaw = $p['images'] ?? [];
        $descriptions = $p['descriptions'] ?? [];
        $attributesRaw = $p['attributes'] ?? [];
        // 7) Fiyat bilgilerini çek (ilk varyant üzerinden alıyoruz)
        $priceInfo = $p['merchantListing']['winnerVariant']['price']['sellingPrice']['value'] ?? [];
        $sellingPrice = $priceInfo ?? 0;
        $originalPrice = $priceInfov ?? 0;
        $discountedPrice = $priceInfo ?? $sellingPrice;
        $currency = $p['merchantListing']['winnerVariant']['price']['sellingPrice']['text'] ?? [];
        $couponPrice = $priceInfo['couponApplicablePrice'] ?? $discountedPrice;


        // 8) Attributes listesini düz bir array olarak hazırla
        $attributes_list = [];
        foreach ($attributesRaw as $attrItem) {
            $valName = $attrItem['value']['name'] ?? '';
            if ($valName !== 'Var' && $valName !== 'Yok' && $valName !== '') {
                $attributes_list[] = [
                    'key_id' => $attrItem['key']['id'] ?? null,
                    'key_name' => $attrItem['key']['name'] ?? '',
                    'value_id' => $attrItem['value']['id'] ?? null,
                    'value' => $valName
                ];
            }
        }


        // Önce tüm markaları küçük harfe dönüştür
        $lowerMarkalar = array_map(function ($m) {
            return mb_strtolower($m, 'UTF-8');
        }, $this->markalar);

// Aranacak adı da küçük harfe dönüştür
        $searchName = mb_strtolower($brandInfo['name'], 'UTF-8');

        if (in_array($searchName, $lowerMarkalar, true)) {
            // Bulundu
            $marka_id = $brandInfo['id'];
            $marka = $brandInfo['name'];  // Orijinal case ile bıraktık
        } else {
            // Bulunamadı
            $marka_id = BRAND_ID;
            $marka = BRAND;
        }


        // 9) Resimleri BunnyCDN’e yolla ve tam yol haline getir


        // 10) Kategori attribute’larını al ve normalize et
        $categoryId = $category['id'] ?? null;



        $attrs = $this->model_catalog_product_finder->get_attributes2(
            $p,
            $categoryId,
            $user_info['database_id']
        );






        $category_attr = $this->getTyAttributes($attrs, $props);
        $presentAttrs = $category_attr['present'] ?? [];

        // 11) Barkod ve kod ön ekini ekle
        $prefix = $this->config->get('ty_setting_model_prefix');
        $barcode = $this->generateAlnumCode(18);
        $product_code = $productCode;

        // 12) “description” içinden belirli terimleri içeren satırları filtrele
        $excluded_terms = [
            'Bu ürün',
            'Kampanya fiyatından satılmak üzere',
            'Bir ürün, birden fazla satıcı',
            'Bu üründen en fazla',
            'olduğunuz ürünün',
            '15 gün içinde ücretsiz iade'
        ];


        foreach ($attributes_list as $item) {


            if ($item['key_name'] == 'Renk') {

                $color = $item['value'];

            }
        }


        $filtered_descriptions = [];
        foreach ($descriptions as $desc) {
            $text = $desc['text'] ?? '';
            $skip = false;
            foreach ($excluded_terms as $term) {
                if (stripos($text, $term) !== false) {
                    $skip = true;
                    break;
                }
            }
            if (!$skip) {
                $filtered_descriptions[] = $desc;
            }
        }

        // 13) Filtrelenmiş açıklamaları önceliğe göre sırala
        usort($filtered_descriptions, function ($a, $b) {
            return ($a['priority'] ?? 0) <=> ($b['priority'] ?? 0);
        });


        $brandName = $brandMeta['name'] ?? ($brandInfo['name'] ?? '');
        $categoryHier = $category['hierarchy'] ?? ($originalCat['hierarchy'] ?? '');
        $merchantName = $merchant['name'] ?? '';
        $merchantCity = $merchant['cityName'] ?? '';
        $stokDurumu = $hasStock ? 'Stokta Var' : 'Stokta Yok';

        // Ana özellikler listesinden ilk 3 taneyi alıyoruz (yoksa kalanıyla devam)
        $featureLines = '';
        $maxFeatures = min(3, count($attributes_list));
        for ($i = 0; $i < $maxFeatures; $i++) {
            $feature = $attributes_list[$i];
            $featureLines .= "&nbsp;&nbsp;- " .
                htmlspecialchars($feature['key_name'], ENT_QUOTES) . ": " .
                htmlspecialchars($feature['value'], ENT_QUOTES) . "<br>";
        }
        if (count($attributes_list) > 3) {
            $featureLines .= "&nbsp;&nbsp;- ...<br>";
        }

        // Filtrelenmiş açıklamalardan ilk 2 cümleyi al
        $descLines = '';
        $maxDesc = min(2, count($filtered_descriptions));
        for ($i = 0; $i < $maxDesc; $i++) {
            $descLines .= htmlspecialchars($filtered_descriptions[$i]['text'], ENT_QUOTES) . "<br>";
        }


        $descriptionText = "" .
            htmlspecialchars($categoryHier, ENT_QUOTES) . "<br>";

        $descriptionText .= "<br>";
        $descriptionText .= " " .
            htmlspecialchars($color, ENT_QUOTES) . "<br>";
        if ($featureLines !== '') {
            $descriptionText .= "<br>" . $featureLines;
        }
        if ($descLines !== '') {
            $descriptionText .= "<br>" . $descLines;
        }


        // 3) 100 karakterlik başlık prompt’u
        $promptTitle = "75 karakteri aşmayan, hiç bir şekilde marka içermeyen bir e-ticaret ürün başlığı oluştur:\n"
            . "ürün:{$productName}";

        $promptTitle .= "ürün Açıklamasında olumsuzluk ifade eden hiç bir kelime kullanma\n";






        // 3) 100 karakterlik başlık prompt’u
        $promptDESC = "Lütfen yalnızca 300 karakteri aşmayacak şekilde, maddeli sıralayarak, içinde hiç bir şekilde marka olmayan  Türkçe bir e-ticaret ürün açıklaması oluştur:\n"
            . "{$productName}";
        $promptDESC .= "{$color}\n";

        if (defined('AI_ENABLE') && AI_ENABLE) {
            $generatedTitle =$this->callOpenAI($promptTitle, 70);
            $generatedDescription =$this->callOpenAI($promptDESC, 70);

        }ELSE{
            $generatedTitle =$productName; //$this->callOpenAI($promptTitle, 70);
            $generatedDescription =$productName;// $this->callOpenAI($promptDESC, 70);

        }



        $images = [];
        foreach ($imagesRaw as $idx => $imgPath) {
            if ($idx >= 2) {
                break;
            }
            $fullImgUrl = $imgPath;
            $uploaded   = $this->model_tool_image->uploadBunnyFromUrl($fullImgUrl,$promptTitle.'_'.$idx);
            $images[] = 'https://'.$uploaded;
        }



        // 15) Son olarak tüm alanları içeren normalize dizi
        return [
            // Temel Kimlik Bilgileri
            'item' => $item ?? '',
            'id' => $productId,
            'product_main_id' => $productMainId,
            'listing_id' => $listingId,
            'sku' => $sku,
            'description_text' => $generatedDescription,          // Elle oluşturduğunuz eski description_text
            'product_code' => $productMainId,
            'barcode' => $barcode,
            'full_barcode' =>$barcode.$this->config->get('ty_setting_model_prefix'),
            'name' => $productName,
            'product_name' => $generatedTitle,
            'sell_price2'=>$this->calculate_price($sellingPrice),

            // Marka ve Kategori
            'brand_id' => $marka_id,
            'brand_name' => $marka,
            'color' => $color,
            'category_id' => $category['id'] ?? null,
            'category_name' => $category['name'] ?? '',
            'category_hierarchy' => $categoryHier,
            'original_category_id' => $category['id'] ?? null,
            'original_category_name' => $originalCat['name'] ?? '',
            'original_cat_hierarchy' => $originalCat['hierarchy'] ?? '',

            // Fiyat Bilgisi
            'price' => $sellingPrice,
            'original_price' => $originalPrice,
            'discounted_price' => $discountedPrice,
            'currency' => $currency,
            'tax_rate' => $taxRate,
            'coupon_price' => $couponPrice,
            // Stok ve Satış Durumu
            'is_sellable' => (bool)$isSellable,
            'has_stock' => (bool)$hasStock,
            // Görsel ve Açıklamalar
            'images' => $images,
            // Attribute Listeleri
            'attributes_list' => $attributes_list,
            'present_attributes' => $presentAttrs,
            'url' => $correctitem['url']
        ];


    }


    private  function generateAlnumCode(int $length = 12): string {
        // Karakter havuzu: 0-9 + A-Z (O, I, L, 0 gibi karışabilecekleri istersen çıkarabilirsin)
        $chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
        $max   = strlen($chars) - 1;

        $out = '';
        for ($i = 0; $i < $length; $i++) {
            $out .= $chars[random_int(0, $max)];
        }
        return $out;
    }

    /**
     * OpenAI GPT-3.5-turbo modelini kullanarak bir prompt’a yanıt alır.
     *
     * @param string $prompt API’ye gönderilecek tamamlama prompt’u
     * @param int $maxTokens Kaç token kullanılacağını belirtir (yaklaşık metin uzunluğunu etkiler)
     * @return string|null      Üretilen metin. Hata durumunda null döner.
     */
    public function callOpenAI(string $prompt, int $maxTokens = 350): ?string
    {
        $apiKey = OPENAI_API_KEY;

        $headers = [
            "Content-Type: application/json",
            "Authorization: Bearer {$apiKey}"
        ];

        $postData = [
            "model" => "gpt-4.1-nano",
            "messages" => [
                [
                    "role" => "user",
                    "content" => $prompt
                ]
            ],
            "max_tokens" => $maxTokens,
            "temperature" => 0.7,
        ];

        $ch = curl_init("https://api.openai.com/v1/chat/completions");


        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($postData));
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_TIMEOUT, 30);

        $response = curl_exec($ch);
        $err = curl_error($ch);
        curl_close($ch);

        if ($err) {
            error_log("OpenAI API Hatası: " . $err);
            return null;
        }

        $decoded = json_decode($response, true);
        if (json_last_error() !== JSON_ERROR_NONE
            || empty($decoded['choices'][0]['message']['content'])) {
            error_log("OpenAI JSON Parse Hatası veya içerik boş. Response: " . var_export($decoded, true));
            return null;
        }

        return trim($decoded['choices'][0]['message']['content']);
    }


    /**
     * Ürün bilgilerini kullanarak OpenAI üzerinden:
     *  1) 100 karakteri geçmeyecek başlık (title_ai)
     *  2) 500 karakteri geçmeyecek açıklama (description_ai)
     * oluşturur.
     *
     * @param string $productName Ürünün tam adı
     * @param string $brandName Ürünün markası
     * @param string $categoryHier Kategori hiyerarşisi (örn: "Elektronik/Kişisel Bakım Aletleri/Tıraş Makinesi")
     * @param string $colorName Ürünün rengi
     * @param float $discountedPrice İndirimli fiyat (sayı olarak, örn: 279.9)
     * @param float $originalPrice Orijinal fiyat (sayı olarak, örn: 279.9)
     * @param string $currency Para birimi (örn: "TRY")
     * @param array $attributesList [["key_name"=>"…","value"=>"…"], …] biçiminde öne çıkan özellikler
     * @return array                  ["title_ai" => "...", "description_ai" => "..."]
     */
    public function generateAIContent(
        string $productName,
        string $categoryHier,
        string $colorName,
        array  $attributesList,
        string $orginal_desc
    ): array
    {
        // 1) Fiyatları metin haline getir

        // 2) "Öne çıkan özellikler" metni (ilk 3 özellik veya kalan)
        $topFeatures = [];
        for ($i = 0; $i < min(3, count($attributesList)); $i++) {
            $feat = $attributesList[$i];
            $topFeatures[] = "{$feat['key_name']}: {$feat['value']}";
        }
        $featuresText = implode(", ", $topFeatures);
        if (count($attributesList) > 3) {
            $featuresText .= ", ...";
        }

        // 3) 100 karakterlik başlık prompt’u
        $promptTitle = "70 karakteri aşmayan, hiç bir şekilde marka içermeyen e-ticaret ürün başlığı oluştur:\n"
            . "{$productName}";
        $promptTitle .= "{$featuresText}\n";
        $promptTitle .= "{$colorName}\n";



        $generatedTitle = $this->callOpenAI($promptTitle, 70);

        // 4) 500 karakterlik açıklama prompt’u
        $promptDesc = "Aşağıda verilen ürün adı ve bilgileri temel alarak, içinde hiç bir şekilde marka barındırmayan 800 karakteri aşmayacak şekilde akıcı, "
            . "müşterinin dikkatini çekecek Türkçe ürün açıklaması yazınız:\n\n";
        $promptDesc .= "ürün açıklamasında marka olarak algılabilecek hiç bir kelime olmasın!";
        $promptDesc .= "{$productName}\n";
        $promptDesc .= " {$categoryHier}\n";
        $promptDesc .= "{$colorName}\n";
        $promptDesc .= "{$orginal_desc}\n";
        $promptDesc .= "html formatında yaz, her satır p tagı ile başlasın\n";
        $promptDesc .= "\n";
        if (!empty($featuresText)) {
            $promptDesc .= "{$featuresText}\n";
        }

        $generatedDesc = $this->callOpenAI($promptDesc, 300);
        if ($generatedDesc === null) {
            // Fallback: boş metin veya basit bir cümle

        }


        return [
            'title_org' => $productName,
            'description_org' => $orginal_desc,

            'title_ai' => $generatedTitle,
            'description_ai' => $generatedDesc
        ];
    }


    public function getTyAttributes($attributes, $props)
    {


        $category_attr = $attributes['category_attributes'];

        $required_attr = array();
        foreach ($category_attr['result']['categoryAttributes'] as $categoryAttribute) {
            if ($categoryAttribute['required']) {

                $required_attr[] = $categoryAttribute;
            }

        }

        $result = $this->compareMandatoryAndProductAttributes($required_attr, $attributes['attributes'], $props);

        return $result;


    }


    /**
     * Mandatory ve ürün attribute'larını karşılaştırır, eksik olanları properties ve default değerlerle tamamlar.
     * Ayrıca present içinde attributeValueId null ise productAttributes'tan alır ve
     * attributeId 47 için string değer kullanır.
     *
     * @param array $mandatoryAttributes Zorunlu attribute tanımları (değer seçenekleri $m['values'] içinde)
     * @param array $productAttributes Üründe gelen attribute değerleri
     * @param array $properties Ek özellikler (additionalProperty) listesi
     * @return array ['present' => [...], 'missing' => [...]]
     */
    private function compareMandatoryAndProductAttributes(array $mandatoryAttributes, array $productAttributes, array $properties): array
    {


        // 1) Ürün attribute’larını attributeId’ye göre index’le
        $prodMap = [];
        foreach ($productAttributes as $p) {
            $prodMap[(int)$p['attributeId']] = $p;
        }

        $present = [];
        $missing = [];

        // print_r($mandatoryAttributes);

        // 2) Her zorunlu attribute’u kontrol et
        foreach ($mandatoryAttributes as $m) {
            $attrId = (int)$m['attribute']['id'];
            $attrName = $m['attribute']['name'];

            if (isset($prodMap[$attrId])) {
                $p = $prodMap[$attrId];
                // Produkt attribute varsa
                if ($attrId === 47) {
                    // ID 47 için custom değeri string olarak al
                    $value = $p['customAttributeValue'] ?? ($p['attributeValueId'] ?? null);
                    $present[] = ['attributeId' => $attrId, 'customAttributeValue' => $value];
                } elseif (isset($p['attributeValueId'])) {
                    $present[] = ['attributeId' => $attrId, 'attributeValueId' => (int)$p['attributeValueId']];
                } else {
                    $present[] = ['attributeId' => $attrId, 'attributeValueId' => null];
                }
            } else {
                // Üründe yoksa properties içinde ara
                $foundInProperties = false;

                foreach ($properties as $prop) {

                    //  echo 'attrname'.$attrName;
                    if ($prop['name'] === $attrName) {


                        $unit = $prop['unitText'];


                        // Diğerleri için m['values'] listesinde eşleşen ID ara
                        $valueId = null;
                        foreach ($m['attributeValues'] as $val) {


                            if (isset($val['value'], $val['id']) && $val['value'] === $unit) {
                                $valueId = (int)$val['attributeValueId'];

                                break;
                            }
                        }
                        // Eşleşme yoksa default ilk ID
                        if ($valueId === null && !empty($m['attributeValues'][0]['id'])) {
                            $valueId = (int)$m['attributeValues'][0]['id'];
                        }
                        $present[] = ['attributeId' => $attrId, 'attributeValueId' => $valueId];

                        $foundInProperties = true;
                        break;
                    }
                }
                if (!$foundInProperties) {
                    $missing[] = ['attributeId' => $attrId];
                }

                if (!empty($missing)) {
                    foreach ($missing as $miss) {
                        $id = $miss['attributeId'];
                        foreach ($mandatoryAttributes as $m) {
                            if ((int)$m['attribute']['id'] === $id) {

                                if (!empty($m['attributeValues'][0]['id'])) {

                                    $present[] = ['attributeId' => $id, 'attributeValueId' => (int)$m['attributeValues'][0]['id']];
                                }
                                break;
                            }
                        }
                    }
                    $missing = [];
                }
            }
        }

        // 3) Hala missing varsa, default (0. index) değer al


        return ['present' => $present, 'missing' => $missing];
    }


    function fetchAdditionalProperties(string $html): ?array
    {
        // 1. Sayfa içeriğini al


        // 2. Tüm <script type="application/ld+json"> bloklarını yakala
        if (preg_match_all('#<script\s+type=["\']application/ld\+json["\']>(.*?)</script>#si', $html, $matches)) {
            foreach ($matches[1] as $jsonBlock) {
                // 3. JSON'u decode et
                $data = json_decode(trim($jsonBlock), true);
                if (json_last_error() !== JSON_ERROR_NONE) {
                    continue; // geçersiz JSON ise diğer bloğa geç
                }

                // 4. Tek bir nesne olarak gelmişse
                if (isset($data['additionalProperty'])) {
                    return $data['additionalProperty'];
                }

                // 5. Dizi olarak gelmişse (örneğin [ {...}, {...} ])
                if (is_array($data)) {
                    foreach ($data as $entry) {
                        if (isset($entry['additionalProperty'])) {
                            return $entry['additionalProperty'];
                        }
                    }
                }
            }
        }

        // Bulunamazsa boş dizi döndür
        return [];
    }


    public function ty($product)
    {

        $prefix = $this->config->get('ty_setting_model_prefix');

        return array(
            'barcode' => (string)$product['barcode'] . $prefix,
            'listPrice' => $this->calculate_price($product['price']),
            'salePrice' => $this->calculate_price($product['price']),
            'vatRate' => (int)$product['tax_rate'],
            'productMainId' => $product['id'],
            'brandId' => (int)$product['brand_id'],
            'categoryId' => (int)$product['original_category_id'],
            'quantity' => 2,
            'stockCode' => (string)$product['product_code'] . $prefix,
            'currencyType' => 'TRY',
            'images' => $product['images'],
            'description' => $this->cleanTrendyolDescription($product['description_text']),
            'attributes' => $product['present_attributes'],
            'title' =>  $product['product_name']
        );

    }


    public function cs($product_data, $user_info)
    {
        // ==========================
        //  Güvenli alan kontrolleri
        // ==========================
        $category_source_id = $product_data['category_id']
            ?? ($product_data['original_category_id'] ?? 0);

        $category_name = $product_data['category_name'] ?? '';
        $url           = $product_data['url'] ?? '';
        $price         = isset($product_data['price']) ? (float)$product_data['price'] : 0.0;

        // ==========================
        //  Kategori bilgisini çek
        // ==========================
        $catUrl = "http://79.98.31.162/index.php?route=appi/category/get_category&category_id=" . (int)$category_source_id;

        $category_raw  = @file_get_contents($catUrl);
        $category_info = $category_raw ? json_decode($category_raw, true) : null;

        $csCat = $category_info['category_info']['cs'] ?? null;

        // ==========================
        //  Kategori bulunamadı
        // ==========================
        if (!$csCat) {
            return [
                '__error'     => true,
                'status'      => false,
                'message'     => "Kategori bulunamadı!kategor:" . $category_name,
                'url'         => $url,
                'sale_price2' => $price,
            ];
        }

        $category_id = (int)$csCat;
        if (!$category_id) {
            return [
                '__error'     => true,
                'status'      => false,
                'message'     => "Kategori ID geçersiz!kategor:" . $category_name,
                'url'         => $url,
                'sale_price2' => $price,
            ];
        }

        // ==========================
        //  API bilgisi (şimdilik kullanılmıyor ama hazır dursun)
        // ==========================
        $api_info = $this->model_tool_entegrasyon_api
            ->getEntegrasyonApiInfo('cs', $user_info['database_id']);

        // ==========================
        //  Temel alanlar
        // ==========================
        $prefix  = (string)$this->config->get('ty_setting_model_prefix');
        $barcode = (string)($product_data['barcode'] ?? '');

        // Marka opsiyonel
        $marka = $this->marka
            ? $this->marka
            : ($product_data['brand_name'] ?? '');

        // ==========================
        //  Ürün payload (Çiçeksepeti formatı)
        //  Gönderdiğin eski cs() metodundan birebir referanslı
        // ==========================
        $base_price = $price;

        $product = [
            'productName'         => (string)($product_data['product_name'] ?? ''),
            'mainProductCode'     => $barcode . $prefix,
            'stockCode'           => $barcode . $prefix,
            'categoryId'          => $category_id,
            'isActive'            => true,
            'description'         => str_ireplace($this->yasakli_kelimeler ?? [], '', $product_data['description_text'] ?? ''),
            //'mediaLink'         => '',
            'deliveryMessageType' => 6,
            'deliveryType'        => 2,
            'stockQuantity'       => 2,
            'barcode'             => $barcode . $prefix,
            'listPrice'           => $this->model_entegrasyon_addproduct
                ->calculate_price(1.1 * $base_price),
            'salesPrice'          => $this->model_entegrasyon_addproduct
                ->calculate_price($base_price),
            'images'              => [],
            'attributes'          => [],
        ];

        // ==========================
        //  Görseller (ilk 5 adet)
        // ==========================
        if (!empty($product_data['images']) && is_array($product_data['images'])) {
            foreach ($product_data['images'] as $key => $image) {
                if ($key < 5 && $image) {
                    $product['images'][] = $image;
                }
            }
        }

        // ==========================
        //  Kategori attribute'ları
        //  (eski cs() metodundaki endpoint)
        // ==========================
        $attrUrl  = "http://79.98.31.162/index.php?route=appi/category/get_cs_attributes&category_id=" . $category_id;
        $attr_raw = @file_get_contents($attrUrl);

        if ($attr_raw) {
            $attr_json = json_decode($attr_raw, true);
            if (!empty($attr_json['attributes']) && is_array($attr_json['attributes'])) {
                $product['attributes'] = $attr_json['attributes'];
            }
        }

        return $product;
    }


    public function hb($product_data, $user_info)
    {
        // Güvenli alan kontrolleri
        $original_category_id = $product_data['original_category_id'] ?? 0;
        $category_name        = $product_data['category_name'] ?? '';
        $url                  = $product_data['url'] ?? '';
        $price                = $product_data['price'] ?? 0;

        // ==========================
        //  Kategori bilgisini çek
        //  (file_get_contents yerine basit güvenli okuma)
        // ==========================
        $catUrl = "http://79.98.31.162/index.php?route=appi/category/get_category&category_id=" . (int)$original_category_id;

        $category_raw = @file_get_contents($catUrl);
        $category_info = $category_raw ? json_decode($category_raw, true) : null;

        $hbCat = $category_info['category_info']['hb'] ?? null;

        // ==========================
        //  Kategori bulunamadı
        // ==========================
        if (!$hbCat) {
            return [
                '__error'     => true,
                'status'      => false,
                'message'     => "Kategori bulunamadı!kategor:" . $category_name,
                'url'         => $url,
                'sale_price2' => $price
            ];
        }

        $category_id = (int)$hbCat;
        if (!$category_id) {
            // Çok nadir ama güvenlik için
            return [
                '__error'     => true,
                'status'      => false,
                'message'     => "Kategori ID geçersiz!kategor:" . $category_name,
                'url'         => $url,
                'sale_price2' => $price
            ];
        }

        // ==========================
        //  API bilgisi
        // ==========================
        $api_info = $this->model_tool_entegrasyon_api->getEntegrasyonApiInfo('hb', $user_info['database_id']);

        // ==========================
        //  Attribute list
        // ==========================
        $attr_list = [];
        if (!empty($product_data['attributes_list'])) {
            $attr_list = $this->model_catalog_product_finder->atrr_list($product_data['attributes_list']);
        }

        $hb_category_attr = $this->model_catalog_product_finder->get_hb_category_attr($category_id, $attr_list, $api_info);

        $barcode = $product_data['barcode'] ?? '';
        $prefix  = $this->config->get('ty_setting_model_prefix');

        // ==========================
        //  Ürün payload
        // ==========================
        $product = [
            "categoryId" => $category_id,
            "merchant"   => $api_info['merchant_id'],
            "attributes" => [
                "merchantSku"      => $barcode . $prefix,
                "VaryantGroupID"   => $product_data['id'] ?? 0,
                "Barcode"          => $barcode . $prefix,
                "price"            => $this->calculate_price($price),
                "stock"            => 2,
                "UrunAdi"          => $product_data['product_name'] ?? '',
                "UrunAciklamasi"   => str_ireplace($this->yasakli_kelimeler ?? [], '', $product_data['description_text'] ?? ''),
                "Marka"            => $product_data['brand_name'] ?? '',
                "GarantiSuresi"    => 24,
                "kg"               => 1,
                "tax_vat_rate"     => isset($product_data['tax_rate']) ? (int)$product_data['tax_rate'] : 20,
            ]
        ];

        // ==========================
        //  Görseller
        // ==========================
        if (!empty($product_data['images']) && is_array($product_data['images'])) {
            foreach ($product_data['images'] as $key => $image) {
                if ($key <= 7 && $image) {
                    $product['attributes']['Image' . ($key + 1)] = $image;
                }
            }
        }

        // ==========================
        //  Kategori attribute mapping
        // ==========================
        if (!empty($hb_category_attr) && is_array($hb_category_attr)) {
            foreach ($hb_category_attr as $item) {
                if (!empty($item)) {
                    $product["attributes"][$item['id']] = $item['value'];
                }
            }
        }

        return $product;
    }

    public function calculate_price($ty_price)
    {
        // Eğer $ty_price sayısal bir değer değilse, 0 olarak ayarla
        if (!is_numeric($ty_price)) {
            $ty_price = 0;
        }

        $multipliers = [
            [100, 9],
            [200, 8],
            [300, 7],
            [400, 6],
            [500, 5],
            [1000, 4],
            [2000, 3.5],
            [3000, 3.3],
            [5000, 3.0],
            [8000, 2.8],
        ];

        foreach ($multipliers as [$threshold, $multiplier]) {
            if ($ty_price < $threshold) {
                return number_format((float)$ty_price * $multiplier, 0, '', '');
            }
        }

        return number_format((float)$ty_price * 2.4, 0, '', '');
    }


    public function getTrendyolProductInfo($url)
    {
        $ch = curl_init($url);
        curl_setopt_array($ch, [
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_FOLLOWLOCATION => true,
            CURLOPT_USERAGENT => 'Mozilla/5.0',
        ]);
        $html = curl_exec($ch);
        curl_close($ch);


        echo $html;
        return;

        if (!$html) return ['error' => 'Sayfa alınamadı'];

        // PRELOADED_STATE blokunu ayıkla
        if (preg_match('/window\.__PRELOADED_STATE__\s*=\s*(\{.*?\});/s', $html, $match)) {
            $jsonRaw = $match[1];

            $json = json_decode($jsonRaw, true);
            if (!$json) return ['error' => 'JSON parse edilemedi'];

            // Ürün bilgisi Product tablosunda olabilir
            $productDetail = $json['product']['product'] ?? null;
            if ($productDetail) {
                return [
                    'name' => $productDetail['name'] ?? '',
                    'price' => $productDetail['price']['sellingPrice']['value'] ?? 0,
                    'stock' => ($productDetail['stock']['quantity'] ?? 0) > 0 ? 1 : 0
                ];
            }

            return ['error' => 'Ürün bilgisi bulunamadı'];
        }

        return ['error' => '__PRELOADED_STATE__ bulunamadı'];
    }


    public function getProductsBulkWithRetry(array $urls, int $maxConcurrency = 5, int $maxRetries = 0)
    {
        $allResults = [];
        $chunks = array_chunk($urls, $maxConcurrency);

        foreach ($chunks as $chunkIndex => $chunk) {
            $remaining = $chunk;
            $triesLeft = array_fill(0, count($chunk), $maxRetries);
            $chunkResults = array_fill(0, count($chunk), null);

            while (!empty($remaining)) {
                $multiHandle = curl_multi_init();
                $curlHandles = [];
                $mapIndexToUrl = [];

                foreach ($remaining as $relIndex => $path) {
                    $fullUrl = "https://www.trendyol.com" . $path['url'];

                    $headers = [
                        "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
                        "Accept-Language: tr-TR,tr;q=0.9,en-US;q=0.8,en;q=0.7",
                        "Cache-Control: no-cache",
                        "Connection: keep-alive",
                        "Upgrade-Insecure-Requests: 1",
                        "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36"
                    ];

                    $ch = curl_init();
                    curl_setopt($ch, CURLOPT_URL, $fullUrl);
                    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
                    curl_setopt($ch, CURLOPT_TIMEOUT, 20);
                    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
                    curl_setopt($ch, CURLOPT_COOKIEFILE, "");

                    curl_multi_add_handle($multiHandle, $ch);
                    $curlHandles[$relIndex] = $ch;
                    $mapIndexToUrl[$relIndex] = $relIndex;
                }

                $active = null;
                do {
                    $mrc = curl_multi_exec($multiHandle, $active);
                    if ($active && $mrc === CURLM_OK) {
                        curl_multi_select($multiHandle);
                    }
                } while ($active && $mrc === CURLM_OK);

                foreach ($curlHandles as $relIndex => $ch) {
                    $content = curl_multi_getcontent($ch);
                    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
                    $globalIndex = $relIndex;


                    if ($httpCode == 429 && $triesLeft[$globalIndex] > 0) {
                        $triesLeft[$globalIndex]--;
                        $remaining[$globalIndex] = $chunk[$globalIndex];
                    } else {
                        if ($httpCode == 200) {


                            preg_match('#<div class="envoy" data-reactroot=""></div><script>(.*?)</script>#si', $content, $attr_private);

                            preg_match('#<script type="application/javascript">(.*?)</script>#si', $content, $attr_second);

                            preg_match('/window\["__envoy__PROPS"\]\s*=\s*({.*?});?\s*<\/script>/s', $content, $attr_third);





                            if(isset($attr_third[1])){

                                $json = json_decode($attr_third[1], true);
                                $product = $json['product'];

                                if ($json && isset($json['product'])) {
                                    $product = $json['product'];

                                    if(isset($product['merchantListing']['winnerVariant']['price']['sellingPrice']['value']) && ($product['inStock'] ?? false) ){

                                        $stockStatus=true;

                                    }else {
                                        $stockStatus=false;

                                    }

                                    $chunkResults[$globalIndex] = [
                                        'has_stock' => $stockStatus,
                                        'httpcode' => $httpCode,
                                        'barcode' => $chunk[$globalIndex]['barcode'],
                                        'current_price' => $chunk[$globalIndex]['price'],
                                        'version' =>'new',
                                        'status' => true,
                                        'title' => $product['name'] ?? '',
                                        'image' => $product['images'][0] ?? '',
                                        'price' => $product['merchantListing']['winnerVariant']['price']['sellingPrice']['value'] ?? 0
                                    ];
                                }


                            }else if (isset($attr_private[1])) {

                                $attr = $attr_private;
                                $json = json_decode(explode('window["__envoy__PROPS"]=', $attr_private[1])[1], 1);


                                if ($json && isset($json['product'])) {
                                    $product = $json['product'];

                                    if(isset($product['merchantListing']['winnerVariant']['price']['sellingPrice']['value']) && ($product['inStock'] ?? false) ){

                                        $stockStatus=true;

                                    }else {
                                        $stockStatus=false;

                                    }

                                    $chunkResults[$globalIndex] = [
                                        'has_stock' => $stockStatus,
                                        'httpcode' => $httpCode,
                                        'barcode' => $chunk[$globalIndex]['barcode'],
                                        'current_price' => $chunk[$globalIndex]['price'],
                                        'version' =>'new',
                                        'status' => true,
                                        'title' => $product['name'] ?? '',
                                        'image' => $product['images'][0] ?? '',
                                        'price' => $product['merchantListing']['winnerVariant']['price']['sellingPrice']['value'] ?? 0
                                    ];
                                }

                            } else if (isset($attr_second[1])) {

                                $attr = $attr_second;
                                if (isset($attr[1])) {
                                    preg_match('/"hasStock":(true|false)/', $attr[1], $hasStockMatch);
                                    $hasStock = $hasStockMatch[1] ?? 'true';

                                    preg_match('/"barcode":"([^"]+)"/', $attr[1], $barcodeMatch);
                                    $barcode = $barcodeMatch[1] ?? '';

                                    preg_match('/"sellingPrice":\{"text":"[^"]+","value":([0-9.]+)\}/', $attr[1], $sellingPriceMatch);
                                    $sellingPrice = $sellingPriceMatch[1] ?? 0;

                                    preg_match('/"nameWithProductCode":"([^"]+)"/', $attr[1], $nameMatch);
                                    $productName = $nameMatch[1] ?? '';

                                    preg_match('/"images":\["([^"]+)"/', $attr[1], $imageMatch);
                                    $firstImage = $imageMatch[1] ?? '';

                                    $chunkResults[$globalIndex] = [
                                        'has_stock' => ($hasStock === "true") ? 1 : 0,
                                        'httpcode' => $httpCode,
                                        'barcode' => $chunk[$globalIndex]['barcode'],
                                        'current_price' => $chunk[$globalIndex]['price'],
                                        'version' =>'old',

                                        'status' => true,
                                        'title' => $productName,
                                        'image' => $firstImage,
                                        'price' => $sellingPrice
                                    ];
                                }


                            } else if (isset($attr_thirt[2])) {

                                echo "buraya düştük";

                                $json=json_decode($attr_thirt[2],1);

                                print_r($json);

                            } else
                            {

                                $chunkResults[$globalIndex] = [];


                            }


                        } elseif ($httpCode == 404) {
                            $chunkResults[$globalIndex] = [
                                'has_stock' => 0,
                                'httpcode' => 404,
                                'barcode' => $chunk[$globalIndex]['barcode'],
                                'status' => true,
                                'price' => 0
                            ];
                        } else {
                            $chunkResults[$globalIndex] = [
                                'has_stock' => 0,
                                'httpcode' => $httpCode,
                                'barcode' => $chunk[$globalIndex]['barcode'],
                                'status' => ($httpCode == 429 ? false : true),
                                'price' => 0
                            ];
                        }
                        unset($remaining[$globalIndex]);
                    }

                    sleep(1);
                    curl_multi_remove_handle($multiHandle, $ch);
                    curl_close($ch);
                }

                curl_multi_close($multiHandle);

                if (!empty($remaining)) {
                    sleep(2);
                }
            }

            foreach ($chunkResults as $i => $res) {
                $allResults[$chunkIndex * $maxConcurrency + $i] = $res;
            }

            sleep(1);
        }

        ksort($allResults);
        return $allResults;
    }

    public function getProductsBulkWithRetryAlt(array $urls, int $maxConcurrency = 5, int $maxRetries = 0)
    {
        $allResults = [];
        $chunks = array_chunk($urls, $maxConcurrency);


        foreach ($chunks as $chunkIndex => $chunk) {
            $remaining = $chunk;
            $triesLeft = array_fill(0, count($chunk), $maxRetries);
            $chunkResults = array_fill(0, count($chunk), null);

            while (!empty($remaining)) {
                $multiHandle = curl_multi_init();
                $curlHandles = [];
                $mapIndexToUrl = [];

                foreach ($remaining as $relIndex => $path) {


                    $fullUrl = "https://www.trendyol.com" . $path['url'];

                    echo $fullUrl;

                    $ch = curl_init();
                    curl_setopt($ch, CURLOPT_URL, $fullUrl);
                    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
                    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)');
                    curl_setopt($ch, CURLOPT_TIMEOUT, 10);

                    curl_multi_add_handle($multiHandle, $ch);
                    $curlHandles[$relIndex] = $ch;
                    $mapIndexToUrl[$relIndex] = $relIndex;
                }

                $active = null;
                do {
                    $mrc = curl_multi_exec($multiHandle, $active);
                    if ($active && $mrc === CURLM_OK) {
                        curl_multi_select($multiHandle);
                    }
                } while ($active && $mrc === CURLM_OK);

                foreach ($curlHandles as $relIndex => $ch) {
                    $content = curl_multi_getcontent($ch);
                    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
                    $globalIndex = $relIndex;

                    if ($httpCode == 429 && $triesLeft[$globalIndex] > 0) {
                        $triesLeft[$globalIndex]--;
                        $remaining[$globalIndex] = $chunk[$globalIndex];
                    } else {
                        if ($httpCode == 200) {



                            preg_match('#<script type="application/javascript">(.*?)</script>#si', $content, $attr);
                            if (isset($attr[1])) {
                                preg_match('/"hasStock":(true|false)/', $attr[1], $hasStockMatch);
                                $hasStock = $hasStockMatch[1] ?? 'true';

                                preg_match('/"barcode":"([^"]+)"/', $attr[1], $barcodeMatch);
                                $barcode = $barcodeMatch[1] ?? '';

                                preg_match('/"sellingPrice":\{"text":"[^"]+","value":([0-9.]+)\}/', $attr[1], $sellingPriceMatch);
                                $sellingPrice = $sellingPriceMatch[1] ?? 0;

                                preg_match('/"nameWithProductCode":"([^"]+)"/', $attr[1], $nameMatch);
                                $productName = $nameMatch[1] ?? '';

                                preg_match('/"images":\["([^"]+)"/', $attr[1], $imageMatch);
                                $firstImage = $imageMatch[1] ?? '';

                                $chunkResults[$globalIndex] = [
                                    'has_stock' => ($hasStock === "true") ? 1 : 0,
                                    'httpcode' => $httpCode,
                                    'barcode' => $chunk[$globalIndex]['barcode'],
                                    'current_price' => $chunk[$globalIndex]['price'],
                                    'status' => true,
                                    'title' => $productName,
                                    'image' => $firstImage,
                                    'price' => $sellingPrice
                                ];
                            } else {
                                $chunkResults[$globalIndex] = [
                                    'has_stock' => 0,
                                    'httpcode' => 200,
                                    'barcode' => $chunk[$globalIndex]['barcode'],
                                    'current_price' => $chunk[$globalIndex]['price'],
                                    'status' => false,
                                    'price' => 0
                                ];
                            }
                        } elseif ($httpCode == 404) {
                            $chunkResults[$globalIndex] = [
                                'has_stock' => 0,
                                'httpcode' => 404,
                                'barcode' => $chunk[$globalIndex]['barcode'],
                                'status' => true,
                                'price' => 0
                            ];
                        } else {
                            $chunkResults[$globalIndex] = [
                                'has_stock' => 0,
                                'httpcode' => $httpCode,
                                'barcode' => $chunk[$globalIndex]['barcode'],
                                'status' => ($httpCode == 429 ? false : true),
                                'price' => 0
                            ];
                        }
                        unset($remaining[$globalIndex]);
                    }

                    sleep(1);
                    curl_multi_remove_handle($multiHandle, $ch);
                    curl_close($ch);
                }

                curl_multi_close($multiHandle);

                if (!empty($remaining)) {
                    sleep(2);
                }
            }

            foreach ($chunkResults as $i => $res) {
                $allResults[$chunkIndex * $maxConcurrency + $i] = $res;
            }

            sleep(1);
        }

        ksort($allResults);
        return $allResults;
    }


    public function seo($str)
    {

        $bul = array('İ', 'Ü', 'Ç', 'Ğ', 'Ş', 'Ö', 'ı');
        $degistir = array('i', 'u', 'c', 'g', 's', 'o', 'i');
        return str_replace($bul, $degistir, $str);

    }

    public function getOrginalInfo($product)
    {

        $aiResult = $this->generateAIContent($product);

    }


    function getTrendyolInStock($url) {
        // 1. cURL ile sayfa içeriğini çek
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)');
        $html = curl_exec($ch);
        curl_close($ch);
        

        if (!$html) {
            return ['success' => false, 'message' => 'Sayfa içeriği alınamadı.'];
        }

        // 2. Sayfadaki JSON verisini bul (window.__PRODUCT_DETAIL_APP_INITIAL_STATE__)
        if (preg_match('/window\["__envoy__PROPS"\]\s*=\s*({.*?});?\s*<\/script>/s', $html, $matches)) {
            $jsonString = $matches[1];


            $data = json_decode($jsonString, true);



            if (isset($data['product']['inStock'])) {
                return [
                    'success' => true,
                    'inStock' => $data['product']['inStock']
                ];
            } else {
                return ['success' => false, 'message' => 'inStock alanı bulunamadı.'];
            }
        } else {
            return ['success' => false, 'message' => 'JSON verisi bulunamadı.'];
        }
    }



}