<?php

namespace App\Http\Controllers;

use DOMDocument;
use DOMXPath;
use App\Models\CountryCode;
use Illuminate\Http\Request;
use Illuminate\Http\Client\Pool;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Log;

class CountryCompareController extends Controller
{
  private $countries = [];
  private $cHash = [];
  private $dom = null;
  public function __construct()
  {
    $countries = [];
    $cHash = [];
    CountryCode::active('Y')->each(function ($country) use (&$countries, &$cHash) {
      $countries[] = $country;
      $cHash[$country->country_name] = $country->country_code;
    });

    $this->countries = collect($countries);
    $this->cHash = collect($cHash);
    $this->dom = new DOMDocument();
  }
  public function search(Request $request)
  {
    $itemCodes = $request->input("item_codes");
    $ta_codes = explode(' ', str_replace('.', '', trim($itemCodes)));

    $requests = $this->makeRequests($ta_codes[0]);
    return $this->processResponse($requests, $ta_codes[0]);
  }

  public function compare($countries, $cHash, $aCodes)
  {
    $requests = $this->makeRequests($aCodes);
    return $this->processResponse($requests, $aCodes);
  }
  public function makeRequests($ta_code)
  {
    $requests = Http::pool(fn (Pool $pool) => [
      $this->countries->each(function ($country) use ($pool, $ta_code) {
        Log::info('Getting page {url}', ['url' => $country->search_url . $ta_code[0]]);
        return $pool->as($country->country_code)->withUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36')->get($country->search_url . $ta_code[0]);
      })
    ]);
    return $requests;
  }

  public function makeRequest($ta_code, $country)
  {
    $country = CountryCode::where('country_name', $country)->first();
    return Http::pool(fn (Pool $pool) => [
      $pool->as($country->country_name)->get($country->search_url . $ta_code)
    ]);
  }

  public function processResponse($responses, $code)
  {
    $code = $code[0];
    $prices = [];


    foreach ($this->countries as $c) {

      $country = $c->country_code;

      if ($responses[$country] instanceof \Illuminate\Http\Client\Response && $responses[$country]->ok()) {

        // dd($responses);
        $response = (string) $responses[$country]->body();
        //dd($response)
        switch ($country) {
          case "BG":
          case "CY":
          case "GR":
            $prices[$country] = $this->parseJson_CY_GR_BG($code, (string) $response, $country);
            break;
          case "IS":
            $prices[$country] = $this->parseJson_IS($code, (string) $response, $country);
            break;
          case "TR":
            $prices[$country] = $this->parseJson_TR($code, (string) $response, $country);
            break;
          case "EE":
          case "LT":
          case "LV":
            $prices[$country] = $this->parseJson_EE_LT_LV($code, (string) $response, $country);
            break;
          default:
            $prices[$country] = $this->parseJson($code, (string) $response, $country);
        }
      }
    }

    $products = [];
    collect($prices)->each(function ($price) use (&$products) {
      if (count($price))
        $products[] = $price;
    });
    return collect($products);
  }

  public function parseJson($code, $json_raw, $country)
  {
    $json_values = array();
    Log::info('{json_raw} {country}', [$json_raw, $country]);
    $json_decoded = json_decode($json_raw, true);

    $searchResultPage = $json_decoded["searchResultPage"];
    $products = $searchResultPage["products"];
    $main = $products["main"];
    $items = $main["items"];

    foreach ($items as $item) {
      $product = $item["product"];

      $salesPrice = $product["salesPrice"];
      $numeral = $salesPrice["numeral"];

      $json_values = array(
        'code' => $code,
        'url' => $product['pipUrl'],
        'tag' => $product['tag'],
        'country' => $country,
        'salesPrice' => $numeral,
      );
      break;
    }

    return $json_values;
  }

  public function parseJson_TR($code, $body, $country)
  {
    //echo "country: " . $country . ", code: " . $code . "<br>";

    $dochtml = new DOMDocument();
    @$dochtml->loadHTML($body, LIBXML_NOERROR);

    @$xpath = new DOMXpath($dochtml);
    $price = null;
    //$c = ltrim($code, "0");
    $json_values = array();

    @$url_product = $xpath->query('/html/head/meta[(@property="og:url")]/@content')[0]->nodeValue;
    @$price = $xpath->query('/html/head/meta[(@property="og:price:amount")]/@content')[0]->nodeValue;

    $price = floatval(trim(str_replace('.', '', $price)));

    $json_values = array(
      'code' =>   $code,
      'url' => $url_product,
      'tag' => null,
      'salesPrice' => floatval($price),
      'country' => $country,
    );

    return $json_values;
  }

  public function parseJson_CY_GR_BG($code, $body, $country)
  {
    //echo "country: " . $country . ", code: " . $code . "<br>";
    //Log::info('{country},{body},{code}',[$country, $body, $code]);
    //$body = file_get_contents("https://www.ikea.bg/search-results/?query=80366284");
    libxml_use_internal_errors(true);
    $dochtml = new DOMDocument();
    @$dochtml->loadHTML($body, LIBXML_NOERROR);

    @$xpath = new DOMXpath($dochtml);
    $price = null;
    $c = ltrim($code, "0");
    $json_values = array();

    @$price = $xpath->query('//*/div[(@class="yotpo yotpo-main-widget" and @data-product-id="' . $code . '")]/@data-price')[0]->nodeValue;
    @$url_product = $xpath->query('//*/div[(@class="yotpo yotpo-main-widget" and @data-product-id="' . $code . '")]/@data-url')[0]->nodeValue;

    $price = floatval($price);


    $json_values = array(
      'code' => $code,
      'url' => $url_product,
      'tag' => null,
      'salesPrice' => floatval($price),
      'country' => $country,
    );
    libxml_clear_errors();
    return $json_values;
  }

  public function parseJson_EE_LT_LV($code, $body, $country)
  {
    //echo "country: " . $country . ", code: " . $code . "<br>";

    $dochtml = new DOMDocument();
    @$dochtml->loadHTML($body);

    @$xpath = new DOMXpath($dochtml);
    $price = null;
    $c = ltrim($code, "0");
    $json_values = array();

    @$price = $xpath->query('//*/div[(@class="itemPriceBox" and @data-item="' . $c . '")]//p[@class="itemNormalPrice display-6"]/span')[0]->nodeValue;

    if (is_null($price) || empty($price)) {
      @$price = $xpath->query('//*/div[(@class="itemPriceBox" and @data-item="' . $c . '")]//div[@class="itemBTI display-6"]/span')[0]->nodeValue;
    }

    switch ($country) {
      case "EE":
        @$url_product = "https://www.ikea.ee" . $xpath->query('//*/div[(@class="card-header")]/a/@href')[0]->nodeValue;
        break;
      case "LT":
        @$url_product = "https://www.ikea.lt" . $xpath->query('//*/div[(@class="card-header")]/a/@href')[0]->nodeValue;
        break;
      case "LV":
        @$url_product = "https://www.ikea.lv" . $xpath->query('//*/div[(@class="card-header")]/a/@href')[0]->nodeValue;
        break;
      default:
        $url_product = null;
    }

    if (is_null($price) || empty($price)) {
      $url_product = null;
    }

    $price = floatval(trim(str_replace(' ', '', str_replace(',', '.', str_replace(array('€'), '', $price)))));

    $json_values = array(
      'code' => $code,
      'url' => $url_product,
      'tag' => null,
      'salesPrice' => $price,
      'country' => $country,
    );

    return $json_values;
  }

  public function parseJson_IS($code, $body, $country)
  {
    //echo "country: " . $country . ", code: " . $code . "<br>";

    $dochtml = new DOMDocument();
    @$dochtml->loadHTML($body);


    @$xpath = new DOMXpath($dochtml);
    $price = null;
    $c = ltrim($code, "0");
    $json_values = array();

    @$price = $xpath->query('//*/div[(@class="itemPriceBox")]//p[@class="itemNormalPrice revamp_price price"]/span/span')->item(0)->nodeValue;

    if (is_null($price) || empty($price)) {
      @$price = $xpath->query('//*/div[(@class="itemPriceBox")]//p[@class="itemBTI display-6 revamp_price price"]/span/span')->item(0)->nodeValue;
    }

    @$url_product = "https://www.ikea.is" . $xpath->query('/html/head/meta[(@property="og:url")]/@content')[0]->nodeValue;

    //echo "url_product: " . $url_product . "<br>";

    if (is_null($price) || empty($price)) {
      $url_product = null;
    }

    $price = floatval(trim(str_replace(' ', '', str_replace(',', '.', str_replace('.', '', str_replace(array('€'), '', $price))))));

    $json_values = array(
      'code' => $code,
      'url' => $url_product,
      'tag' => null,
      'salesPrice' => $price,
      'country' => $country,
    );

    return $json_values;
  }
}
  // { "country": "AT", "code": "50161321", "url": "https://www.ikea.com/at/de/p/hol-aufbewahrungstisch-akazie-50161321/", "name": "HOL", "typeName": "Aufbewahrungstisch", "mainImageUrl": "https://www.ikea.com/at/de/images/products/hol-aufbewahrungstisch-akazie__0104310_pe251255_s5.jpg", "itemNoGlobal": "50161321", "salesPrice": "80.99", "tag": "FAMILY_PRICE", "last_mod": "2023-12-03 16:44:24" },
