<?php
error_reporting(E_ALL ^ E_NOTICE ^ E_STRICT ^ E_WARNING ^ E_DEPRECATED);
include '../_plugins/medoo.php';
$reader = new XMLReader();
$writer = new XMLWriter();

$mdb = new medoo([
  'database_type' => 'mysql',
  'database_name' => 'host117523_temp',
  'server' => 'localhost',
  'username' => 'host117523_temp',
  'password' => 'XAGwZ3XRa9fgtM63um7v',
  'charset' => 'utf8'
]);

// Otwórz plik XML do odczytu
if (!$reader->open('googleProducts.xml')) {
  die("Failed to open the XML file");
}

// Liczba wszystkich elementów `item`
$totalItems = 0;
while ($reader->read()) {
  if ($reader->nodeType == XMLReader::ELEMENT && $reader->localName == 'item') {
    $totalItems++;
  }
}
$reader->close();

// Otwórz ponownie plik XML do przetwarzania
$reader->open('googleProducts.xml');

// Otwórz plik tymczasowy XML do zapisu
$tempFile = 'googleProducts_temp.xml';
$writer->openURI($tempFile);
$writer->startDocument('1.0', 'UTF-8');
$writer->setIndent(true);

// Dodanie przestrzeni nazw
$writer->startElement('rss');
$writer->writeAttribute('version', '2.0');
$writer->writeAttribute('xmlns:g', 'http://base.google.com/ns/1.0');
$writer->startElement('channel');

// Inicjalizacja zmiennych
$products = [];
$skipFirstItems = 1000;
$processedItems = 0;
$hasMoreItems = false;

// Przeczytaj XML strumieniowo
while ($reader->read()) {
  if ($reader->nodeType == XMLReader::ELEMENT && $reader->localName == 'item') {
    if ($processedItems < $skipFirstItems) {
      // Przetwórz elementy `item` do momentu przekroczenia limitu `skipFirstItems`
      $product = [];
      $depth = $reader->depth;
      $processedItems++;

      while ($reader->read() && !($reader->nodeType == XMLReader::END_ELEMENT && $reader->depth == $depth)) {
        if ($reader->nodeType == XMLReader::ELEMENT) {
          $currentElement = $reader->name;
          $namespaceURI = $reader->namespaceURI;
        } elseif ($reader->nodeType == XMLReader::TEXT || $reader->nodeType == XMLReader::CDATA) {
          if (!isset($product[$currentElement])) {
            $product[$currentElement] = '';
          }
          $product[$currentElement] .= $reader->value;
        }
      }

      // Dodaj produkt do listy produktów
      $products[] = $product;
    } else {
      $hasMoreItems = true;
      // Przepisywanie pozostałych elementów `item`
      $writer->startElement('item');
      $depth = $reader->depth;

      while ($reader->read() && !($reader->nodeType == XMLReader::END_ELEMENT && $reader->depth == $depth)) {
        if ($reader->nodeType == XMLReader::ELEMENT) {
          $writer->startElement($reader->name);
          if ($reader->hasAttributes) {
            while ($reader->moveToNextAttribute()) {
              $writer->writeAttribute($reader->name, $reader->value);
            }
            $reader->moveToElement();
          }
        } elseif ($reader->nodeType == XMLReader::TEXT) {
          $writer->text($reader->value);
        } elseif ($reader->nodeType == XMLReader::CDATA) {
          $writer->writeCData($reader->value);
        } elseif ($reader->nodeType == XMLReader::END_ELEMENT) {
          $writer->endElement();
        }
      }
      $writer->endElement();
    }
  } elseif ($reader->nodeType == XMLReader::ELEMENT && $reader->localName != 'rss' && $reader->localName != 'channel') {
    // Przepisywanie elementów XML poza przetworzonymi 'item' oraz pomijanie 'rss' i 'channel'
    $writer->startElement($reader->name);
    if ($reader->hasAttributes) {
      while ($reader->moveToNextAttribute()) {
        $writer->writeAttribute($reader->name, $reader->value);
      }
      $reader->moveToElement();
    }
  } elseif ($reader->nodeType == XMLReader::TEXT) {
    $writer->text($reader->value);
  } elseif ($reader->nodeType == XMLReader::CDATA) {
    $writer->writeCData($reader->value);
  } elseif ($reader->nodeType == XMLReader::END_ELEMENT && $reader->localName != 'rss' && $reader->localName != 'channel') {
    $writer->endElement();
  }
}

// Zakończ elementy
$writer->endElement(); // channel
$writer->endElement(); // rss

// Zakończ dokument
$writer->endDocument();
$writer->flush();

// Zamknij oba pliki
$reader->close();

// Podmiana oryginalnego pliku tymczasowym
if (!rename($tempFile, 'googleProducts.xml')) {
  die("Failed to replace the original XML file");
}

// echo '<pre>' . print_r($products, true) . '</pre>';

// Wyświetl produkty i zapisz do bazy danych
$addedProducts = 0;
foreach ($products as $product) {
  $productId = $product['g:id'];
  // Sprawdź, czy produkt już istnieje w bazie danych
  $existingProduct = $mdb->get('dekodum_xml', '*', ['product_id' => $productId]);

  if (!$existingProduct) {
    $addedProducts++;
    // Jeśli produkt nie istnieje, dodaj go do bazy danych
    $mdb->insert('dekodum_xml', [
      'product_id' => $productId,
      'title' => $product['title'],
      'link' => $product['link'],
      'image_link' => $product['g:image_link'],
      'mpn' => $product['g:mpn'],
      'brand' => $product['g:brand'],
      'google_product_category' => $product['g:google_product_category'],
      'item_group_id' => $product['g:item_group_id'],
    ]);
  }
}

$remainingItems = $totalItems - $processedItems;

echo "Pierwsze $skipFirstItems elementów 'item' zostało odczytanych. Dodałem $addedProducts produktów. Pozostało $remainingItems elementów do przetworzenia.";

// Odśwież stronę, jeśli są jeszcze elementy 'item'
if ($hasMoreItems) {
  echo '<script>
        setTimeout(function(){
            window.location.reload();
        }, 1000);
    </script>';
}
