<?php

/**
 * This file contains QUI\TemplateCologne\Utils
 */

namespace QUI\TemplateCologne;

use QUI;
use QUI\ERP\Shipping\Shipping;

/**
 * Class Utils
 */
class Utils
{
    /**
     * Get user avatar. If no avatar available return false.
     *
     * @param $User QUI\Interfaces\Users\User
     * @return QUI\Projects\Media\Image|false
     * @throws QUI\Exception
     *
     */
    public static function getAvatar($User)
    {
        if (!$User instanceof QUI\Interfaces\Users\User) {
            throw new QUI\Exception([
                QUI::getLocale()->get(
                    'quiqqer/template-cologne',
                    'exception.user.required'
                )
            ]);
        }

        $result = QUI::getEvents()->fireEvent('userGetAvatar', [$User]);

        foreach ($result as $Entry) {
            if ($Entry instanceof QUI\Interfaces\Projects\Media\File) {
                return $Entry;
            }
        }

        $avatar = $User->getAttribute('avatar');

        if (!QUI\Projects\Media\Utils::isMediaUrl($avatar)) {
            return false;
        }

        try {
            return QUI\Projects\Media\Utils::getImageByUrl($avatar);
        } catch (QUI\Exception $Exception) {
        }

        return false;
    }

    /**
     * Returns config. If a cache exists, it will be returned.
     *
     * @param $params
     * @return array|bool|object|string
     * @throws QUI\Exception
     */
    public static function getConfig($params)
    {
        /** @var $Site \QUI\Projects\Site */
        $Site = $params['Site'];

        try {
            return QUI\Cache\Manager::get(
                'quiqqer/templateCologne/'.$Site->getId()
            );
        } catch (QUI\Exception $Exception) {
        }

        $config = [];

        /* @var $Project QUI\Projects\Project */
        $Project = $params['Project'];

        /**
         * no header?
         * no breadcrumb?
         * Body Class
         *
         * own site type
         */
        $header         = 'hide';
        $pageTitle      = 'breadcrumb'; // where to show page title: in header, in breadcrumb or both?
        $showBreadcrumb = false;
        $siteType       = 'no-sidebar';

        switch ($Site->getAttribute('layout')) {
            case 'layout/startPage':
                $header         = $Project->getConfig('templateCologne.settings.headerStartPage');
                $pageTitle      = $Project->getConfig('templateCologne.settings.pageTitleStartPage');
                $showBreadcrumb = $Project->getConfig('templateCologne.settings.showBreadcrumbStartPage');
                $siteType       = 'layout-start-page';
                break;

            case 'layout/noSidebar':
                $header         = $Project->getConfig('templateCologne.settings.headerNoSidebar');
                $pageTitle      = $Project->getConfig('templateCologne.settings.pageTitleNoSidebar');
                $showBreadcrumb = $Project->getConfig('templateCologne.settings.showBreadcrumbNoSidebar');
                $siteType       = 'layout-no-sidebar';
                break;

            case 'layout/noSidebarThin':
                $header         = $Project->getConfig('templateCologne.settings.headerNoSidebarThin');
                $pageTitle      = $Project->getConfig('templateCologne.settings.pageTitleNoSidebarThin');
                $showBreadcrumb = $Project->getConfig('templateCologne.settings.showBreadcrumbNoSidebarThin');
                $siteType       = 'layout-no-sidebar';
                break;

            case 'layout/rightSidebar':
                $header         = $Project->getConfig('templateCologne.settings.headerRightSidebar');
                $pageTitle      = $Project->getConfig('templateCologne.settings.pageTitleRightSidebar');
                $showBreadcrumb = $Project->getConfig('templateCologne.settings.showBreadcrumbRightSidebar');
                $siteType       = 'layout-right-sidebar';
                break;

            case 'layout/leftSidebar':
                $header         = $Project->getConfig('templateCologne.settings.headerLeftSidebar');
                $pageTitle      = $Project->getConfig('templateCologne.settings.pageTitleLeftSidebar');
                $showBreadcrumb = $Project->getConfig('templateCologne.settings.showBreadcrumbLeftSidebar');
                $siteType       = 'layout-left-sidebar';
                break;
        }

        if ($Site->getAttribute('type') === 'quiqqer/order:types/orderingProcess') {
            $showBreadcrumb = false;
        }

        /* site own show header */
        switch ($Site->getAttribute('templateCologne.header')) {
            case 'afterNav':
            case 'beforeContent':
            case 'hide':
                $header = $Site->getAttribute('templateCologne.header');
        }

        // basket style
        $basketStyle = 'full';

        if ($Project->getConfig('templateCologne.settings.basketStyle')) {
            $basketStyle = $Project->getConfig('templateCologne.settings.basketStyle');
        }

        // basket open
        $basketOpen = 2;

        switch ($Project->getConfig('templateCologne.settings.basketOpen')) {
            case '0':
            case '1':
            case '2':
                $basketOpen = $Project->getConfig('templateCologne.settings.basketOpen');
        }

        $settingsCSS = include 'settings.css.php';

        /**
         * Categories Menu
         */
        $showCategoryMenu = false;

        if ($Project->getConfig('templateCologne.settings.showCategoryMenu')) {
            $showCategoryMenu = $Project->getConfig('templateCologne.settings.showCategoryMenu');
        }

        if ($showCategoryMenu) {
            $CategoriesMenu = new QUI\TemplateCologne\Controls\Menu\Categories([
                'showDescFor' => $Project->getConfig('templateCologne.settings.showCategoryShortFor'),
                'startId'     => $Project->getConfig('templateCologne.settings.categoryStartId')
            ]);

            $config['CategoriesMenu'] = QUI\ControlUtils::parse($CategoriesMenu);
        }

        // predefined footer
        $config += self::getPredefinedFooter($Project);

        $config['header']           = $header;
        $config['pageTitle']        = $pageTitle;
        $config['showBreadcrumb']   = $showBreadcrumb;
        $config['settingsCSS']      = '<style>'.$settingsCSS.'</style>';
        $config['typeClass']        = 'type-'.str_replace(['/', ':'], '-', $Site->getAttribute('type'));
        $config['siteType']         = $siteType;
        $config['basketStyle']      = $basketStyle;
        $config['basketOpen']       = $basketOpen;
        $config['showCategoryMenu'] = $showCategoryMenu;

        // set cache
        QUI\Cache\Manager::set(
            'quiqqer/templateCologne/'.$Site->getId(),
            $config
        );

        return $config;
    }

    /**
     * Returns data for predefined footer if enabled.
     *
     * @param \QUI\Projects\Project $Project
     * @return array - data for predefined footer
     */
    private static function getPredefinedFooter($Project)
    {
        $lang = $Project->getLang();

        /** Predefined footer: short text */
        $shortText = false;

        if ($Project->getConfig('templateCologne.settings.predefinedFooter.shortText')) {
            $shortText = [];

            $titles = json_decode($Project->getConfig(
                'templateCologne.settings.predefinedFooter.shortText.title'
            ), true);

            $title = false;

            if (isset($titles[$lang])) {
                $title = $titles[$lang];
            }

            $shortText['title'] = $title;
        }

        /** Predefined footer: url list */
        $urlList = false;

        if ($Project->getConfig('templateCologne.settings.predefinedFooter.urlList')) {
            $urlList = [];

            $titles = json_decode($Project->getConfig(
                'templateCologne.settings.predefinedFooter.urlList.title'
            ), true);

            $title = false;

            if (isset($titles[$lang])) {
                $title = $titles[$lang];
            }

            $siteIds = $Project->getConfig('templateCologne.settings.predefinedFooter.urlList.sites');
            $sites   = [];

            if ($siteIds) {
                $sites = QUI\Projects\Site\Utils::getSitesByInputList($Project, $siteIds, [
                    'where' => [
                        'active' => 1
                    ],
                    'limit' => 10,
                    'order' => $Project->getConfig('templateCologne.settings.predefinedFooter.urlList.sites.order')
                ]);
            }

            $sitesData = [];

            foreach ($sites as $Site) {
                $sitesData[] = [
                    'title' => $Site->getAttribute('title'),
                    'url'   => $Site->getUrlRewritten()
                ];
            }

            $urlList['title']                     = $title;
            $urlList['sites']                     = $sitesData;
            $urlList['productSearch']             = false;
            $urlList['legalNotes']                = false;
            $urlList['privacyPolicy']             = false;
            $urlList['generalTermsAndConditions'] = false;

            if ($Project->getConfig('templateCologne.settings.predefinedFooter.urlList.showStandardSites')) {
                /** productSearch */
                $productSearch = $Project->getSites([
                    'where' => [
                        'type' => [
                            'type'  => 'IN',
                            'value' => 'quiqqer/products:types/search'
                        ]
                    ],
                    'limit' => 1
                ]);

                if (count($productSearch)) {
                    $urlList['productSearch'] = [
                        'title' => $productSearch[0]->getAttribute('title'),
                        'url'   => $productSearch[0]->getUrlRewritten()
                    ];
                }

                /** legal notes (Impressum) */
                $legalNotes = $Project->getSites([
                    'where' => [
                        'type' => [
                            'type'  => 'IN',
                            'value' => 'quiqqer/sitetypes:types/legalnotes'
                        ]
                    ],
                    'limit' => 1
                ]);

                if (count($legalNotes)) {
                    $urlList['legalNotes'] = [
                        'title' => $legalNotes[0]->getAttribute('title'),
                        'url'   => $legalNotes[0]->getUrlRewritten()
                    ];
                }

                /** privacy policy (Datenschutzerklärung) */
                $privacyPolicy = $Project->getSites([
                    'where' => [
                        'type' => [
                            'type'  => 'IN',
                            'value' => 'quiqqer/sitetypes:types/privacypolicy'
                        ]
                    ],
                    'limit' => 1
                ]);

                if (count($privacyPolicy)) {
                    $urlList['privacyPolicy'] = [
                        'title' => $privacyPolicy[0]->getAttribute('title'),
                        'url'   => $privacyPolicy[0]->getUrlRewritten()
                    ];
                }

                /** general terms and conditinos (AGB) */
                $generalTermsAndConditions = $Project->getSites([
                    'where' => [
                        'type' => [
                            'type'  => 'IN',
                            'value' => 'quiqqer/sitetypes:types/generalTermsAndConditions'
                        ]
                    ],
                    'limit' => 1
                ]);

                if (count($generalTermsAndConditions)) {
                    $urlList['generalTermsAndConditions'] = [
                        'title' => $generalTermsAndConditions[0]->getAttribute('title'),
                        'url'   => $generalTermsAndConditions[0]->getUrlRewritten()
                    ];
                }
            }
        }

        /** Featured products */
        $featuredProducts = false;

        if ($Project->getConfig('templateCologne.settings.predefinedFooter.featuredProducts')) {
            $FeaturedProduct = new QUI\ProductBricks\Controls\FeaturedProducts([
                'featured1.categoryId' => $Project->getConfig(
                    'templateCologne.settings.predefinedFooter.featuredProducts.category'
                )
            ]);

            $featuredProducts['controlParsed'] = QUI\ControlUtils::parse($FeaturedProduct);

            $titles = json_decode($Project->getConfig(
                'templateCologne.settings.predefinedFooter.featuredProducts.title'
            ), true);

            $title = false;

            if (isset($titles[$lang])) {
                $title = $titles[$lang];
            }

            $featuredProducts['title'] = $title;
        }

        /** Predefined footer: Payments Control */
        $paymentsData = false;

        if ($Project->getConfig('templateCologne.settings.predefinedFooter.payments')) {
            $PaymentsControl = new \QUI\TemplateCologne\Controls\Payments([
                'template' => $Project->getConfig('templateCologne.settings.predefinedFooter.payments.layout')
            ]);

            $paymentsData['controlParsed'] = QUI\ControlUtils::parse($PaymentsControl);

            $titles = json_decode($Project->getConfig(
                'templateCologne.settings.predefinedFooter.payments.title'
            ), true);

            $title = false;

            if (isset($titles[$lang])) {
                $title = $titles[$lang];
            }

            $paymentsData['title'] = $title;
        }

        return [
            'shortText'        => $shortText,
            'urlList'          => $urlList,
            'featuredProducts' => $featuredProducts,
            'paymentsData'     => $paymentsData
        ];
    }

    /**
     * Get FrontendView of ShippingTime field
     *
     * requires quiqqer/shipping to be installed
     *
     * @param int $productId
     * @return false|QUI\ERP\Products\Field\View
     */
    public static function getShippingTimeFrontendView(int $productId)
    {
        if (!QUI::getPackageManager()->isInstalled('quiqqer/shipping')) {
            return false;
        }

        try {
            $Product       = QUI\ERP\Products\Handler\Products::getProduct($productId);
            $ShippingField = $Product->getField(Shipping::PRODUCT_FIELD_SHIPPING_TIME);
        } catch (\Exception $Exception) {
            QUI\System\Log::writeException($Exception);
            return false;
        }

        return $ShippingField->getFrontendView();
    }
}