<?php

namespace KupShop\AutomationConfiguratorBundle\Configurator\Orders\Conditions\Fields;

use KupShop\AutomationConfiguratorBundle\Configurator\Generic\Conditions\Groups\Time;
use KupShop\AutomationConfiguratorBundle\Configurator\Interfaces\Conditions\Fields\Field;
use KupShop\AutomationConfiguratorBundle\Configurator\Orders\OrdersContext;
use KupShop\AutomationConfiguratorBundle\Util\ExpressionContext;

class TimeRuleApply extends Field implements OrdersContext
{
    public function getConfig(): array
    {
        return [
            'label' => 'Denní hodina při aplikování pravidla',
            'type' => 'time',
            'function' => true,
            'tooltip' => 'Pravidlo je splněno, jen pokud aktuální čas při spuštění tohoto pravidla splňuje zadané rozmezí. Doporučené použití je pouze s častým "periodickým spouštěčem", případně spouštěčem "při vytvoření objednávky". Minimální rozmezí pro frekventovaný periodický spouštěč musí být alespoň 30 minut.',
            'testWarning' => 'Konfigurátor obsahuje podmínku na <b>čas</b> při spuštění autopilota, výsledek testu může být ovlivněn v závislosti na aktuálním čase.',
        ];
    }

    public function getName(): string
    {
        return 'time_rule_apply';
    }

    public function getGroupName(): ?string
    {
        return Time::NAME;
    }

    public function modifyPrefetchFastCondition($context, $jsonValue)
    {
        $value = $this->prefetchUtil->getTimeFormattedData($jsonValue);

        $valid = $this->isBetweenTime($value);

        if (!$valid) {
            $context->andWhere('0=1');
        }

        return $context;
    }

    public function getCompareValue(ExpressionContext $context, $args = null)
    {
        $parseTime = function ($time) {
            $exploded = explode(':', $time);

            return ['h' => $exploded[0], 'm' => $exploded[1]];
        };

        $value = [];
        if ($args[0] == 'between') {
            $value = ['operator' => 'between', 'values' => [0 => $parseTime($args[1][0]), 1 => $parseTime($args[1][1])]];
        } elseif ($args[0] == 'less' || $args[0] == 'greater') {
            $value = ['operator' => $args[0], 'value' => $parseTime($args[1])];
        }
        $valid = $this->isBetweenTime($value);

        return $valid;
    }

    protected function isBetweenTime($value)
    {
        date_default_timezone_set('Europe/Prague');
        $hour = date('H');
        $minute = date('i');

        $valid = false;

        if ($value['operator'] == 'between') {
            if ($hour >= $value['values'][0]['h'] && $hour <= $value['values'][1]['h']) {
                if (($hour != $value['values'][0]['h'] || $minute >= $value['values'][0]['m']) && ($hour != $value['values'][1]['h'] || $minute <= $value['values'][1]['m'])) {
                    $valid = true;
                }
            }
        } elseif ($value['operator'] == 'less') {
            if ($hour <= $value['value']['h']) {
                if ($hour != $value['value']['h'] || $minute <= $value['value']['m']) {
                    $valid = true;
                }
            }
        } elseif ($value['operator'] == 'greater') {
            if ($hour >= $value['value']['h']) {
                if ($hour != $value['value']['h'] || $minute >= $value['value']['m']) {
                    $valid = true;
                }
            }
        }
        if ($value['not'] ?? false) {
            $valid = !$valid;
        }

        return $valid;
    }
}
