'yii\rest\Serializer',
        'collectionEnvelope' => 'projects',
    ];
    public function behaviors(): array
    {
        return ArrayHelper::merge(parent::behaviors(), [
            'verbs' => [
                'class' => \yii\filters\VerbFilter::class,
                'actions' => [
                    'get-project' => ['GET', 'OPTIONS'],
                    'project-list' => ['GET', 'OPTIONS'],
                    'status-list' => ['GET', 'OPTIONS'],
                    'project-task-category-list' => ['GET', 'OPTIONS'],
                    'create' => ['POST', 'OPTIONS'],
                    'update' => ['PUT', 'OPTIONS']
                ],
            ]
        ]);
    }
    /**
     *
     * @OA\Get(path="/project/get-project",
     *   summary="Получить данные проекта",
     *   description="Метод для получения проета
    Статусы:
    10 - Закрыт
    19 - Работает",
     *   security={
     *     {"bearerAuth": {}}
     *   },
     *   tags={"TaskManager"},
     *   @OA\Parameter(
     *      name="project_id",
     *      in="query",
     *      required=true,
     *      @OA\Schema(
     *        type="integer",
     *        default=null
     *      )
     *   ),
     *   @OA\Parameter(
     *      name="expand",
     *      in="query",
     *      required=false,
     *      description="В этом параметре по необходимости передаются поля, которые нужно добавить в ответ сервера, сейчас доступно только поле columns",
     *      @OA\Schema(
     *        type="string",
     *      )
     *   ),
     *   @OA\Response(
     *     response=200,
     *     description="Возвращает массив объектов проекта",
     *     @OA\MediaType(
     *         mediaType="application/json",
     *         @OA\Schema(ref="#/components/schemas/Project"),
     *     ),
     *   ),
     * )
     *
     * @param $project_id
     * @return array|Project|\yii\db\ActiveRecord|null
     */
    public function actionGetProject($project_id)
    {
        return  Project::find()->with('columns')->where(['id' => $project_id])->one();
    }
    /**
     *
     * @OA\Get(path="/project/project-list",
     *   summary="Список проектов",
     *   description="Метод для получения списка проетов, если не передан параметр user_id, то возвращаются проеты текущего пользователя.
     Статусы:
     10 - Закрыт
     19 - Работает",
     *   security={
     *     {"bearerAuth": {}}
     *   },
     *   tags={"TaskManager"},
     *   @OA\Parameter(
     *      name="user_id",
     *      in="query",
     *      required=false,
     *      @OA\Schema(
     *        type="integer",
     *        default=null
     *      )
     *   ),
     *   @OA\Parameter(
     *      name="expand",
     *      in="query",
     *      required=false,
     *      description="В этом параметре по необходимости передаются поля, которые нужно добавить в ответ сервера, сейчас доступно только поле columns",
     *      @OA\Schema(
     *        type="string",
     *      )
     *   ),
     *
     *   @OA\Response(
     *     response=200,
     *     description="Возвращает массив объектов проекта",
     *     @OA\MediaType(
     *         mediaType="application/json",
     *         @OA\Schema(ref="#/components/schemas/ProjectExample"),
     *     ),
     *   ),
     * )
     *
     * @param $user_id
     * @return ActiveDataProvider
     */
    public function actionProjectList($user_id = null): ActiveDataProvider
    {
        if (!$user_id){
            $user_id = Yii::$app->user->id;
        }
        if (!empty($user_id)) {
            $projectIdList = ProjectUser::find()->where(['user_id' => $user_id])->select('project_id')->column();
            $query = Project::find()->where([ 'IN', 'id', $projectIdList])->andWhere(['status' => Project::STATUS_OTHER])->orWhere(['owner_id' => $user_id]);
        } else {
            $query = Project::find();
        }
        return new ActiveDataProvider([
            'query' => $query,
        ]);
    }
    public function actionStatusList(): array
    {
        return Status::find()
            ->joinWith('useStatuses')
            ->where(['`use_status`.`use`' => UseStatus::USE_PROJECT])->all();
    }
    public function actionProjectTaskCategoryList($project_id): array
    {
        return ProjectTaskCategory::find()->where(['project_id' => $project_id])->all();
    }
    public function actionCreateProjectTaskCategory()
    {
        $projectTaskCategory = new ProjectTaskCategory();
        $projectTaskCategory->attributes =  \yii::$app->request->post();
        if($projectTaskCategory->validate()) {
            $projectTaskCategory->save(false);
            return $projectTaskCategory;
        }
        return $projectTaskCategory->errors;
    }
    public function actionUpdateProjectTaskCategory()
    {
        $projectTaskCategory = ProjectTaskCategory::find()
            ->where(['project_id' => Yii::$app->request->post('project_id')])
            ->andWhere(['title' => Yii::$app->request->post('title')])
            ->one();
        if(empty($projectTaskCategory)) {
            throw new NotFoundHttpException('The project not found');
        }
        $projectTaskCategory->title = Yii::$app->request->post('new_title');
        if (!$projectTaskCategory->update() && $projectTaskCategory->hasErrors()) {
            return $projectTaskCategory->errors;
        }
        return $projectTaskCategory;
    }
    /**
     *
     * @OA\Post(path="/project/create",
     *   summary="Добавить проект",
     *   description="Метод для создания проекта, если не передан параметр user_id, то будет получен текущий пользователь
    Статусы:
    10 - Закрыт
    19 - Работает",
     *   security={
     *     {"bearerAuth": {}}
     *   },
     *   tags={"TaskManager"},
     *
     *   @OA\RequestBody(
     *     @OA\MediaType(
     *       mediaType="multipart/form-data",
     *       @OA\Schema(
     *          required={"name", "status"},
     *          @OA\Property(
     *              property="name",
     *              type="string",
     *              description="Название проекта",
     *          ),
     *          @OA\Property(
     *              property="description",
     *              type="string",
     *              description="Описание проекта",
     *          ),
     *          @OA\Property(
     *              property="status",
     *              type="integer",
     *              description="статус",
     *          ),
     *          @OA\Property(
     *              property="company_id",
     *              type="integer",
     *              description="Компания к которой относится проект",
     *          ),
     *       ),
     *     ),
     *   ),
     *   @OA\Response(
     *     response=200,
     *     description="Возвращает объект Проекта",
     *     @OA\MediaType(
     *         mediaType="application/json",
     *         @OA\Schema(ref="#/components/schemas/Project"),
     *     ),
     *   ),
     * )
     *
     * @return array|Project
     * @throws BadRequestHttpException
     */
    public function actionCreate()
    {
        $project = new Project();
        $user_id = \Yii::$app->user->id;
        if (!$user_id) {
            throw new BadRequestHttpException(json_encode(['Пользователь не найден']));
        }
        $project->load(\yii::$app->request->post(), '');
        $project->owner_id = $user_id;
        if($project->validate()) {
            $project->save(false);
            return $project;
        }
        return $project->errors;
    }
    /**
     *
     * @OA\PUT(path="/project/update",
     *   summary="Редактировать проект",
     *   description="Метод для редактирования проекта
    Статусы:
    10 - Закрыт
    19 - Работает",
     *   security={
     *     {"bearerAuth": {}}
     *   },
     *   tags={"TaskManager"},
     *
     *   @OA\RequestBody(
     *     @OA\MediaType(
     *       mediaType="application/x-www-form-urlencoded",
     *       @OA\Schema(
     *          required={"project_id"},
     *          @OA\Property(
     *              property="project_id",
     *              type="integer",
     *              description="Идентификатор проекта",
     *          ),
     *          @OA\Property(
     *              property="name",
     *              type="string",
     *              description="Название проекта",
     *          ),
     *          @OA\Property(
     *              property="description",
     *              type="string",
     *              description="Описание проекта",
     *          ),
     *          @OA\Property(
     *              property="status",
     *              type="integer",
     *              description="статус",
     *          ),
     *          @OA\Property(
     *              property="company_id",
     *              type="integer",
     *              description="Компания к которой относится проект",
     *          ),
     *       ),
     *     ),
     *   ),
     *   @OA\Response(
     *     response=200,
     *     description="Возвращает объект Проекта",
     *     @OA\MediaType(
     *         mediaType="application/json",
     *         @OA\Schema(ref="#/components/schemas/Project"),
     *     ),
     *   ),
     * )
     *
     * @throws \Throwable
     * @throws \yii\base\InvalidConfigException
     * @throws \yii\db\StaleObjectException
     * @throws NotFoundHttpException
     */
    public function actionUpdate()
    {
        $request = Yii::$app->request->getBodyParams();
        if (!isset($request['project_id']) || $request['project_id'] == null){
            throw new BadRequestHttpException(json_encode(['The project ID not found']));
        }
        $project = Project::findOne($request['project_id']);
        if(empty($project)) {
            throw new NotFoundHttpException('The project not found');
        }
        $put = array_diff($request, [null, '']);
        $project->load($put, '');
        if (!$project->update()) {
            return $project->errors;
        }
        return $project;
    }
}