<?php

declare(strict_types=1);

/*
 * This file is part of contao-weinanlieferung-bundle.
 *
 * (c) vonRotenberg
 *
 * @license commercial
 */

namespace vonRotenberg\WeinanlieferungBundle\Controller\Backend;

use Contao\Config;
use Contao\CoreBundle\Controller\AbstractController;
use Contao\CoreBundle\Csrf\ContaoCsrfTokenManager;
use Contao\Date;
use Contao\Environment;
use Contao\FrontendUser;
use Contao\Image;
use Contao\Input;
use Contao\SelectMenu;
use Contao\StringUtil;
use Contao\System;
use Contao\TextField;
use Contao\Widget;
use Doctrine\DBAL\Connection;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Twig\Environment as TwigEnvironment;
use vonRotenberg\WeinanlieferungBundle\Model\WeinanlieferungLeseartModel;
use vonRotenberg\WeinanlieferungBundle\Model\WeinanlieferungRebsorteModel;
use vonRotenberg\WeinanlieferungBundle\Model\WeinanlieferungReservationModel;
use vonRotenberg\WeinanlieferungBundle\Model\WeinanlieferungSlotsModel;

/**
 * @Route("%contao.backend.route_prefix%/weinanlieferung/slotassistant", name=self::class, defaults={"_scope" = "backend"})
 */
class WeinanlieferungSlotAssistantController extends AbstractController
{
    private $twig;
    private $tokenManager;
    private $request;
    private $db;

    protected $fields;

    public function __construct(TwigEnvironment $twig, ContaoCsrfTokenManager $tokenManager, RequestStack $requestStack, Connection $db)
    {
        $this->twig = $twig;
        $this->tokenManager = $tokenManager;
        $this->request = $requestStack->getCurrentRequest();
        $this->db = $db;

        $container = System::getContainer();
        $objSession = $container->get('session');


        $strKey = Input::get('popup') ? 'popupReferer' : 'referer';
        $strRefererId = $this->request->attributes->get('_contao_referer_id');

        $session = $objSession->get($strKey);
        $session[$strRefererId]['current'] = substr(Environment::get('requestUri'), \strlen(Environment::get('path')) + 1);
        $objSession->set($strKey, $session);
    }

    public function __invoke(): Response
    {
        $GLOBALS['TL_CSS']['cirrus'] = 'bundles/vonrotenbergweinanlieferung/css/backend.css|static';
        $arrData = [
            'request_token' => $this->tokenManager->getDefaultTokenValue(),
            'ref'           => $this->request->attributes->get('_contao_referer_id')
        ];
        System::loadLanguageFile('default');

//        dump($this->getWidgets());

        $arrData['fields'] = $this->getWidgets();

        return new Response(
            $this->twig->render(
                '@Contao_VonrotenbergWeinanlieferungBundle/be_wa_slotassistant.html.twig',
                $arrData
            )
        );
    }

    protected function getWidgets()
    {
        if (!empty($this->fields))
        {
            return $this->fields;
        }

        $arrWidgets = [
            'base_legend' => [
                [
                    'class'  => 'w50',
                    'help'   => 'Legen Sie hier den Zeitslot-Typ/Annahmestelle fest.',
                    'widget' => new SelectMenu([
                        'name'      => 'slotType',
                        'mandatory' => true,
                        'options'   => [
                            ['value' => 'eins', 'label' => 'eins'],
                            ['value' => 'zwei', 'label' => 'zwei']
                        ],
                        'label'     => 'Zeitslot-Typ'
                    ])
                ],
                [
                    'class'  => 'w50',
                    'help'   => 'Die Pufferzeit zwischen den Slots.',
                    'widget' => new TextField([
                        'name'      => 'buffer',
                        'mandatory' => true,
                        'label'     => 'Pufferzeit in min.',
                        'rgxp'      => 'natural'
                    ])
                ]
            ],
            'time_legend' => [
                [
                    'class'  => 'w50 wizard',
                    'help'   => 'Zeitslot-Typ/Annahmestelle fest.',
                    'widget' => new TextField([
                        'name'       => 'date_start[1]',
                        'mandatory'  => true,
                        'label'      => 'Pufferzeit in min.',
                        'rgxp'       => 'datim',
                        'datepicker' => true,
                    ])
                ]
            ]
        ];


        foreach ($arrWidgets as $group => $fields)
        {
            foreach ($fields as $field)
            {
                if (empty($field['widget']->id))
                {
                    $field['widget']->id = $field['widget']->name;
                }

                $wizard = '';

                // Date picker
                if ($field['widget']->datepicker ?? null)
                {
                    $rgxp = $field['widget']->rgxp ?? 'date';
                    $format = Date::formatToJs(Config::get($rgxp . 'Format'));

                    switch ($rgxp)
                    {
                        case 'datim':
                            $time = ",\n        timePicker: true";
                            break;

                        case 'time':
                            $time = ",\n        pickOnly: \"time\"";
                            break;

                        default:
                            $time = '';
                            break;
                    }

                    $strOnSelect = '';

                    // Trigger the auto-submit function (see #8603)
                    if ($field['widget']->submitOnChange ?? null)
                    {
                        $strOnSelect = ",\n        onSelect: function() { Backend.autoSubmit(\"wa_slotassistant\"); }";
                    }

                    $wizard .= ' ' . Image::getHtml('assets/datepicker/images/icon.svg', '', 'title="' . StringUtil::specialchars($GLOBALS['TL_LANG']['MSC']['datepicker']) . '" id="toggle_' . $field['widget']->id . '" style="cursor:pointer"') . '
  <script>
    window.addEvent("domready", function() {
      new Picker.Date($("ctrl_' . $field['widget']->id . '"), {
        draggable: false,
        toggle: $("toggle_' . $field['widget']->id . '"),
        format: "' . $format . '",
        positionOffset: {x:-211,y:-209}' . $time . ',
        pickerClass: "datepicker_bootstrap",
        useFadeInOut: !Browser.ie' . $strOnSelect . ',
        startDay: ' . $GLOBALS['TL_LANG']['MSC']['weekOffset'] . ',
        titleFormat: "' . $GLOBALS['TL_LANG']['MSC']['titleFormat'] . '"
      });
    });
  </script>';
                    $field['widget']->wizard = $wizard;
                }

                if (Input::post('FORM_SUBMIT') == 'wa_slotassistant')
                {
                    dump($field['widget']->validate());
                }
            }
        }

        $this->fields = $arrWidgets;
        return $this->fields;
    }
}