<?php

/**
 * This file contains QUI\ERP\Order\Controls\Basket\Basket
 */

namespace QUI\ERP\Order\Controls\Basket;

use QUI;
use QUI\ERP\Order\Basket\Basket as BasketClass;
use QUI\ERP\Order\Basket\BasketGuest;
use QUI\ERP\Order\Basket\BasketOrder;

use function dirname;
use function is_array;

/**
 * Class Basket
 * - The main Basket control - display a basket
 *
 * @package QUI\ERP\Order\Controls\Basket
 */
class Basket extends QUI\Control
{
    /**
     * Used basket
     *
     * @var BasketClass|BasketGuest|BasketOrder
     */
    protected BasketClass|BasketGuest|BasketOrder $Basket;

    /**
     * @var QUI\Projects\Project|null
     */
    protected ?QUI\Projects\Project $Project = null;

    /**
     * Basket constructor.
     *
     * @param array $attributes
     */
    public function __construct(array $attributes = [])
    {
        $this->setAttributes([
            'buttons' => true,
            'isLoading' => false,
            'editable' => true
        ]);

        parent::__construct($attributes);

        $this->addCSSFile(dirname(__FILE__) . '/Basket.css');

        $this->setAttributes([
            'data-qui' => 'package/quiqqer/order/bin/frontend/controls/basket/Basket'
        ]);
    }

    /**
     * @param BasketClass|BasketGuest|BasketOrder $Basket
     */
    public function setBasket(BasketClass|BasketGuest|BasketOrder $Basket): void
    {
        $this->Basket = $Basket;
    }

    /**
     * @return string
     * @throws QUI\Exception
     */
    public function getBody(): string
    {
        $ProductsLocale = QUI\ERP\Products\Handler\Products::getLocale();
        QUI\ERP\Products\Handler\Products::setLocale(QUI::getLocale());

        $Engine = QUI::getTemplateManager()->getEngine();
        $Products = $this->Basket->getProducts();

        $Products->setCurrency(QUI\ERP\Defaults::getUserCurrency());
        $Products->setUser(QUI::getUserBySession());
        $Products->recalculate();

        $View = $Products->getView(QUI::getLocale());
        $showArticleNumber = QUI\ERP\Order\Settings::getInstance()->get('orderProcess', 'showArticleNumberInBasket');

        QUI\ERP\Products\Handler\Products::setLocale($ProductsLocale);

        $Engine->assign([
            'data' => $View->toArray(),
            'Basket' => $this->Basket,
            'Project' => $this->Project,
            'Products' => $View,
            'products' => $View->getProducts(),
            'this' => $this,
            'showArticleNumber' => $showArticleNumber,
            'Utils' => new QUI\ERP\Order\Utils\Utils()
        ]);

        return $Engine->fetch(dirname(__FILE__) . '/Basket.html');
    }

    /**
     * @param $fieldValueText
     * @return mixed|string
     */
    public function getValueText($fieldValueText): mixed
    {
        $current = QUI::getLocale()->getCurrent();

        if (!is_array($fieldValueText)) {
            return $fieldValueText;
        }

        if (isset($fieldValueText[$current])) {
            return $fieldValueText[$current];
        }

        return '';
    }

    /**
     * @return bool
     */
    public function isGuest(): bool
    {
        return QUI::getUsers()->isNobodyUser(QUI::getUserBySession());
    }

    /**
     * @return bool
     */
    public function isLoading(): bool
    {
        return $this->getAttribute('isLoading');
    }

    //region project

    /**
     * Set the used project
     *
     * @param QUI\Projects\Project $Project
     */
    public function setProject(QUI\Projects\Project $Project): void
    {
        $this->Project = $Project;
    }

    /**
     * @return QUI\Projects\Project
     *
     * @throws QUI\Exception
     */
    protected function getProject(): QUI\Projects\Project
    {
        if ($this->Project === null) {
            $this->Project = QUI::getProjectManager()->get();
        }

        return $this->Project;
    }

    //endregion
}