<?php

namespace backend\controllers;

use core\entities\Search;
use core\forms\SearchForm;
use core\services\user\UserManageService;
use Yii;
use yii\data\ActiveDataProvider;
use yii\web\Controller;
use yii\filters\VerbFilter;
use yii\filters\AccessControl;

/**
 * Site controller
 */
class SiteController extends Controller
{
    private $_service;

    public function __construct(string $id, $module, UserManageService $service, array $config = [])
    {
        parent::__construct($id, $module, $config);
        $this->_service = $service;
    }

    /**
     * @inheritdoc
     */
    public function behaviors()
    {
        return [
            'access' => [
                'class' => AccessControl::class,
                'rules' => [
                    [
                        'actions' => ['error'],
                        'allow'   => true,
                    ],
                    [
                        'actions' => ['index', 'search', 'language'],
                        'allow'   => true,
                        'roles'   => ['Dashboard'],
                    ],
                    [    // all the action are accessible to admin
                        'allow' => true,
                        'roles' => ['admin'],
                    ],
                ],
            ],
            'verbs'  => [
                'class'   => VerbFilter::class,
                'actions' => [
                    'logout'   => ['post'],
                    'language' => ['post'],
                ],
            ],
        ];
    }

    /**
     * @inheritdoc
     */
    public function actions()
    {
        return [
            'error' => [
                'class' => 'yii\web\ErrorAction',
            ],
        ];
    }

    /**
     * Displays homepage.
     *
     * @return string
     */
    public function actionIndex()
    {
        return $this->render('index');
    }

    public function actionSearch()
    {
        $form = new SearchForm();

        if ($form->load(Yii::$app->request->post()) && $form->validate()) {
            try {
                $query = Search::find()
                               ->andWhere(['LIKE', 'title', $form->query])
                               ->orWhere(['LIKE', 'content', $form->query]);

                $provider = new ActiveDataProvider([
                    'query'      => $query,
                    'pagination' => [
                        'pageSize' => 10,
                    ],
                    'sort'       => [],
                ]);

                return $this->render('search', [
                    'provider' => $provider,
                    'form'     => $form
                ]);

                //$page = $this->service->create($form);
                //return $this->redirect(['view', 'id' => $page->id]);
            } catch (\DomainException $e) {
                //Yii::$app->errorHandler->logException($e);
                //Yii::$app->session->setFlash('error', $e->getMessage());
            }
        }

        return '';
    }

    public function actionLanguage($language)
    {
        if ($language && in_array($language, array_keys(Yii::$app->params['backendTranslatedLanguages']))) {
            $this->_service->setBackendLanguage($language);
        }

        return $this->redirect(Yii::$app->request->referrer);
    }

    public function beforeAction($action)
    {
        if ($action->id === 'error') {
            $this->layout = 'error';
        }

        return parent::beforeAction($action);
    }
}