<?php
/**
 * @link      http://www.u-bo.com
 * @copyright 南京友博网络科技有限公司 
 * @license   http://www.u-bo.com/license/
 */

namespace home\behaviors;

use Yii;
use yii\base\Action;
use yii\base\ActionFilter;
use yii\web\ForbiddenHttpException;
use yii\base\InvalidConfigException;
use home\modules\task\models\Task;
use yii\web\NotFoundHttpException;

/**
 * 创建任务过滤器
 *
 * 主要是检测用户是否有建立一级任务的权限、建立子任务权限
 *
 * @author legendjw http://blog.u-bo.com
 * @since 0.1
 */
class CreateTaskFilter extends ActionFilter
{
    /**
     * @var bool|Closure 是否要执行过滤,如果由于一些特殊情况导致需要判断
     * 来决定是否要执行权限过滤，可以传递布尔值或匿名函数来动态控制
     */
    public $enableFilter = true;

    /**
     * @var array 要新增的任务数据
     */
    public $task;

    /**
     * 动作前置操作
     *
     * @param Action $action 要执行的动作
     */
    public function beforeAction($action)
    {
        //判断是否要执行过滤
        if ($this->enableFilter instanceof \Closure) {
            $this->enableFilter = call_user_func($this->enableFilter, Yii::$app->request);
        }
        if (!$this->enableFilter) {
            return true;
        }

        if (empty($this->task)) {
            throw new InvalidConfigException('创建一级任务过滤器参数缺失！');
        }

        //超级管理员直接通过
        if (Yii::$app->session->get('isSuperAdmin')) {
            return true;
        }

        //判断能否创建一级任务
        if (empty($this->task['parent_id'])) {
            //是否有建立一级任务权限
            if (!Yii::$app->user->can('task/task/create-first-task')) {
                throw new ForbiddenHttpException('没有权限建立一级任务！');
            }
        }
        else {
            $parentTask = Task::find()->where(['task_no' => $this->task['parent_id']])->one();
            if ($parentTask === null) {
                throw new NotFoundHttpException('父任务不存在！');
            }
            //检测是否有权限对所选任务建立子任务
            if (!Task::checkTaskAccess($parentTask, 'task/task/create-child')) {
                throw new ForbiddenHttpException('没有权限对所选父任务建立子任务！');
            }
        }

        return true;
    }

}
