<?php

namespace frontend\modules\api\controllers;

use frontend\modules\api\models\Comment;
use yii\web\BadRequestHttpException;

class CommentController extends ApiController
{
    public function verbs(): array
    {
        return [
            'get-entity-type-list' => ['get'],
            'create' => ['post'],
            'update' => ['put', 'patch'],
        ];
    }

    /**
     *
     * @OA\Get(path="/comment/get-entity-type-list",
     *   summary="Список типов сущностей",
     *   description="Получить список всех возможных типов сущностей",
     *   tags={"Comment"},
     *   security={
     *     {"bearerAuth": {}}
     *   },
     *   @OA\Response(
     *     response=200,
     *     description="Возвращает массив",
     *     @OA\MediaType(
     *         mediaType="application/json",
     *         @OA\Schema(
     *             type="array",
     *             @OA\Items(
     *                 @OA\Property(
     *                     property="id",
     *                     type="integer",
     *                     example="1",
     *                 ),
     *                 @OA\Property(
     *                     property="name",
     *                     type="string",
     *                     example="Проект",
     *                 ),
     *             )
     *         ),
     *     ),
     *
     *   ),
     * )
     *
     * @return array
     */
    public function actionGetEntityTypeList(): array
    {
        $arr = [];
        foreach (Comment::getEntityTypeList() as $key => $value) {
            $arr[] = ["id" => $key, "name" => $value];
        }

        return $arr;
    }

    /**
     *
     * @OA\Post(path="/comment/create",
     *   summary="Добавить комментарий",
     *   description="Метод для создания комментария",
     *   security={
     *     {"bearerAuth": {}}
     *   },
     *   tags={"Comment"},
     *
     *   @OA\RequestBody(
     *     @OA\MediaType(
     *       mediaType="multipart/form-data",
     *       @OA\Schema(
     *          required={"text", "entity_type", "entity_id"},
     *          @OA\Property(
     *              property="text",
     *              type="string",
     *              description="Текст комментария",
     *          ),
     *          @OA\Property(
     *              property="entity_type",
     *              type="integer",
     *              description="Тип сущности",
     *          ),
     *          @OA\Property(
     *              property="entity_id",
     *              type="integer",
     *              description="Идентификатор сущности",
     *          ),
     *          @OA\Property(
     *              property="parent_id",
     *              type="integer",
     *              description="Идентификатор родительского комментария",
     *          ),
     *          @OA\Property(
     *              property="status",
     *              type="integer",
     *              description="Статус комментария",
     *          ),
     *       ),
     *     ),
     *   ),
     *   @OA\Response(
     *     response=200,
     *     description="Возвращает объект комментария",
     *     @OA\MediaType(
     *         mediaType="application/json",
     *         @OA\Schema(ref="#/components/schemas/Comment"),
     *     ),
     *   ),
     * )
     *
     * @return array|Comment
     * @throws BadRequestHttpException
     */
    public function actionCreate()
    {
        $model = new Comment();
        $request = \Yii::$app->request->post();

        $user_id = \Yii::$app->user->id;
        if (!$user_id) {
            throw new BadRequestHttpException(json_encode(['User not found']));
        }

        $request['user_id'] = $user_id;

        $put = array_diff($request, [null, '']);

        $model->load($put, '');

        if (!$model->save()) {
            return $model->errors;
        }

        return $model;
    }

    /**
     *
     * @OA\Put(path="/comment/update",
     *   summary="Редактировать комментария",
     *   description="Метод для редактирования комментария",
     *   security={
     *     {"bearerAuth": {}}
     *   },
     *   tags={"Comment"},
     *
     *   @OA\RequestBody(
     *     @OA\MediaType(
     *       mediaType="application/x-www-form-urlencoded",
     *       @OA\Schema(
     *          required={"comment_id", "text"},
     *          @OA\Property(
     *              property="comment_id",
     *              type="integer",
     *              description="Идентификатор комментария",
     *          ),
     *          @OA\Property(
     *              property="text",
     *              type="string",
     *              description="Текст комментария",
     *          ),
     *          @OA\Property(
     *              property="status",
     *              type="integer",
     *              description="статус",
     *          ),
     *       ),
     *     ),
     *   ),
     *   @OA\Response(
     *     response=200,
     *     description="Возвращает объект Комментария",
     *     @OA\MediaType(
     *         mediaType="application/json",
     *         @OA\Schema(ref="#/components/schemas/Comment"),
     *     ),
     *   ),
     * )
     *
     * @return Comment
     * @throws BadRequestHttpException
     * @throws \yii\base\InvalidConfigException
     */
    public function actionUpdate(): Comment
    {
        $user_id = \Yii::$app->user->id;
        if (!$user_id) {
            throw new BadRequestHttpException(json_encode(['User not found']));
        }

        $comment_id = \Yii::$app->request->getBodyParam('comment_id');
        $model = Comment::findOne($comment_id);
        if (!$model) {
            throw new BadRequestHttpException(json_encode(['Comment not found']));
        }

        $put = array_diff(\Yii::$app->request->getBodyParams(), [null, '']);
        $model->load($put, '');


        if(!$model->validate()){
            throw new BadRequestHttpException($model->errors);
        }
        $model->save();

        return $model;
    }

    /**
     *
     * @OA\Get(path="/comment/get-by-entity",
     *   summary="Получить комментарии по идентификатору сущности",
     *   description="Метод для получения комментариев по идентификатору сущности.",
     *   security={
     *     {"bearerAuth": {}}
     *   },
     *   tags={"Comment"},
     *   @OA\Parameter(
     *      name="entity_id",
     *      in="query",
     *      required=true,
     *      @OA\Schema(
     *        type="integer",
     *        default=null
     *      )
     *   ),
     *
     *   @OA\Parameter(
     *      name="entity_type",
     *      in="query",
     *      required=true,
     *      @OA\Schema(
     *        type="integer",
     *        default=null
     *      )
     *   ),
     *
     *   @OA\Response(
     *     response=200,
     *     description="Возвращает массив объектов Комментариев",
     *     @OA\MediaType(
     *         mediaType="application/json",
     *         @OA\Schema(ref="#/components/schemas/CommentExample"),
     *     ),
     *   ),
     * )
     *
     * @param int $entity_id
     * @return array|\yii\db\ActiveRecord[]
     */
    public function actionGetByEntity(int $entity_id, int $entity_type): array
    {
        $model = Comment::find()->where(['entity_id' => $entity_id, 'entity_type' => $entity_type, 'status' => Comment::STATUS_ACTIVE])->all();

        return $model;
    }

}