<?php class ControllerEntegrasyonSpecialUpdate extends Controller
{
    private $reg;
    private $username = "admin";
    private $password;
    private $shopId;
    private $proxies = [
        "https://www.nikadu.com.tr",
        "https://www.colezium.com",
        "https://www.deilmi.com",
        "https://www.ozdleather.com"
    ];

    public function __construct($registry)
    {
        parent::__construct($registry);
        $this->reg = $registry;
    }

    public function test()
    {
        $this->load->model("tool/entegrasyon_api");
        $user_info_query = $this->db->query("SELECT * FROM oc_user_database ud LEFT JOIN oc_user u ON (ud.database_id=u.user_database_id) WHERE ud.name='" . USERNAME . "'");
        $queryp = $this->db->query("SELECT * FROM auto_update WHERE auto_update_id=1");

        $page = $queryp->row['current_page'];
        $recycle = $queryp->row['recycle'];
        $limit = 125;
        $start = ($page - 1) * $limit;

        $total = $this->db->query("SELECT COUNT(*) AS total FROM product_url WHERE (hb=1 OR pz=1 OR cs=1)")->row['total'];
        $query = $this->db->query("SELECT * FROM product_url WHERE (hb=1 OR pz=1 OR cs=1) LIMIT $start, $limit");
        $total_page = ceil($total / $limit);

        echo 'current_page: ' . $page;
        echo 'total_page: ' . $total_page;

        if ($page >= $total_page) {
            $recycle++;
            $page = 1;
            echo 'büyük';
            $this->db->query("UPDATE auto_update SET current_page='$page', status=1, recycle='$recycle', total_page='$total_page', date_modified=NOW() WHERE auto_update_id=1");
        }

// $update_list = array_map(fn($item) => $this->get_product(explode('?', $item['url'])[0]), $query->rows);

//print_r($update_list);
    }


    public function db_check()
    {

        // Veritabanı bağlantısını yapalım (OpenCart'da zaten mevcut)
        $query = $this->db->query("SHOW COLUMNS FROM `product_url` LIKE 'status'");

// Eğer 'status' sütunu yoksa, ALTER TABLE ile sütunu ekleyelim
        if (!$query->num_rows) {
            $this->db->query("ALTER TABLE `product_url` ADD `status` INT(1) NOT NULL AFTER `ty`");
        }


    }

    public function index()
    {


        $min_total_view = 10;
        $min_add_list = 2;
        $min_sales = 0;


        // Sayfa yüklenme süresi başlangıcı
        $start_time = microtime(true);

        $this->load->model("tool/entegrasyon_api");
        $user_info_query = $this->db->query("SELECT * FROM `oc_user_database` ud LEFT JOIN oc_user u ON (ud.database_id=u.user_database_id) WHERE ud.name='" . USERNAME . "'");
        $queryp = $this->db->query("SELECT * FROM auto_update WHERE auto_update_id=1");

        $page = $queryp->row['current_page'];
        $recycle = $queryp->row['recycle'];
        $limit = 20;
        $start = ($page - 1) * $limit;

        $total = $this->db->query("SELECT count(*) as total FROM `market_product` mp left join product_url pu on mp.barcode=pu.barcode where market_product_id !='' and pu.status=1 and pu.special_price > 0 and mp.total_view >='" . $min_total_view . "' and mp.total_sale >='" . $min_sales . "' and mp.total_add_list >='" . $min_add_list . "' and mp.sale_status=1")->row['total'];
        $query = $this->db->query("SELECT * FROM `market_product` mp left join product_url pu on mp.barcode=pu.barcode where market_product_id !='' and pu.status=1 and mp.total_view >='" . $min_total_view . "' and pu.special_price > 0 and mp.total_sale >='" . $min_sales . "' and mp.total_add_list >='" . $min_add_list . "' and mp.sale_status=1");
        $total_page = ceil($total / $limit);

        echo 'geçerli_sayfa: ' . $page;
        echo 'toplam_sayfa: ' . $total_page;

        $update_list = [];

        foreach ($query->rows as $item) {


            print_r($item);


            $optimize_price = $this->optimizePrices($item);
            print_r($optimize_price);
            return;


        }

        return;

        foreach ($query->rows as $item) {
            // 429 hatası durumunda yeniden deneme
            $retry = 0;
            do {
                $result = $this->get_product(explode('?', $item['url'])[0]);
                if ($result['httpcode'] == 429) {
                    echo "429 Too Many Requests hatası. Bekleniyor... ({$retry})";
                    sleep(1); // 1 saniye bekleme süresi
                    $retry++;
                }
            } while ($result['httpcode'] == 429 && $retry < 5);

            if ($result['httpcode'] == 404) {
                $this->db->query("DELETE FROM `product_url` WHERE id='" . $item['id'] . "'");
                echo $item['url'] . " Silindi!";
                continue;
            }


            if ($result['status']) {

                $status = $result['has_stock'] ? 1 : 0;
                $this->db->query("UPDATE product_url SET `status`='" . $status . "', title='" . $this->db->escape($result['title']) . "', image='" . $this->db->escape($result['image']) . "', update_cycle = update_cycle + 1, orginal_price='" . $result['price'] . "', last_update_date = NOW() WHERE id='" . $item['id'] . "'");


                //ürünün fiyatı 20 bin tlden büyükse ürünü kapat.
                if ($this->calculate_price($result['price']) > 20000) {
                    $quantity = 0; // Set stock to 0
                } else {
                    $quantity = !$result['has_stock'] ? 0 : 5; // Keep the original stock logic
                }

                $update_data = [
                    'barcode' => $item['barcode'],
                    'salePrice' => $this->calculate_price($result['price']),
                    'listPrice' => $this->calculate_price($result['price']),
                    'quantity' => $quantity,
                ];

                if ($item['ty'] && $item['barcode']) {
                    $update_list['ty'][] = $update_data;
                }
                if ($item['hb'] && $item['barcode']) {
                    if ($item['special_price']) {
                        $update_data['salePrice'] = $item['special_price'];
                    }
                    $update_list['hb'][] = array_merge($update_data, ['stockCode' => $item['stock_code']]);
                }
                if ($item['cs'] && $item['barcode']) {
                    $market_product = $this->db->query("SELECT * FROM market_product WHERE barcode LIKE '%" . $result['barcode'] . "%' AND code='cs'")->row;
                    if ($market_product) {
                        if ($market_product['marketplace_product_id']) {
                            $update_list['cs'][] = array_merge($update_data, [
                                'stock_code' => $market_product['barcode'],
                                'marketplace_product_id' => $market_product['marketplace_product_id'],
                            ]);
                        }
                    }
                }
                if ($item['n11'] && $item['barcode']) {
                    $market_product = $this->db->query("SELECT * FROM market_product WHERE barcode LIKE '%" . $result['barcode'] . "%' AND code='n11'")->row;
                    if ($market_product['marketplace_product_id']) {
                        $update_list['n11'][] = array_merge($update_data, [
                            'marketplace_product_id' => $market_product['marketplace_product_id'],
                        ]);
                    }
                }
                if ($item['pz'] && $item['barcode']) {
                    $update_list['pz'][] = $update_data;
                }
            } else {
                $status = 0;

                $this->db->query("UPDATE product_url SET `status`='" . (int)$status . "', last_update_date = NOW() WHERE id='" . $item['id'] . "'");

            }
        }

        print_r($update_list);
        if ($update_list) {
            foreach (['pz', 'cs', 'hb', 'ty', 'n11'] as $marketplace) {
                if (isset($update_list[$marketplace])) {
                    echo strtoupper($marketplace) . ' Güncelleme';
                    $className = "Marketplace\\$marketplace";
                    $this->reg->set($marketplace, new $className($this->registry));

                    $api_info = $this->model_tool_entegrasyon_api->getEntegrasyonApiInfo($marketplace, $user_info_query->row['database_id']);
                    $result = $this->{$marketplace}->update_fast($update_list[$marketplace], $api_info);
                    print_r($result);
                }
            }

            $page = ($page >= $total_page) ? 1 : $page + 1;
            $this->db->query("UPDATE auto_update SET current_page='$page', status=0, total_page='$total_page', date_modified=NOW() WHERE auto_update_id=1");
        } else {
            echo 'güncellenmedi!';
        }

        // Sayfa yüklenme süresi bitişi
        $end_time = microtime(true);

        // Geçen süreyi hesapla (saniye cinsinden)
        $execution_time = $end_time - $start_time;

        // Dakika ve saniye olarak yazdırma
        $minutes = floor($execution_time / 60);
        $seconds = $execution_time - ($minutes * 60);

        echo "Sayfa yüklenme süresi: " . $minutes . " dakika " . round($seconds, 2) . " saniye";
    }

    function optimizePrices($product)
    {
        $alis_fiyati = (float)$product['orginal_price']; // Alış fiyatı
        $satis_fiyati = (float)$product['list_price'];   // Satış fiyatı
        $sabit_fiyat = !empty($product['special_price']) && $product['special_price'] > 0 ? (float)$product['special_price'] : null; // Sabit fiyat (null veya 0 değilse)
        $oran = 20; // %5 oran

        // %5 indirim ve %5 artış hesaplama
        $indirimli_fiyat = $satis_fiyati * 0.80; // %5 indirim
        $arttirilmis_fiyat = $satis_fiyati * 1.20; // %5 artış

        // Eğer sabit fiyat varsa ve sabit fiyat, alış fiyatının 2 katından küçükse, sabit fiyatı en az 2 katına ayarlıyoruz
        if ($sabit_fiyat !== null && $sabit_fiyat < $alis_fiyati * 2) {
            $sabit_fiyat = $alis_fiyati * 2;
        }

        // Sabit fiyat tanımlıysa ve indirim sonrası fiyat sabit fiyattan düşükse sabit fiyatı al
        if ($sabit_fiyat !== null) {
            // Fiyat yüksek, %5 indirim yap
            if ($satis_fiyati > $sabit_fiyat) {
                $indirimli_fiyat = max($indirimli_fiyat, $sabit_fiyat);
                $update_data = [
                    'barcode' => $product['barcode'],
                    'salePrice' => $indirimli_fiyat,
                    'listPrice' => $indirimli_fiyat,
                    'quantity' => 5,
                ];
            } else {
                // Fiyat düşük, %5 artış yap
                $arttirilmis_fiyat = max($arttirilmis_fiyat, $sabit_fiyat);
                $update_data = [
                    'barcode' => $product['barcode'],
                    'salePrice' => $arttirilmis_fiyat,
                    'listPrice' => $arttirilmis_fiyat,
                    'quantity' => 5,
                ];
            }
        } else {
            // Sabit fiyat yoksa, sadece %5 indirim veya %5 artış yap
            if ($satis_fiyati > $alis_fiyati * 2) {
                // %5 indirim uygula (satış fiyatı alış fiyatının 2 katından fazla olmalı)
                $indirimli_fiyat = max($indirimli_fiyat, $alis_fiyati * 2);
                $update_data = [
                    'barcode' => $product['barcode'],
                    'salePrice' => $indirimli_fiyat,
                    'listPrice' => $indirimli_fiyat,
                    'quantity' => 5,
                ];
            } else {
                // %5 artış yap
                $arttirilmis_fiyat = max($arttirilmis_fiyat, $alis_fiyati * 2);
                $update_data = [
                    'barcode' => $product['barcode'],
                    'salePrice' => $arttirilmis_fiyat,
                    'listPrice' => $arttirilmis_fiyat,
                    'quantity' => 5,
                ];
            }
        }

        return $update_data;
    }


}