<?php

namespace dominion\cron\models;

use Yii;

/**
 * This is the model class for table "mole_task".
 *
 * @property int $id
 * @property int $parentId
 * @property string $dateAdd
 * @property string $dateStart
 * @property string $dateEnd
 * @property string $module
 * @property string $controller
 * @property string $type
 * @property string $name
 * @property string $params
 * @property int $isReady
 * @property int $completed
 * @property int $priority
 * @property int $childsTotalCount
 * @property int $childsCompleted
 * @property string $status
 * @property string $project
 * @property int $period
 */
class MoleTask extends \yii\db\ActiveRecord
{

    /**
     * {@inheritdoc}
     */
    public static function tableName()
    {
        return 'mole_task';
    }

    /**
     * {@inheritdoc}
     */
    public function rules()
    {
        return [
            //[['parentId', 'isReady', 'childsTotalCount', 'childsCompleted', 'status'], 'required'],
            [['parentId', 'isReady', 'completed', 'priority', 'childsTotalCount', 'childsCompleted', 'period'], 'integer'],
            [['dateAdd', 'dateStart', 'dateEnd'], 'safe'],
            [['params'], 'string'],
            [['module', 'controller', 'type', 'name', 'status'], 'string', 'max' => 255],
            [['project'], 'string', 'max' => 50],
        ];
    }

    /**
     * {@inheritdoc}
     */
    public function attributeLabels()
    {
        return [
            'id' => Yii::t('mole', 'ID'),
            'parentId' => Yii::t('mole', 'Parent ID'),
            'dateAdd' => Yii::t('mole', 'Date Add'),
            'dateStart' => Yii::t('mole', 'Date Start'),
            'dateEnd' => Yii::t('mole', 'Date End'),
            'module' => Yii::t('mole', 'Module'),
            'controller' => Yii::t('mole', 'Controller'),
            'type' => Yii::t('mole', 'Type'),
            'name' => Yii::t('mole', 'Name'),
            'params' => Yii::t('mole', 'Params'),
            'isReady' => Yii::t('mole', 'Is Ready'),
            'completed' => Yii::t('mole', 'Completed'),
            'priority' => Yii::t('mole', 'Priority'),
            'childsTotalCount' => Yii::t('mole', 'Childs Total Count'),
            'childsCompleted' => Yii::t('mole', 'Childs Completed'),
            'status' => Yii::t('mole', 'Status'),
            'project' => Yii::t('mole', 'Project'),
            'period' => Yii::t('mole', 'Period'),
        ];
    }

    /**
     * Выбираем все строки с project
     */
    public function getAllTask($project = false)
    {
        return self::find()
                ->andWhere([
                    'project' => $project ?: Yii::$app->getModule('cron')->project,
                    'completed' => 0,
                ])
                ->andWhere(['IS', 'dateStart', NULL])
                ->andWhere(['IS', 'dateEnd', NULL])
                ->andWhere(['<=', 'dateAdd', date('Y-m-d H:i:s')])
                ->orderBy('priority DESC')
                ->all();
    }

    public function setCompleted()
    {
        $this->dateEnd = date('Y-m-d H:i:s');
        $this->completed = 1;
        if ($this->save() && $this->period > 0)
        {
            $model = new MoleTask;
            $model->attributes = $this->attributes;
            $model->isReady = 0;
            $model->completed = 0;
            $model->dateStart = null;
            $model->dateEnd = null;
            $model->dateAdd = date('Y-m-d H:i:s', (strtotime($this->dateAdd . " +$this->period seconds")));
            $model->save();
        }
    }

    /**
     * Добавление агента (обертка)
     * @param string $controller
     * @param string $name
     * @param array $params
     * @param int $priority
     * @param int $period
     * @param date $dateAdd
     * @param string $project
     * @return boolean
     */
    public static function add($controller, $name, $params = array(), $priority = 0, $period = 0, $dateAdd = false, $project = false)
    {
        $model = new MoleTask();
        $model->controller = $controller;
        $model->name = $name;
        $model->params = serialize($params);
        $model->priority = $priority;
        $model->period = $period;
        $model->dateAdd = $dateAdd ?: date('Y-m-d H:i:s');
        $model->project = $project ?: Yii::$app->getModule('cron')->project;
        $model->type = stripos($model->controller, '.') ? $model->controller : ($model->project . '.' . $model->controller); // для совместимости
        return $model->save();
    }

}