<?php

namespace common\modules\triggers\controllers;

use common\components\BaseController;
use common\modules\triggers\components\conditions\Conditions;
use common\modules\triggers\models\TriggerSchedule;
use common\modules\triggers\models\TriggerTrigger;
use \DateTime;
use yii\helpers\Json;

/**
 * Default controller for the `triggers` module
 */
class DefaultController extends BaseController
{
    public static function actionsTitles(){
        return [
            'Index' => 'Главная страница модуля',
            'Rechecktriggers' => 'Запуск проверки срабатывания триггеров',
            'Dropschedule' => 'Drop schedule By id'
        ];
    }

    public function actionDropschedule($id){
        TriggerSchedule::findOne($id)->delete();
    }

    /**
     * Renders the index view for the module
     * @return string
     */
    public function actionIndex()
    {
        return $this->render('index');
    }

    /**
     * Метод для крона и ручного вызова. Проверяет таблицу с расписанием, выполняет сработавшие триггеры.
     */
    public function actionRechecktriggers(){
        /** @var TriggerTrigger[] $actualTriggers */
        // Получили текущую дату и время
        $timeNow = new DateTime();
        // Получили все те сообщения которые еще не обработаны и имеют дату равную или меньше текущей
        $uncheckedArray = TriggerSchedule::find()->where('checked=:checked AND time <= :time_now', [':checked' => 0, ':time_now' => $timeNow->format('Y-m-d H:i:s')])->all();
        // Получили все актуальные триггеры в базе
        $actualTriggers = TriggerTrigger::getActualTriggers();
        // Перебираем эти сообщения в цикле
        foreach($uncheckedArray as $message) {
            $triggerIsUsed = false;
            // Проверяем каждое сообщение на срабатывание триггера
            foreach($actualTriggers as $trigger) {
                // Вызвали срабатывание условий
                $triggerResult = Conditions::init()->handleMessageByTriggerId($message, $trigger->getPrimaryKey());
                // Если триггер сработал инициируем действие
                if ($triggerResult===true) {
                    $trigger->initAction();
                    $triggerIsUsed=true;
                }
            }
            if ($triggerIsUsed===true) {
                /** @var TriggerSchedule $model */
                $model=TriggerSchedule::findOne($message->getPrimaryKey());
                $model->checked=1;
                $model->save();
            }
        }
    }
}
