<?php

require_once __DIR__ . "/vendor/autoload.php";

use libs\Log;
use libs\HttpRequest;
use libs\SessionsManager;
use function libs\errorPage;
use function libs\formatPrice;
use function libs\initMysql;
use function libs\initOutput;
use function libs\pageBootstrap;
use function libs\parseGiftCard;
use function libs\parseInventory;
use function libs\templatePage;

$log = new Log(LOG_DIR);
$sessionManager = new SessionsManager();
$http = new HttpRequest();
if ($_SERVER["REQUEST_METHOD"] === "GET" && $_REQUEST && $sessionManager->sessionInit(__FILE__)) {
    $output = initOutput("item");
    $mysql = initMysql();
    try {
        pageBootstrap();
    } catch (JsonException $e) {

    }
    $sender64 = base64_encode($output["sender"]);
    $id = $_REQUEST["itemId"] ?? null;
    $userId = $_COOKIE["visitor_token"] ?? null;
    $itemType = $_REQUEST["itemType"] ?? "inventory";
    $hash = $_COOKIE["hash"] ?? null;
    if ($id && $userId && $hash) {
        try {
            if (!($member = $http->exec(THUNDER, HttpRequest::POST, (object) [
                "type" => "QueryMember"
            ])->parseHttpResponse()->parseBackendResponse())) {
                $member = null;
            }
            if ($item = $http->exec(THUNDER, HttpRequest::POST, (object) [
                "type" => $itemType === "inventory" ? "QueryItemInInventory" : "QueryGiftCard",
                "id" => $id
            ])->parseHttpResponse()->parseBackendResponse()) {
                $nonce = NONCE;
                $itemId64 = urlencode(base64_encode($item->id));
                $itemType64 = urlencode(base64_encode($itemType));
                http_response_code(200);
                $name = $item->name;
                $price = formatPrice($item->price);
                if ($item->visible) {
                    $itemStatus = "";
                    $exhaustedStatus = " hidden";
                    $availability = "https://schema.org/InStock";
                } else {
                    $itemStatus = " disabled";
                    $exhaustedStatus = "";
                    $availability = "https://schema.org/OutOfStock";
                }
                if ($itemType === "inventory") {
                    $item = parseInventory($item);
                    switch ($item->discountMode) {
                        case "AMOUNT":
                            $discountedPrice = $item->price - $item->discountValue;
                            $discountedPriceFormatted = formatPrice($discountedPrice);
                            $priceHtml = "<div class='price_direction$itemStatus'><p class='price strikethrough'>$price</p><p class='price'>$discountedPriceFormatted</p></div>";
                            break;
                        case "PERCENT":
                            $discountedPrice = round($item->price * (1 - $item->discountValue / 100), 2);
                            $discountedPriceFormatted = formatPrice($discountedPrice);
                            $priceHtml = "<div class='price_direction$itemStatus'><p class='price strikethrough'>$price</p><p class='price'>$discountedPriceFormatted</p></div>";
                            break;
                        default:
                            $discountedPrice = $item->price;
                            $priceHtml = "<p class='price$itemStatus'>$price</p>";
                    }
                    $imageUrl = explode(";", $item->images);
                    $sku = "<p class='sku$itemStatus' id='sku'>$item->sku</p>";
                    $weight = $item->weight;
                    $thumbnail = "<img class='thumbnail' id='main_image' alt='Item main' src='$imageUrl[0]'$itemStatus>";
                    if ($member) {
                        $wishListSrc = "/images/wishlist.webp";
                        if ($http->exec(THUNDER, HttpRequest::POST, (object) [
                            "type" => "QueryWishList",
                            "itemId" => $id
                        ])->parseHttpResponse()->parseBackendResponse()) {
                            $wishListSrc = "/images/wishlist_selected.webp";
                        } else {
                            http_response_code(200);
                        }
                        $thumbnail = "<img class='thumbnail' id='main_image' alt='Item main' src='$imageUrl[0]'$itemStatus>
                <img class='wishlist_thumbnail' id='add_remove_wishlist' alt='Aggiungi alla/rimuovi dalla lista dei desideri' width='48' height='48' src='$wishListSrc'$exhaustedStatus>";
                    }
                    $imageUrl64 = urlencode(base64_encode($imageUrl[0]));
                    $price = $discountedPrice ?? $price;
                    $collections = explode(";", $item->collections);
                    $brand = SITE_TITLE;
                    foreach ($collections as $collection) {
                        $filterType = $mysql->query("SELECT filterType FROM collections WHERE name = '$collection'");
                        if (is_array($filterType) && !empty($filterType) && ($filterType[0]["filterType"] === "jewelCollection" || $filterType[0]["filterType"] === "watchCollection")) {
                            $brand = str_replace("'", "\\'", $collection);
                            break;
                        }
                    }
                    $description = str_replace('"', '\\"', $item->description);
                    $googleSnippet = '<script type="application/ld+json" nonce="$nonce">
                    {
                        "@context": "https://schema.org/",
                        "@type": "Product",
                        "sku": "' . $item->sku . '",
                        "image": "' . $imageUrl[0] . '",
                        "name": "' . $name . '",
                        "description": "' . $description . '",
                        "gtin": "' . $item->ean . '",
                        "brand": {
                            "@type": "Brand",
                            "name": "' . $brand . '"
                        },
                        "review": [],
                        "offers": {
                            "@type": "Offer",
                            "url": "' . $_SERVER["SCRIPT_URI"] . '",
                            "itemCondition": "https://schema.org/NewCondition",
                            "availability": "' . $availability . '",
                            "price": "' . $discountedPrice . '",
                            "priceCurrency": "EUR",
                            "priceValidUntil": "' . (new DateTime())->format("Y") . '-12-31",
                            "offerCount": "' . $item->quantity . '"
                        }
                    }
                </script>';
                    print templatePage("$name | ", "<div class='item_container'>
            <img class='exhausted' id='item_exhausted' src='/images/exhausted.webp' alt='Prodotto eaurito' width='1920' height='1080'$exhaustedStatus>
            <div class='thumbnail_container$itemStatus'>
                $thumbnail
            </div>
            <div class='minimal_floating popup_image_container' id='image_popup' hidden>
                <img class='popup_image' id='image_popup_image' alt='$name' height='500'>
                <button class='operation_button' id='image_popup_close'>Chiudi</button>
            </div>
            <p class='name$itemStatus'>$name</p>
            <p class='description$itemStatus'>$item->description</p>
            $priceHtml
            $sku
            <div id='item_operations'>
                <button class='operation_button' id='add_to_cart'$itemStatus>Aggiungi al carrello</button>
            </div>
        </div>", "
        <link rel='stylesheet' href='/css/item.css'>
        <script type='module' src='/js/item.min.js?itemId=$itemId64&&itemType=$itemType64&imageUrl=$imageUrl64' nonce='$nonce'></script>
        $googleSnippet", "shop");
                } elseif ($itemType === "gift_card") {
                    $item = parseGiftCard($item);
                    $priceHtml = "<p class='price$itemStatus'>$price</p>";
                    $imageUrl = $item->image;
                    $thumbnail = "<img class='thumbnail' id='main_image' alt='Item main' src='$imageUrl'>";
                    $imageUrl64 = urlencode(base64_encode($imageUrl));
                    $siteTitle = $_ENV[SITE_PREFIX . "SITE_TITLE"];
                    $description = str_replace('"', '\\"', $item->description);
                    $googleSnippet = '<script type="application/ld+json" nonce="$nonce">
                    {
                        "@context": "https://schema.org/",
                        "@type": "Product",
                        "sku": "GIFT_' . $name . '",
                        "image": "' . $imageUrl . '",
                        "name": "' . $name . '",
                        "description": "' . $description . '",
                        "brand": {
                            "@type": "Brand",
                            "name": "' . $siteTitle . '"
                        },
                        "review": [],
                        "offers": {
                            "@type": "Offer",
                            "url": "' . $_SERVER["SCRIPT_URI"] . '",
                            "itemCondition": "https://schema.org/NewCondition",
                            "availability": "' . $availability . '",
                            "price": "' . $price . '",
                            "priceCurrency": "EUR",
                            "priceValidUntil": "' . (new DateTime())->format("Y") . '-12-31",
                            "offerCount": 100
                        }
                    }
                </script>';
                    print templatePage($name, "<div class='item_container'>
            <div class='thumbnail_container'>
                $thumbnail
            </div>
            <div class='minimal_floating popup_image_container' id='image_popup' hidden>
                <img class='popup_image' id='image_popup_image' alt='$name' height='500'>
                <button class='operation_button' id='image_popup_close'>Chiudi</button>
            </div>
            <p class='name' id='name'>$name</p>
            <p class='description' id='description'>$item->description</p>
            <p class='price' id='itemPrice'>$price</p>
            <div id='item_operations'>
                <button class='operation_button' id='add_to_cart'>Aggiungi al carrello</button>
            </div>
        </div>", "
        <link rel='stylesheet' href='/css/item.css'>
        <script type='module' src='/js/item.min.js?itemId=$itemId64&&itemType=$itemType64&imageUrl=$imageUrl64' nonce='$nonce'></script>
        $googleSnippet", "gift");
                } else {
                    http_response_code(500);
                    $log->error((object) array_merge($output, [
                        "results" => ERROR,
                        "message" => "Failed to query item",
                        "query" => $itemType === "inventory" ? "QueryItemInInventory" : "QueryGiftCard",
                        "data" => $_REQUEST
                    ]));
                    print errorPage("Failed to query item");
                }
            } else {
                http_response_code(500);
                $log->error((object) array_merge($output, [
                    "results" => ERROR,
                    "message" => "Failed to query item",
                    "query" => $itemType === "inventory" ? "QueryItemInInventory" : "QueryGiftCard",
                    "data" => $_REQUEST
                ]));
                print errorPage("Failed to query item", "", $itemType === "inventory" ? "shop" : "gift");
            }
        } catch (JsonException $e) {
            http_response_code(500);
            $log->error((object) array_merge($output, [
                "results" => ERROR,
                "message" => "Failed: {$e->getMessage()}",
                "data" => $_REQUEST
            ]));
            print errorPage("Failed: {$e->getMessage()}", "", $itemType === "inventory" ? "shop" : "gift");
        }
    } else {
        http_response_code(400);
        $log->error((object) array_merge($output, [
            "results" => ERROR,
            "message" => "Missing parameters: itemId, itemType",
            "data" => $_REQUEST
        ]));
        print errorPage("Missing parameters: itemId, itemType", "", $itemType === "inventory" ? "shop" : "gift");
    }
    $mysql->close();
} else {
    http_response_code(500);
    print errorPage("Error");
}
$http->close();
