<?php
namespace frontend\controllers;

use core\forms\SubscribeForm;
use core\services\newsletter\Newsletter;
use frontend\components\FrontendController;
use yii\filters\VerbFilter;
use yii\filters\AccessControl;
use frontend\components\SiteAccess;
use Yii;

/**
 * Site controller
 */
class SiteController extends FrontendController
{
	public $newletter;

	public function __construct( string $id, $module, Newsletter $newsletter, array $config = [] ) {
		parent::__construct( $id, $module, $config );
		$this->newletter = $newsletter;
	}

	/**
     * @inheritdoc
     */
    public function behaviors()
    {
        return [
            'access' => [
                'class' => AccessControl::class,
                'only' => ['subscribe'],
                'rules' => [
	                [
		                'actions' => ['subscribe'],
		                'allow' => true,
	                ],
                ],
            ],
            'verbs' => [
                'class' => VerbFilter::class,
                'actions' => [
                    'logout' => ['post'],
                ],
            ],
	        SiteAccess::class,
        ];
    }

    /**
     * @inheritdoc
     */
    public function actions()
    {
        return [
            'error' => [
                'class' => 'yii\web\ErrorAction',
            ],
            'captcha' => [
                'class' => 'yii\captcha\CaptchaAction',
                'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null,
	            'transparent' => true,
            ],
        ];
    }

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

	public function actionSubscribe()
	{
		Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
		$form = new SubscribeForm();
		if(Yii::$app->request->isAjax && $form->load(Yii::$app->request->post())){
			try {
				$this->newletter->subscribe( $form->email );
				return [ 'result' => 'success' ];
			}
			catch (\RuntimeException $e) {
				return [ 'result' => 'error', 'message' => $e->getMessage() ];
			}
		}
		return ['result' => 'error', 'message' => 'Request error'];
	}

}