<?php
/**
 * Hyvä Themes - https://hyva.io
 * Copyright © Hyvä Themes. All rights reserved.
 * See COPYING.txt for license details.
 */

declare(strict_types=1);

use Hyva\Theme\Model\ViewModelRegistry;
use Hyva\Theme\ViewModel\LucideIcons;
use Hyva\Theme\ViewModel\Cart\Items as CartItems;
use Hyva\Theme\ViewModel\ProductList;
use Hyva\Theme\ViewModel\ProductListItem;
use Hyva\Theme\ViewModel\Store;
use Magento\Catalog\Block\Product\ReviewRendererInterface as ProductReviewRenderer;
use Magento\Catalog\Model\Product\Visibility as ProductVisibility;
use Magento\Framework\Escaper;
use Magento\Framework\View\Element\Template;

/** @var Template $block */
/** @var Escaper $escaper */
/** @var ViewModelRegistry $viewModels */

/** @var LucideIcons $lucideIcons */
$lucideIcons = $viewModels->require(LucideIcons::class);

/** @var ProductList $productListViewModel */
$productListViewModel = $viewModels->require(ProductList::class);

/** @var ProductListItem $productListItemViewModel */
$productListItemViewModel = $viewModels->require(ProductListItem::class);

/** @var Store $storeViewModel */
$storeViewModel = $viewModels->require(Store::class);

$sliderName = $block->getSliderName() ?: str_replace(['.', '/', '\\'], '_', $block->getNameInLayout());
$title = $block->getTitle() ?: '';
$headingTag = $block->getHeadingTag() ?: 'h3';
$cssClasses = $block->getCssClasses() ?: 'product-slider my-8';
$headingCssClasses = $block->getHeadingCssClasses() ?: 'text-2xl font-medium';
$columnCount = $block->getColumnCount() ?? 4;
$sliderClasses = implode(' ', array_filter([
    'snap-track',
    $columnCount > 1 ? 'md:[--snap-cols:2]' : '',
    $columnCount > 2 ? 'lg:[--snap-cols:3]' : '',
    $columnCount > 3 ? 'xl:[--snap-cols:4]' : '',
    $columnCount > 4 ? '2xl:[--snap-cols:5]' : '',
    $block->getSliderCssClasses()
]));

$showHeading = $block->getShowHeading() ?? true;
$showPager = $block->getShowPager() ?? true;
$hideDetails = $block->getHideDetails() ?? false;
$hideRatingSummary = $block->getHideRatingSummary() ?? false;

// Filter Options
$pageSize = $block->getPageSize() ?: 8;
$skusFilter = $block->getProductSkus() ? explode(',', $block->getProductSkus()) : [];
$additionalFilters = $block->getAdditionalFilters() ?: [];

$sortAttribute = $block->getSortAttribute() ?: '';
$sortDirection = $block->getSortDirection() ?: 'ASC';

$type = $block->getType();
// In case $type is not set on the block, it will default the block class name, which is not what we need in this template.
$type = is_string($type) && strpos($type, '\\') === false  ? $type : 'generic';

if ($hideRatingSummary) {
    $productListViewModel->excludeReviewSummary();
}

if ($categoryIds = $block->getCategoryIds()) {
    $productListViewModel->addFilter('category_id', $categoryIds, 'in');
}

if ($isAnchorCategory = $block->getIncludeChildCategoryProducts()) {
    // Only has an effect if a single category ID filter is set, and that category is an anchor category
    $productListViewModel->includeChildCategoryProducts();
}

if ($priceFrom = $block->getPriceFrom()) {
    $productListViewModel->addFilter('price', $priceFrom, 'gteq');
}

if ($priceTo = $block->getPriceTo()) {
    $productListViewModel->addFilter('price', $priceTo, 'lteq');
}

if ($skusFilter) {
    $productListViewModel->addFilter('sku', array_map('trim', $skusFilter), 'in');
}

if (is_string($additionalFilters)) {
    $additionalFilters = json_decode($additionalFilters, true);
}

if (is_array($additionalFilters)) {
    foreach ($additionalFilters as $filter) {
        $productListViewModel->addFilter($filter['field'], $filter['value'], $filter['conditionType'] ?? 'eq');
    }
}

$productListViewModel->setPageSize($pageSize);
$productListViewModel->addFilter('website_id', $storeViewModel->getWebsiteId());
$productListViewModel->addFilter('visibility', [ProductVisibility::VISIBILITY_IN_CATALOG, ProductVisibility::VISIBILITY_BOTH, ], 'in');

if ($sortAttribute) {
    $sortDirection === 'ASC'
        ? $productListViewModel->addAscendingSortOrder($sortAttribute)
        : $productListViewModel->addDescendingSortOrder($sortAttribute);
}

if (in_array($type, ['related', 'upsell', 'crosssell'], true)) {
    $items = $type === 'crosssell'
        ? $productListViewModel->getCrosssellItems(...$viewModels->require(CartItems::class)->getCartItems())
        : $productListViewModel->getLinkedItems($type, $block->getProduct());
} else {
    $items = $productListViewModel->getItems();
}

if (!$items) {
    return '';
}

$itemRenderer = $block->getLayout()->getBlock('product_list_item')
    ?: $block->getChildBlock('slider.item.template')
    ?: $block->getLayout()->createBlock(Template::class);

$itemRenderer->setData('hide_details', $hideDetails);
?>

<section
    id="<?= $escaper->escapeHtmlAttr($sliderName) ?>"
    class="snap-slider <?= $escaper->escapeHtmlAttr($cssClasses) ?>"
    aria-label="<?= $escaper->escapeHtmlAttr($title); ?>"
    data-slider-type="<?= $escaper->escapeHtmlAttr($type) ?>"
    x-data
    x-snap-slider.group-pager
    x-defer="intersect"
>
    <a
        href="#<?= $escaper->escapeHtmlAttr($sliderName) ?>-slider-end"
        class="sr-only focus:not-sr-only focus:absolute focus:z-30 focus:bg-white"
    ><?= $escaper->escapeHtml(__('Press to skip carousel')) ?></a>

    <div class="flex gap-2 justify-between items-center">
        <?php if ($showHeading): ?>
            <?= $escaper->escapeHtml(str_replace(
                ['%1', '%2', '%3'],
                [$headingTag, $title, $headingCssClasses],
                '<%1 class="%3">%2</%1>'
            ), ['h1', 'h2', 'h3', 'h4', 'h5', 'h6']) ?>
        <?php endif; ?>
        <div class="flex gap-2">
            <button
                class="btn btn-secondary p-2 invisible"
                aria-label="Previous Slide"
                data-prev
                disabled
            ><?= $lucideIcons->arrowLeftHtml('rtl:-rotate-180', 18, 18, ['aria-hidden' => 'true']); ?></button>
            <button
                class="btn btn-secondary p-2 invisible"
                aria-label="Next Slide"
                data-next
                disabled
            ><?= $lucideIcons->arrowRightHtml('rtl:-rotate-180', 18, 18, ['aria-hidden' => 'true']); ?></button>
        </div>
    </div>

    <div class="<?= $escaper->escapeHtmlAttr($sliderClasses) ?>" data-track tabindex="0" aria-live="polite">
        <?php foreach ($items as $product): ?>
            <div
                id="<?= $escaper->escapeHtmlAttr($sliderName . '-' . $product->getId()) ?>"
                class="flex flex-col"
                role="tabpanel"
            >
                <?= /** @noEscape */ $productListItemViewModel->getItemHtmlWithRenderer(
                    $itemRenderer,
                    $product,
                    $block,
                    'grid',
                    ProductReviewRenderer::SHORT_VIEW,
                    'category_page_grid',
                    false
                ) ?>
            </div>
        <?php endforeach; ?>
    </div>

    <?php if ($showPager): ?>
        <div class="snap-pager" data-pager>
            <?php foreach ($items as $product): ?>
                <a
                    href="#<?= $escaper->escapeHtmlAttr($sliderName . '-' . $product->getId()) ?>"
                    class="snap-marker"
                    role="tab"
                    x-cloak
                >
                    <span class="sr-only">
                        <?= $escaper->escapeHtmlAttr(__('View more about %1', $product->getName())) ?>
                    </span>
                </a>
            <?php endforeach; ?>
        </div>
    <?php endif; ?>

    <span id="<?= $escaper->escapeHtmlAttr($sliderName) ?>-slider-end" tabindex="-1"></span>
</section>
