<?php

namespace Internetgalerie\IgDatapoolFe\ViewHelpers\Form;

use InvalidArgumentException;
use DateTime;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Extbase\Configuration\ConfigurationManagerInterface;

class DateViewHelper extends AbstractDatetimeViewHelper
{

    static $settings = null;
    public function initSettings() {
        if (static::$settings === null) {
            $all = $this->configurationManager->getConfiguration(
                ConfigurationManagerInterface::CONFIGURATION_TYPE_FULL_TYPOSCRIPT
            );
            //tx_igdatapoolfe.
            static::$settings = $all['plugin.']['ig_datapool_fe.']['settings.'];
        }
        return static::$settings;
    }

    
    public function initializeArguments(): void
    {
        parent::initializeArguments();

        $this->registerArgument('plugin', 'string', 'Minimum Datum', false);

        // default (browser)
        //$this->overrideArgument('class', 'string', 'class', false, 'dp-date dp-input-date');
        $this->registerTagAttribute('min', 'string', 'Minimum Datum', false);
        $this->registerTagAttribute('max', 'string', 'Maximum Datum', false);

        // pickadate
        $this->registerArgument('minDate', 'string', 'Minimum Datum', false);
        $this->registerArgument('maxDate', 'string', 'Maximum Datum', false);
        $this->registerArgument('dateFormat', 'string', 'Format for output', false, 'dd.mm.yyyy');
        $this->registerArgument('formatSubmit', 'string', 'Format Submit', false, 'yyyy-mm-dd');
        $this->registerArgument('typeConverterDateFormat', 'string', 'date format for DateTimeConverter (field dateFormat)', false);
        $this->registerArgument('hiddenName', 'bool', 'hiddenName', false, true);
        $this->registerArgument('selectYears', 'int', 'Jahrespulldown darstellen', false, false);
        $this->registerArgument('selectMonths', 'bool', 'Monatspulldown darstellen', false, false);
        $this->registerArgument('datepickerOptions', 'string', 'Format', false, '');
        //$this->registerArgument('language', 'string', 'Sprache für JS translations File', false);// geht nur letzte auf Seite
        $this->overrideArgument('placeholder', 'string', 'Label', false, 'dd.mm.yyyy');
        $this->registerArgument('submitOnChange', 'boolean', '', false);
        $this->registerArgument('showToday', 'bool', 'Show today button', false, true);
        $this->registerArgument('showClear', 'bool', 'Show clear button', false, true);
        $this->registerArgument('showClose', 'bool', 'Show close button', false, true);
        /*
          $settings = $this->initSettings();
          if ($settings['pickadate.']['enable'] ?? false) {
            $this->overrideArgument('class', 'string', 'Label', false, 'dp-date dp-pickadate');
          } else {
            $this->overrideArgument('type', 'string', 'The field type, e.g. "text", "email", "url" etc.', false, 'date');
          }
        */
    }

    public function render(): string
    {
        $settings = $this->initSettings();
        $pickadateEnable = $settings['pickadate.']['enable'] ?? false;
        $plugin = $this->arguments['plugin'] ?? '';

        if ($pickadateEnable && ($plugin == '' || $plugin == 'pickadate')) {
            return $this->renderPickadate();
        }

        if (!$this->hasArgument('class')) {
            $this->arguments['class'] = 'dp-date dp-input-date';
            $this->tag->addAttribute('class', $this->arguments['class']);
        }
        $this->arguments['type'] = 'date';
        return parent::render();
    }

    public function renderPickadate(): string
    {

        $options = [];
        $options['format']= strtolower((string) $this->arguments['dateFormat']);
        $options['formatSubmit'] =  $this->arguments['formatSubmit'];
        $options['hiddenName'] = ($this->arguments['hiddenName'] ? true : false);

        if (!$this->hasArgument('class')) {
            $this->arguments['class'] = 'dp-date dp-pickadate';
            $this->tag->addAttribute('class', $this->arguments['class']);
        }

        if ($this->arguments['selectYears']) {
            if ((int)$this->arguments['selectYears'] >1) {
                $options['selectYears'] =(int)$this->arguments['selectYears'];
            } else {
                $options['selectYears'] = $this->arguments['selectYears'] ? true : false;
            }
        }
        if ($this->arguments['selectMonths']) {
            $options['selectMonths'] = true;
        }
        if ($this->arguments['minDate']) {
            $date = explode('-', (string) $this->arguments['minDate']);
            if (count($date) == 3) {
                $options['min'] = [ intval($date[0]) , intval($date[1]-1) , intval($date[2]) ];
            } else {
                throw new InvalidArgumentException('format error of parameter minDate value is "' .$this->arguments['minDate'] . '" should be "YYYY-mm-dd"', 1696930920);
            }
        }
        if ($this->arguments['maxDate']) {
            $date = explode('-', (string) $this->arguments['maxDate']);
            if (count($date) == 3) {
                $options['max'] = [ intval($date[0]) , intval($date[1]-1) , intval($date[2]) ];
            } else {
                throw new InvalidArgumentException('format error of parameter maxDate value is "' .$this->arguments['maxDate'] . '" should be "YYYY-mm-dd"', 1696930921);
            }
        }
        $submitOnChange = $this->arguments['submitOnChange'] ?? '';
        $showToday = $this->arguments['showToday'];
        $showClear = $this->arguments['showClear'];
        $showClose = $this->arguments['showClose'];
        //	"formatSubmit" : "dd.mm.yyyy",
        if (!$showToday) {
            $options['today'] = null;
        }
        if (!$showClear) {
            $options['clear'] = null;
        }
        if (!$showClose) {
            $options['close'] = null;
        }

        if ($this->arguments['datepickerOptions']) {
            if (is_array($this->arguments['datepickerOptions'])) {
                $options = array_merge($options, $this->arguments['datepickerOptions']);
            } else {
                // support older string format
                $datepickerOptions = json_decode('{' . str_replace('\'', '"', $this->arguments['datepickerOptions']) .'}', true);
                $options = array_merge($options, $datepickerOptions);
            }
        }

        //$options = '{' .  $datepickerOptions;
        //$options = rtrim(rtrim($options), ',') . '}';

        $value = $this->getValueAttribute();

        if ($this->isObjectAccessorMode()) {
            $value = $this->getPropertyValue();
        }

        //$value = $this->convertToPlainValue($value);
        // is property Value
        if ($value instanceof DateTime) {
            $typeConverterDateFormat = $this->getTypeConverterFormatSubmit();
            $value = $value->format($typeConverterDateFormat);
            //$value = $value->format('Y-m-d');
        }

        $this->tag->addAttribute('data-dateoptions', json_encode($options));
        $this->tag->addAttribute('data-value', $value);
        if ($submitOnChange) {
            $this->tag->addAttribute('data-submit', $submitOnChange);
        }

        $res = parent::render();
        $res .= $this->getInputDateFormat();
        return $res;

    }

}
