<?php

namespace marketplace;
final class Cs
{

    private $registry;
    private $db;
    private $session;
    private $url;
    private $config;
    private $log;
    private $customer;
    private $currency;
    private $tax;
    private $apiKey;
    private $password;
    private $shopId;
    private $client = null;
    private $apiUrl = 'https://apis.ciceksepeti.com';

    public function __construct($registry)
    {


        $this->db = $registry->get('db');
        $this->config = $registry->get('config');
        $this->session = $registry->get('session');
        $this->url = $registry->get('url');
        $this->config = $registry->get('config');
        $this->log = $registry->get('log');
        $this->customer = $registry->get('customer');
        $this->currency = $registry->get('currency');
        $this->tax = $registry->get('tax');
        $this->registry = $registry;
        $this->apiKey = $this->config->get('cs_api_anahtari');
        $this->shopId = $this->config->get('cs_satici_numarasi');

    }

    protected function login($data)
    {

        $this->apiKey = $data['apiKey'];
        // $this->shopId = $data['shopId'];
    }


    public function checkApi($params)
    {

        $post_data['start'] = date("Y-m-d H:i:s", strtotime("+1 day"));
        $post_data['end'] = date("Y-m-d H:i:s", strtotime("-1 day"));


        $result = $this->get_orders($post_data, $params);

        if(!$result['status']){

            $result['message']="Api bilgileriniz doğrulanamadı, Lütfen kontrol ederek tekrar deneyiniz.";

        }

        return $result;
    }


    public function update_all($product_data, $api_info)
    {


        $message = array();

        $this->login($api_info);

        $productMainId = isset($product_data['product_setting']['cs_product_code']) ? $product_data['product_setting']['cs_product_code'] ? $product_data['product_setting']['cs_product_code'] : $product_data['model'] : $product_data['model'];
        $barcode = isset($product_data['product_setting']['cs_barcode']) ? $product_data['product_setting']['cs_barcode'] ? $product_data['product_setting']['cs_barcode'] : $product_data['model'] : $product_data['model'];

        $product_data['model'] = $product_data['model'];


        $is_product_exists = $this->get_product(array('barcode' => $product_data['model']), $api_info);


        $list_price = $product_data['list_price'];
        $price = $product_data['sale_price'];


        if ($product_data['variants']) {

            if ($product_data['variants']['variants']['options']) {


                foreach ($product_data['variants']['variants']['options'] as $variant) {


                    $attributes = $product_data['attributes'];
                    foreach ($variant['attributes'] as $attribute) {
                        $attributes[] = array(
                            'id' => $attribute['attributeId'],
                            'valueId' => $attribute['attributeValueId'],
                            'textLength' => 0
                        );
                    }


                    $product = array(
                        'productName' => (string)$product_data['title'],
                        'mainProductCode' => (string)$productMainId,
                        'stockCode' => (string)$productMainId . $variant['prefix'],
                        'categoryId' => (int)$product_data['category_id'],
                        'description' => html_entity_decode($product_data['description'], ENT_QUOTES, 'UTF-8'),
                        //'medialink' => '',
                        'deliveryMessageType' => isset($product_data['defaults']['delivery_message_type']) ? $product_data['defaults']['delivery_message_type'] : 4,
                        'deliveryType' => isset($product_data['defaults']['delivery_type']) ? $product_data['defaults']['delivery_type'] : 2,
                        'stockQuantity' => (int)$variant['quantity'],
                        'barcode' => (string)$barcode . $variant['prefix'],
                        'salesPrice' => $this->priceControl($price + $variant['price']),
                        'images' => $product_data['images'],
                        'attributes' => $attributes,
                    );

                    if ($list_price > $price) {

                        $product['listPrice'] = $this->priceControl($list_price);

                    }

                    $cicek_product['products'][] = $product;

                }

            } else {

                return array('status' => false, 'message' => 'Varyantlı ürün listelemek için önce ürün Seçenek değerlerini eşleştirmelisiniz, Kategori ayarlarından seçenek değerlerini eşleştirebilirsiniz.', 'result' => array());

            }

        } else {


            $attributes = array();

            if (isset($product_data['attributes'])) {
                foreach ($product_data['attributes'] as $attribute) {

                    // isim = $attribute['valueId'] == 235
                    if ($attribute['valueId'] == 288 || $attribute['valueId'] == 338 || $attribute['valueId'] == 192 || $attribute['valueId'] == 3 - 192 || $attribute['valueId'] == 3 || $attribute['valueId'] == 349 || $attribute['valueId'] == 2004519 || $attribute['valueId'] == 306) {
                        $attribute['textLength'] = 55;

                    } else {
                        $attribute['textLength'] = 0;

                    }

                    $attributes[] = $attribute;

                }
            }


            $product = array(
                'productName' => (string)$product_data['title'],
                'mainProductCode' => (string)$productMainId,
                'stockCode' => (string)$productMainId,
                'categoryId' => (int)$product_data['category_id'],
                'description' => html_entity_decode($product_data['description'], ENT_QUOTES, 'UTF-8'),
                //'medialink' => '',
                'deliveryMessageType' => $product_data['defaults']['delivery_message_type'] ? $product_data['defaults']['delivery_message_type'] ? $product_data['defaults']['delivery_message_type'] : 4 : 4,
                'deliveryType' => $product_data['defaults']['delivery_type'] ? $product_data['defaults']['delivery_type'] : 2,
                'stockQuantity' => (int)$product_data['quantity'],
                'barcode' => (string)$barcode,
                'salesPrice' => $this->priceControl($price),
                'images' => $product_data['images'],
                'attributes' => $attributes,
            );

            if ($list_price > $price) {

                $product['listPrice'] = $this->priceControl($list_price);

            }

            $cicek_product['products'][] = $product;

        }


        //  print_r($cicek_product);return;


        $this->login($api_info);
        $url = '/api/v1/Products';
        $result = $this->clientConnect($cicek_product, $url, 'PUT');


        $message = array();
        $status = true;

        $checkBatch = array();
        // $result['status']=true;
        //$result['result']['batchId']='6e8bb8df-6b7d-4971-ae05-e2b3c00b259c';


        if ($result['status'] && isset($result['result']['batchId'])) {

            $checkBatch = $this->check_status($result['result']['batchId'], $api_info);

            sleep(4);
            $checkBatch = $this->check_status($result['result']['batchId'], $api_info);


            if (!$checkBatch['status']) {

                if ($checkBatch['result']['message'] = 'Missing Authentication Token') {
                    $message[] = 'Api Bilgileriniz Hatalıdır. Lütfen kontrol ederek tekrar giriniz.';
                } else {
                    $message[] = $checkBatch['result']['message'];
                }
                return array('status' => false, 'message' => $message, 'result' => array());

            }
            if ($checkBatch['result']['items'][0]['failureReasons']) {


                foreach ($checkBatch['result']['items'][0]['failureReasons'] as $error) {
                    $message[] = $error['message'];

                    $status = false;
                }
            } else {

                $message[] = 'Ürün Çiçeksepeti Mağazanıza Başarıyla Gönderildi. Çiçeksepeti tarafından Kontrol edildikten sonra panelinizde görünecektir.';

            }

        } else {

            if ($result['message'] == 'Mevcut isteğiniz işleniyor...') {

                $status = true;
                $message[] = 'Ürün Çiçeksepeti Mağazanıza daha önce gönderimiş. Çiçeksepeti tarafından Kontrol edildikten sonra panelinizde görünecektir.';

            } else {
                $message[] = $result['message'];

            }


        }


        if (!$status && !$message) {

            $message[] = 'Hata mesajı bulunamadı';

        }

        if ($message) {

            $hata_mesaji = implode('-', $message);

        } else {

            $hata_mesaji = '';
        }

        return array('status' => $status, 'message' => $hata_mesaji, 'result' => array());


    }

    public function update_fast($products, $api_info, $mode = false)
    {



        $this->login($api_info);

        $update_data = array();

        foreach ($products as $product) {

            if($product['quantity']>0){
                $update_data['items'][] = array(
                    "stockCode" => $product['stock_code'],
                    "stockQuantity" => $product['quantity'],
                    "salesPrice" => isset($product['salesPrice']) ? $product['salesPrice'] : $product['listPrice'],
                    "listPrice" => $product['listPrice'],

                );
            }else {
                $update_data['items'][] = array(
                    "stockCode" => $product['stock_code'],
                    "stockQuantity" => $product['quantity'],

                );
            }



        }


        $url = '/api/v1/Products/price-and-stock';



        $result = $this->clientConnect($update_data, $url, 'PUT');

        return $result;

        // print_r($result);

        sleep(15);

        //$batch_id='efb114dc-1f7f-11ec-acd3-1e71a8da6f2a-1632753888';

        if ($result['status'] && isset($result['result']['batchId'])) {


            $checkBatch = $this->check_status($result['result']['batchId'], $api_info);

            print_r($checkBatch);
            $result = array();
            if ($checkBatch['result']) {

                foreach ($checkBatch['result']['items'] as $item) {

                    if ($item['status'] == 'Failed') {

                        $result[$item['data']['stockCode']] = isset($item['failureReasons'][0]['message']) ? $item['failureReasons'][0]['message'] . '-' . $item['data']['stockCode'] : 'Girilen stok kodu geçerizdir. ' . $item['data']['stockCode'];

                    }/*else if($item['status']=='Pending'){

                        $result[$item['data']['stockCode']] = 'Güncelleme isteği gönderildi ancak işlem sonucu henüz çiçeksepeti tarafından bildirilmedi! . '.$item['data']['stockCode'] ;

                    }*/


                }

            }


            return array('status' => true, 'message' => array(), 'result' => $result);


        } else {

            $message[] = $result['result']['Message'];
            return array('status' => false, 'message' => $message, 'result' => array());
        }


    }


    public function update_basic($product_data, $api_info, $mode = false)
    {

        $this->login($api_info);

        $productMainId = isset($product_data['product_setting']['cs_product_code']) ? $product_data['product_setting']['cs_product_code'] : $product_data['model'];
        $barcode = isset($product_data['product_setting']['cs_barcode']) ? $product_data['product_setting']['cs_barcode'] : $product_data['model'];

        $message = '';
        $status = true;

        //$result['result']['batchId']='6e8bb8df-6b7d-4971-ae05-e2b3c00b259c';

        //  $checkBatch = $this->check_status($result['result']['batchId'], $api_info);

        //print_r($checkBatch);
        //return;

        $update_data = array();

        if (isset($product_data['variants']['message'])) {
            if ($product_data['variants']['message']) {

                return array('status' => false, 'message' => 'Ürün seçenekleri eşleşmemiş, ürünü varyantlı olarak güncellemek istiyorsanız kategori eşleştirme ayarlarından tüm seçenekleri eşleştiriniz, varyantlı güncellemek istemiyorsanız genel ayarlardan varyantlı ürün gönderme seçeneğini deaktif ediniz, yada ürün seçeneklerini siliniz.', 'result' => array());
            }
        }


        if ($product_data['variants']) {

            foreach ($product_data['variants']['variants'] as $variant) {

                if ($mode == 'close') {

                    $quantity = 0;
                } else {

                    $quantity = $variant['quantity'];

                }




                if ($product_data['list_price'] > $product_data['sale_price']) {

                    $product['listPrice'] = $this->priceControl($product_data['list_price'] + $variant['price']);

                }
                $update_data['items'][] = $product;


            }

        } else {


            if ($mode == 'close') {

                $quantity = 0;
            } else {

                $quantity = $product_data['quantity'];

            }

            $product = array(
                "stockCode" => $productMainId,
                "StockQuantity" => $quantity,
                "salesPrice" => $this->priceControl($product_data['sale_price']),
            );

            if ($product_data['list_price'] > $product_data['sale_price']) {

                $product['listPrice'] = $this->priceControl($product_data['list_price']);

            }
            $update_data['items'][] = $product;

        }


        //print_r($update_data);return;

        $url = '/api/v1/Products/price-and-stock';


        $result = $this->clientConnect($update_data, $url, 'PUT');
        // sleep(10);

        //print_r($result);
        //return ;
        // $result['status']=true;
        /*    $result['result']['batchId']='a94a39e1-2be6-4818-a515-77b4ae1d8ab1';

                $checkBatch = $this->check_status($result['result']['batchId'], $api_info);

            print_r($checkBatch);
            return ;*/


        if ($result['status'] && isset($result['result']['batchId'])) {

            $message=array();
            sleep(5);
            $checkBatch = $this->check_status($result['result']['batchId'], $api_info);


            if (!$checkBatch['status']) {

                if ($checkBatch['result']['message'] = 'Missing Authentication Token') {
                    $message[] = 'Api Bilgileriniz Hatalıdır. Lütfen kontrol ederek tekrar giriniz.';
                } else {

                    $message[] = $checkBatch['result']['message'];

                }


                return array('status' => false, 'message' => implode('-', $message), 'result' => array());

            }

            if (isset($checkBatch['result']['items'][0]['failureReasons'])) {
                if ($checkBatch['result']['items'][0]['failureReasons']) {


                    foreach ($checkBatch['result']['items'][0]['failureReasons'] as $error) {
                        $message[] = $error['message'];

                        $status = false;
                    }

                    return array('status' => false, 'message' => implode('-', $message), 'result' => array());

                }
            }


        } else {


            $message = 'Ürün  Başarıyla Güncellendi';
            $status = true;
        }

        /*   if (!$result['status']) {

               $status = false;
               $message = $result['message'];

           } else {
               $message = 'Ürün  Başarıyla Güncellendi';
               $status = true;

           }*/


        return array('status' => $status, 'message' => $message, 'result' => array());


    }

    public function get_orders($product_data, $api_info)
    {

        //  date_default_timezone_set('Europe/Istanbul');


        $this->login($api_info);


        $baslangicTarihi = new \DateTime($product_data['start']);

        $bitisTarihi = new \DateTime($product_data['end']); // now()

        $end = $baslangicTarihi->format(\DateTime::RFC3339);
        $start = $bitisTarihi->format(\DateTime::RFC3339);


        $params = array(
            "startDate" => $start,
            "endDate" => $end,
            "pageSize" => 20,
            "page" => 0,
            //"statusId"=>11

        );


        return $this->clientConnect($params, '/api/v1/Order/GetOrders', 'POST');


    }

    public function get_products($product_data, $api_info)
    {

        $this->login($api_info);

        sleep(6);
        $url = '/api/v1/Products?Page=' . $product_data['page'] . '&PageSize='.$product_data['itemcount'].'&SortMethod='.uniqid();

        if(isset($product_data['on_sale'])){


            if($product_data['on_sale']){

                $url.='&ProductStatus=3';

            }else {

                $url.='&ProductStatus=8';

            }

        }else {

            $url.='&ProductStatus=3';
        }

        return $this->clientConnect(null, $url);

    }

    public function get_product($product_data, $api_info)
    {


        $this->login($api_info);

        $url = '/api/v1/Products?StockCode=' . $product_data['barcode'];


        return $this->clientConnect(null, $url);


    }

    public function category_attributes($product_data, $api_info)
    {
        $this->login($api_info);
        $url = '/api/v1/categories/' . $product_data . '/attributes';
        return $this->clientConnect(null, $url);

    }

    private function priceControl($price)
    {
        return str_replace(',', '.', $price);

    }


    public function sell_product($product_data, $api_info, $mode = 'POST')
    {
        // AUTH
        $this->login($api_info);

        // Dokümana göre endpoint
        // Prod:  POST https://apis.ciceksepeti.com/api/v1/Products
        // Test:  POST https://sandbox-apis.ciceksepeti.com/api/v1/Products
        $url = '/api/v1/Products';

        // Body: { "products": [ ... ] }
        $cicek_product = array('products' => array());

        foreach ($product_data as $product_datum) {
            // $product_datum içeriği dokümandaki alan isimlerine göre hazırlanmış olmalı:
            // productName, mainProductCode, stockCode, categoryId, description, ...
            $cicek_product['products'][] = $product_datum;
        }

        // Ürün yükleme isteğini gönder
        $result = $this->clientConnect($cicek_product, $url, $mode);

        $message     = array();
        $status      = false;
        $checkBatch  = array();
        $batchResult = array();

        // 1) HTTP/transport seviyesi hata kontrolü
        if (!isset($result['status']) || !$result['status']) {

            // Bazı durumlarda "Mevcut isteğiniz işleniyor..." mesajı gelebiliyor
            if (!empty($result['message']) && $result['message'] == 'Mevcut isteğiniz işleniyor...') {
                $status    = true;
                $message[] = 'Ürün Çiçeksepeti Mağazanıza daha önce gönderilmiş. '
                    . 'Çiçeksepeti tarafından kontrol edildikten sonra panelinizde görünecektir.';
            } else {
                $message[] = !empty($result['message'])
                    ? $result['message']
                    : 'Çiçeksepeti ürün yükleme servisine erişilemedi.';
            }

            return array(
                'status'  => $status,
                'message' => implode(' - ', $message),
                'result'  => $checkBatch
            );
        }

        // 2) Dokümana göre başarılı çağrıda mutlaka "batchId" dönmeli
        if (empty($result['result']['batchId'])) {
            $message[] = 'Çiçeksepeti API beklenen "batchId" bilgisini döndürmedi.';
            if (!empty($result['message'])) {
                $message[] = $result['message'];
            }

            return array(
                'status'  => false,
                'message' => implode(' - ', $message),
                'result'  => $checkBatch
            );
        }

        $batchId = $result['result']['batchId'];

        // 3) İşlemin kuyruğa alınması için kısa bir süre bekleyip
        //    "Ürün İşlemleri Kontrolü" (batch-status) metodunu çağırıyoruz.
        sleep(5);

        $checkBatch = $this->check_status($batchId, $api_info);

        // check_status wrapper'ının dönüş yapısının
        // ['status' => bool, 'message' => ..., 'result' => decodedJson]
        // olduğunu varsayıyoruz.
        if (!isset($checkBatch['status']) || !$checkBatch['status']) {

            if (!empty($checkBatch['result']['message'])) {
                // BURADA "=" HATASI VARDI, "==" OLARAK DÜZELTTİK
                if ($checkBatch['result']['message'] == 'Missing Authentication Token') {
                    $message[] = 'Api Bilgileriniz Hatalıdır. Lütfen kontrol ederek tekrar giriniz.';
                } else {
                    $message[] = $checkBatch['result']['message'];
                }
            } else {
                $message[] = 'Ürün işlemleri kontrolü sırasında bir hata oluştu.';
            }

            return array(
                'status'  => false,
                'message' => implode(' - ', $message),
                'result'  => $checkBatch
            );
        }

        // 4) Batch sonucu dokümandaki yapıya göre işleniyor
        // {
        //   "batchId": "...",
        //   "itemCount": 1,
        //   "items": [
        //     {
        //       "data": {...},
        //       "itemId": "...",
        //       "status": "Failed|Success|Pending|Processing|Warning",
        //       "failureReasons": [ { "message": "...", "code": 4000 } ],
        //       ...
        //     }
        //   ]
        // }
        $batchResult  = isset($checkBatch['result']) ? $checkBatch['result'] : array();
        $itemMessages = array();
        $hasError     = false;
        $hasWarning   = false;

        if (!empty($batchResult['items']) && is_array($batchResult['items'])) {
            foreach ($batchResult['items'] as $item) {
                $itemStatus = isset($item['status']) ? $item['status'] : null;
                $stockCode  = isset($item['data']['stockCode']) ? $item['data']['stockCode'] : '';

                if ($itemStatus === 'Failed' || $itemStatus === 'Warning') {

                    if ($itemStatus === 'Failed') {
                        $hasError = true;
                    } else {
                        $hasWarning = true;
                    }

                    if (!empty($item['failureReasons']) && is_array($item['failureReasons'])) {
                        foreach ($item['failureReasons'] as $failure) {
                            $msg = isset($failure['message']) ? $failure['message'] : 'Bilinmeyen hata';
                            if ($stockCode) {
                                $msg = '[' . $stockCode . '] ' . $msg;
                            }
                            $itemMessages[] = $msg;
                        }
                    } else {
                        $msg = 'İşlem statüsü: ' . $itemStatus;
                        if ($stockCode) {
                            $msg = '[' . $stockCode . '] ' . $msg;
                        }
                        $itemMessages[] = $msg;
                    }
                }
            }
        }

        // 5) Genel statü ve mesaj üretimi
        if ($hasError) {
            $status  = false;
            $message = array_merge(
                array('Bir veya daha fazla ürün Çiçeksepeti\'ne aktarılırken hata oluştu.'),
                $itemMessages
            );
        } elseif ($hasWarning) {
            // Warning: dokümana göre işlem başarılı ama gözden geçirilmesi gerekiyor
            $status  = true;
            $message = array_merge(
                array('Ürünler Çiçeksepeti\'ne gönderildi ancak bazı kayıtlar için uyarı bulunuyor. Lütfen detayları kontrol edin.'),
                $itemMessages
            );
        } else {
            // İlk item üzerinden genel statü kontrolü (Pending / Processing / Success ...)
            $overallStatus = null;
            if (!empty($batchResult['items'][0]['status'])) {
                $overallStatus = $batchResult['items'][0]['status'];
            }

            if ($overallStatus === 'Success') {
                $status    = true;
                $message[] = 'Ürün(ler) Çiçeksepeti mağazanıza başarıyla gönderildi. '
                    . 'Çiçeksepeti tarafından kontrol edildikten sonra panelinizde görünecektir.';
            } elseif ($overallStatus === 'Pending' || $overallStatus === 'Processing') {
                $status    = true;
                $message[] = 'Ürün işlemi Çiçeksepeti tarafında henüz tamamlanmamış ('
                    . $overallStatus . '). Bir süre sonra tekrar kontrol edin.';
            } else {
                // item yoksa veya statü set edilmemişse
                $status    = true;
                $message[] = 'Ürünler Çiçeksepeti\'ne gönderildi, detaylar için batchId sonucu kontrol edebilirsiniz.';
            }
        }

        if (!$status && !$message) {
            $message[] = 'Hata mesajı bulunamadı';
        }

        return array(
            'status'  => $status,
            'message' => implode(' - ', $message),
            'result'  => $batchResult
        );
    }

    public function add_product($product_data, $api_info)
    {

        $product_data['title'] = str_replace('<', '-', $product_data['title']);
        $product_data['title'] = str_replace('>', '-', $product_data['title']);

        // $result['result']['batchId']='49f9389c-dd41-4f21-9bef-9e6349b29451';

        /*    $checkBatch = $this->check_status($result['result']['batchId'], $api_info);
   print_r($checkBatch);
   return;
   */


        $images = array();

        $message = array();

        $this->login($api_info);

        $productMainId = isset($product_data['product_setting']['cs_product_code']) ? $product_data['product_setting']['cs_product_code'] ? $product_data['product_setting']['cs_product_code'] : $product_data['model'] : $product_data['model'];
        $barcode = isset($product_data['product_setting']['cs_barcode']) ? $product_data['product_setting']['cs_barcode'] ? $product_data['product_setting']['cs_barcode'] : $product_data['model'] : $product_data['model'];


        $product_data['model'] = $product_data['model'];

        $description = $this->filtre(html_entity_decode($product_data['description'], ENT_QUOTES, 'UTF-8'));

        $is_product_exists = $this->get_product(array('barcode' => $product_data['model']), $api_info);


        if (isset($is_product_exists['result']['totalCount'])) {
            if ($is_product_exists['result']['totalCount']) {
                return array('status' => true, 'message' => 'Ürün Çiçeksepeti mağazanızda mevcut olduğu için güncellenmiştir.', 'result' => '');
            }
        }


        $list_price = $product_data['list_price'];
        $price = $product_data['sale_price'];
        $product_data['title'] = $product_data['manufacturer'] . ' ' . $product_data['title'];


        if ($product_data['variants']) {

            if ($product_data['variants']['variants']['options']) {


                foreach ($product_data['variants']['variants']['options'] as $variant) {


                    $attributes = $product_data['attributes'];
                    foreach ($variant['attributes'] as $attribute) {
                        $attr = array(
                            'id' => $attribute['attributeId'],
                            'valueId' => $attribute['attributeValueId'],
                        );

                        if (!in_array($attr, $product_data['attributes'])) {
                            $attributes[] = $attr;
                        }

                    }

                    $product = array(
                        'productName' => (string)$product_data['title'],
                        'mainProductCode' => (string)$productMainId,
                        'stockCode' => (string)$variant['model'],
                        'categoryId' => (int)$product_data['category_id'],
                        'description' => $description,
                        //'medialink' => '',
                        'deliveryMessageType' => $product_data['defaults']['delivery_message_type'] ? $product_data['defaults']['delivery_message_type'] : 4,
                        'deliveryType' => $product_data['defaults']['delivery_type'] ? $product_data['defaults']['delivery_type'] : 2,
                        'stockQuantity' => (int)$variant['quantity'],
                        'barcode' => (string)$variant['barcode'],
                        'salesPrice' => $this->priceControl($price + $variant['price']),
                        'images' => $variant['image'] ? array($variant['image']) : $product_data['images'],
                        'attributes' => $attributes,
                    );

                    if ($list_price > $price) {

                        $product['listPrice'] = $this->priceControl($list_price + $variant['price']);

                    }

                    $cicek_product['products'][] = $product;

                }

            } else {

                return array('status' => false, 'message' => 'Varyantlı ürün listelemek için önce ürün Seçenek değerlerini eşleştirmelisiniz, Kategori ayarlarından seçenek değerlerini eşleştirebilirsiniz.', 'result' => array());

            }

        } else {


            $attributes = array();
            foreach ($product_data['attributes'] as $attribute) {
                /*    if (strstr("d-",$attribute['valueId'])){

                       $attribute['textLength'] = 55;

                   }*/
                if ($attribute['valueId'] == 288 || $attribute['valueId'] == 338 || $attribute['valueId'] == 192 || $attribute['valueId'] == 3 - 192 || $attribute['valueId'] == 3 || $attribute['valueId'] == 349 || $attribute['valueId'] == 2004519 || $attribute['valueId'] == 306) {
                    $attribute['textLength'] = 55;
                }

                $attributes[] = $attribute;
            }

            $product = array(
                'productName' => (string)$product_data['title'],
                'mainProductCode' => (string)$productMainId,
                'stockCode' => (string)$productMainId,
                'categoryId' => (int)$product_data['category_id'],
                'description' => $description,
                //'medialink' => '',
                'deliveryMessageType' => $product_data['defaults']['delivery_message_type'] ? $product_data['defaults']['delivery_message_type'] : 4,
                'deliveryType' => $product_data['defaults']['delivery_type'] ? $product_data['defaults']['delivery_type'] : 2,
                'stockQuantity' => (int)$product_data['quantity'],
                'barcode' => (string)$barcode,
                'salesPrice' => $this->priceControl($price),
                'images' => $product_data['images'],
                'attributes' => $attributes,
            );

            if ($list_price > $price) {

                $product['listPrice'] = $this->priceControl($list_price);

            }

            $cicek_product['products'][] = $product;

        }


        /*   print_r($cicek_product);
           return;
        */

        //print_r($cicek_product);return;

        $this->login($api_info);
        $url = '/api/v1/Products';
        //$checkBatch = $this->check_status('c34d4955-3c78-48c4-950a-bf3732cimagesf45bf', $api_info);

        //print_r($checkBatch);
        //return;


        $result = $this->clientConnect($cicek_product, $url, 'POST');

        //return $result;
        // print_r($result);return;


        $message = array();
        $status = true;

        $checkBatch = array();
        // $result['status']=true;
        //$result['result']['batchId']='6e8bb8df-6b7d-4971-ae05-e2b3c00b259c';


        if ($result['status'] && isset($result['result']['batchId'])) {

            //$checkBatch = $this->check_status($result['result']['batchId'], $api_info);
            sleep(5);
            $checkBatch = $this->check_status($result['result']['batchId'], $api_info);

            //print_r($checkBatch);return ;

            if (!$checkBatch['status']) {

                if ($checkBatch['result']['message'] = 'Missing Authentication Token') {
                    $message[] = 'Api Bilgileriniz Hatalıdır. Lütfen kontrol ederek tekrar giriniz.';
                } else {
                    $message[] = $checkBatch['result']['message'];
                }
                return array('status' => false, 'message' => $message, 'result' => array());

            }
            if ($checkBatch['result']['items'][0]['failureReasons']) {


                foreach ($checkBatch['result']['items'][0]['failureReasons'] as $error) {
                    $message[] = $error['message'];

                    $status = false;
                }
            } else {

                $message[] = 'Ürün Çiçeksepeti Mağazanıza Başarıyla Gönderildi. Çiçeksepeti tarafından Kontrol edildikten sonra panelinizde görünecektir.';

            }

        } else {

            if ($result['message'] == 'Mevcut isteğiniz işleniyor...') {

                $status = true;
                $message[] = 'Ürün Çiçeksepeti Mağazanıza daha önce gönderimiş. Çiçeksepeti tarafından Kontrol edildikten sonra panelinizde görünecektir.';

            } else {
                $status = false;

                $message[] = $result['message'];

            }


        }


        if (!$status && !$message) {

            $message[] = 'Hata mesajı bulunamadı';

        }

        if ($message) {

            $hata_mesaji = implode('-', $message);

        } else {

            $hata_mesaji = '';
        }

        return array('status' => $status, 'message' => $hata_mesaji, 'result' => $checkBatch['result']);


    }

    public function filtre($str)
    {
        $bul = array('kama', 'zerafet');

        return str_replace($bul, '', $str);

    }

    public function close_for_sale($product_data, $api_info)
    {


        $update_data=array();

        foreach ($product_data as $product) {


            $update_data['items'][] = array(
                "stockCode" => $product,
                "stockQuantity" => 0

            );
        }

        $url = '/api/v1/Products/price-and-stock';

        // print_r($update_data);return;

        $result = $this->clientConnect($update_data, $url, 'PUT');



        sleep(10);


        if(isset($result['result']['batchId'])){
            $batch_id=$result['result']['batchId'] ?$result['result']['batchId']:false ;

            $result_batch = $this->check_status($batch_id,$api_info);
            //print_r($result_batch);

            return array('status'=> $batch_id, 'message'=>'','result'=>array());

        }else {

            return array('status'=> false,'message'=>$result['result']['Message'],'result'=>array());

        }


    }

    public function open_for_sale($product_data, $api_info)
    {

        return $this->update_basic($product_data, $api_info, 'open');

    }


    public function clientConnect($data = null, $url, $type = 'GET')
    {
        $status      = false;
        $message     = '';
        $resultArray = array();

        // Temel URL birleştirme
        $fullUrl = rtrim($this->apiUrl, '/') . $url;

        // GET isteğinde data geldiyse ve URL’de daha önce query yoksa querystring’e çevir
        if (strtoupper($type) === 'GET' && !empty($data) && is_array($data) && strpos($fullUrl, '?') === false) {
            $fullUrl .= '?' . http_build_query($data);
            $data = null; // Body göndermeyelim
        }

        $curl = curl_init($fullUrl);

        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_HEADER, false);
        curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 10);
        curl_setopt($curl, CURLOPT_TIMEOUT, 60);

        // Çiçeksepeti dokümana göre x-api-key header'ı zorunlu :contentReference[oaicite:1]{index=1}
        $headers = array(
            'x-api-key: ' . $this->apiKey,
            'Content-Type: application/json',
            'Accept: application/json'
        );
        curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);

        // TODO: canlıda güvenlik için bunları true yap
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);

        $type = strtoupper($type);

        switch ($type) {
            case 'POST':
                curl_setopt($curl, CURLOPT_POST, true);
                if ($data !== null) {
                    curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data, JSON_UNESCAPED_UNICODE));
                }
                break;

            case 'PUT':
            case 'PATCH':
            case 'DELETE':
                curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $type);
                if ($data !== null) {
                    curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data, JSON_UNESCAPED_UNICODE));
                }
                break;

            default: // GET
                // Üstte URL’ye query ekledik, ekstra bir şey yapmaya gerek yok
                break;
        }

        $raw      = curl_exec($curl);
        $curlErrNo = curl_errno($curl);
        $curlErr   = curl_error($curl);
        $httpCode  = (int)curl_getinfo($curl, CURLINFO_HTTP_CODE);

        curl_close($curl);

        // 1) cURL seviyesinde hata (network, SSL vs.)
        if ($curlErrNo) {
            $message = 'cURL hata (' . $curlErrNo . '): ' . $curlErr;

            return array(
                'status'    => false,
                'message'   => $message,
                'result'    => array(),
                'http_code' => $httpCode,
                'raw'       => $raw,
            );
        }

        // 2) JSON decode
        $decoded = null;
        if (strlen($raw)) {
            $decoded = json_decode($raw, true);
        }

        if ($decoded === null && json_last_error() !== JSON_ERROR_NONE) {
            // Çiçeksepeti API'leri JSON döndürüyor, o yüzden burası genelde hata demek
            $message = 'Geçersiz JSON cevap alındı.';

            return array(
                'status'    => false,
                'message'   => $message,
                'result'    => array('raw' => $raw),
                'http_code' => $httpCode,
            );
        }

        $resultArray = is_array($decoded) ? $decoded : array();

        // 3) HTTP koduna göre temel başarı/başarısızlık kararı
        if ($httpCode >= 200 && $httpCode < 300) {
            // Örn: Ürün Yükleme metodu başarılı istekte 200 + {"batchId": "..."} döndürüyor :contentReference[oaicite:2]{index=2}
            $status = true;

            // Bazı servislerin "isSuccess": false döndürme ihtimaline karşı
            if (isset($resultArray['isSuccess']) && $resultArray['isSuccess'] === false) {
                $status = false;
            }

            // Başarılı istekte de "message" dönüyorsa ekrana yansısın
            if (isset($resultArray['message']) && $resultArray['message']) {
                $message = $resultArray['message'];
            }
        } else {
            // 4xx / 5xx durumlar: hata
            $status = false;

            if (isset($resultArray['message']) && $resultArray['message']) {
                $message = $resultArray['message'];

                // AWS API Gateway kaynaklı klasik hata
                if ($message === 'Missing Authentication Token') {
                    $message = 'Missing Authentication Token - Endpoint veya x-api-key hatalı ya da yetkisiz olabilir.';
                }
            } elseif (isset($resultArray['error'])) {
                $message = $resultArray['error'];
            } elseif (isset($resultArray['errorMessage'])) {
                $message = $resultArray['errorMessage'];
            } else {
                $message = 'HTTP hata kodu: ' . $httpCode;
            }
        }

        return array(
            'status'    => $status,
            'message'   => $message,
            'result'    => $resultArray,
            'http_code' => $httpCode,
        );
    }

    public function check_status($product_data, $api_info)
    {
        $this->login($api_info);


        $url = '/api/v1/Products/batch-status/' . $product_data;


        $result = $this->clientConnect(null, $url);


        return $result;

    }


    public function get_questions($api_info)
    {
        //  date_default_timezone_set('Europe/Istanbul');
        $this->login($api_info);



        // $url = 'https://api.trendyol.com/sapigw/suppliers/' . $this->shopId . '/orders?status=' . $product_data;
        // $hour = 12;
        // $today              = strtotime($hour . ':00:00');



        $yesterday = date('Y-m-d',strtotime('-7 day'));
        $today = date('Y-m-d');

        // $dayBeforeYesterday = strtotime('-1 day', $yesterday);

        $question_list=array();


        $url = '/api/v1/sellerquestions?CreateStartDate='.$yesterday.'&CreateEndDate='.$today.'&Answered=False&Page=1';


        $result = $this->clientConnect(null, $url);



        if($result['result']['items']){

            foreach ($result['result']['items'] as $question) {

                $question_list[]=array('id'=>$question['id'],'url'=>$question['product']['url'], 'text'=>$question['question']);
            }

        }

        return $question_list;


    }
    public function reply_question($product_data, $api_info)
    {
        //  date_default_timezone_set('Europe/Istanbul');
        $this->login($api_info);

        $answer_data=array(
            "answer"=> $product_data['text'],
            "branchActionId"=> 2,
            "branchActionDetailId"=> 2,
            "branchDescription"=> ""

        );

        $curl = curl_init();

        curl_setopt_array($curl, array(
            CURLOPT_URL => 'https://apis.ciceksepeti.com/api/v1/sellerquestions/'.$product_data['question_id'],
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_ENCODING => '',
            CURLOPT_MAXREDIRS => 10,
            CURLOPT_TIMEOUT => 0,
            CURLOPT_FOLLOWLOCATION => true,
            CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
            CURLOPT_CUSTOMREQUEST => 'PUT',
            CURLOPT_POSTFIELDS =>json_encode($answer_data),
            CURLOPT_HTTPHEADER => array(
                'x-api-key: '.$this->apiKey,
                'Content-Type: application/json',
                'Cookie: __cf_bm=hYelAM1bwOkAwaf_VqqDQVVI573NRZvsrFrncF913bk-1721768293-1.0.1.1-cx3kMcX5LVD1ZQd6Nx13q4A2RecrnCExPfdPQQ.dnN1NiJx5b1n6JtfMdlGKBspzVZzOtsVk_oPje6js5727mg'
            ),
        ));

        $response = curl_exec($curl);

        curl_close($curl);
        return json_decode($response,1);

    }



}
