<?php

/**
 * Copyright Souke (2018)
 *
 * contact@souke.fr
 *
 * Ce logiciel est un programme informatique servant à aider les producteurs
 * à distribuer leur production en circuits courts.
 *
 * Ce logiciel est régi par la licence CeCILL soumise au droit français et
 * respectant les principes de diffusion des logiciels libres. Vous pouvez
 * utiliser, modifier et/ou redistribuer ce programme sous les conditions
 * de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA
 * sur le site "http://www.cecill.info".
 *
 * En contrepartie de l'accessibilité au code source et des droits de copie,
 * de modification et de redistribution accordés par cette licence, il n'est
 * offert aux utilisateurs qu'une garantie limitée.  Pour les mêmes raisons,
 * seule une responsabilité restreinte pèse sur l'auteur du programme,  le
 * titulaire des droits patrimoniaux et les concédants successifs.
 *
 * A cet égard  l'attention de l'utilisateur est attirée sur les risques
 * associés au chargement,  à l'utilisation,  à la modification et/ou au
 * développement et à la reproduction du logiciel par l'utilisateur étant
 * donné sa spécificité de logiciel libre, qui peut le rendre complexe à
 * manipuler et qui le réserve donc à des développeurs et des professionnels
 * avertis possédant  des  connaissances  informatiques approfondies.  Les
 * utilisateurs sont donc invités à charger  et  tester  l'adéquation  du
 * logiciel à leurs besoins dans des conditions permettant d'assurer la
 * sécurité de leurs systèmes et ou de leurs données et, plus généralement,
 * à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.
 *
 * Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
 * pris connaissance de la licence CeCILL, et que vous en avez accepté les
 * termes.
 */

namespace producer\controllers;

use common\forms\ContactForm;
use domain\Feature\Feature\Feature;
use domain\Product\Product\Product;
use yii\base\ErrorException;
use yii\data\ActiveDataProvider;
use yii\helpers\Html;

class SiteController extends ProducerBaseController
{
    /**
     * @inheritdoc
     */
    public function behaviors()
    {
        return [];
    }

    public function actions()
    {
        return [
            'captcha' => [
                'class' => 'yii\captcha\CaptchaAction',
                'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null,
            ],
        ];
    }

    /*public function actionLogin()
    {
        //return
    }*/

    /**
     * Affiche et gère les erreurs.
     */
    public function actionError()
    {
        $exception = \Yii::$app->errorHandler->exception;

        if ($exception !== null) {
            if ($exception->getMessage() == 'Producteur introuvable') {
                \Yii::$app->getResponse()->redirect(
                    $this->getUrlManagerFrontend()->createAbsoluteUrl(['site/error', 'producer_not_found' => true])
                )->send();
            } else {
                return $this->render('error', ['exception' => $exception]);
            }
        }
    }

    public function actionIndex()
    {
        return $this->render('index');
    }

    public function actionProducts()
    {
        $productModule = $this->getProductModule();

        $productCategoryArray = $this->getProductCategoryModule()->findProductCategories();
        $dataProviderProductsByCategories = [];
        foreach ($productCategoryArray as $productCategory) {
            $dataProviderProductsByCategories[$productCategory->id] = new ActiveDataProvider([
                'query' => $productModule->queryProductsByProductCategory($productCategory)->query(),
                'pagination' => [
                    'pageSize' => 500,
                ],
                'sort' => false,
            ]);
            $this->filterProductsPublic($dataProviderProductsByCategories[$productCategory->id]);
        }

        $queryProducts = Product::find()
            ->andWhere([
                'id_producer' => $this->getProducerCurrent()->id,
                'status' => Product::STATUS_ONLINE,
                'id_product_category' => null,
            ])
            ->with('productPointSale')
            ->orderBy('order ASC');

        $dataProviderProducts = new ActiveDataProvider([
            'query' => $queryProducts,
            'pagination' => [
                'pageSize' => 500,
            ],
            'sort' => false,
        ]);
        $this->filterProductsPublic($dataProviderProducts);

        $products = $queryProducts->all();
        foreach ($dataProviderProductsByCategories as $dataProvider) {
            $products = array_merge(
                $products,
                $dataProvider->query->all()
            );
        }

        $hasProductPhoto = false;
        $hasProductWeight = false;

        foreach ($products as $product) {
            if (strlen($product->photo) > 0) {
                $hasProductPhoto = true;
            }
            if ($product->weight && $product->weight > 0) {
                $hasProductWeight = true;
            }
        }

        return $this->render('products', [
            'dataProviderProductsByCategories' => $dataProviderProductsByCategories,
            'dataProviderProducts' => $dataProviderProducts,
            'hasProductPhoto' => $hasProductPhoto,
            'hasProductWeight' => $hasProductWeight,
            'categories' => $productCategoryArray,
        ]);
    }

    public function actionPointsSale()
    {
        $pointSaleModule = $this->getPointSaleModule();

        $dataProviderPointsSale = new ActiveDataProvider([
            'query' => $pointSaleModule->queryPointSalesPublic($this->getProducerCurrent()),
            'pagination' => [
                'pageSize' => 50,
            ],
            'sort' => false,
        ]);

        return $this->render('points-sale', [
            'dataProviderPointsSale' => $dataProviderPointsSale,
        ]);
    }

    public function filterProductsPublic($dataProviderProducts)
    {
        $productModule = $this->getProductModule();
        $models = $dataProviderProducts->getModels();
        foreach($models as $index => $product) {
            if(!$productModule->isPublic($product)) {
                unset($models[$index]);
            }
        }
        $dataProviderProducts->setModels($models);
    }

    /**
     * Affiche et traite le formulaire de contact dédié aux producteurs.
     */
    public function actionContact()
    {
        $featureModule = $this->getFeatureModule();
        if($featureModule->getChecker()->isDisabled(Feature::ALIAS_CONTACT)) {
            return $this->redirect(['site/index']);
        }

        $model = new ContactForm();
        $producer = $this->getProducerCurrent();

        if ($model->load(\Yii::$app->request->post()) && $model->validate()) {
            $isSent = false;
            if ($producer->contact_email && strlen($producer->contact_email) > 0 && $model->sendEmail($producer)) {
                $isSent = true;
            }

            if ($isSent) {
                $this->setFlash('success', 'Votre message a bien été envoyé.');
            } else {
                $this->setFlash('error', 'Il y a eu une erreur lors de l\'envoi de votre message.');
            }

            $model = new ContactForm();
        }

        return $this->render('contact', [
            'model' => $model,
            'producer' => $this->getProducerCurrent()
        ]);
    }

    public function actionSupport()
    {
        $featureModule = $this->getFeatureModule();
        if($featureModule->getChecker()->isDisabled(Feature::ALIAS_SHOP_SUPPORT)) {
            return $this->redirect(['site/index']);
        }

        $model = new ContactForm();
        $producer = $this->getProducerCurrent();

        if ($model->load(\Yii::$app->request->post()) && $model->validate()) {
            $isSent = false;
            if ($model->sendEmailShopSupport($producer)) {
                $isSent = true;
            }

            if ($isSent) {
                $this->setFlash('success', 'Votre message a bien été envoyé.');
            } else {
                $this->setFlash('error', 'Il y a eu une erreur lors de l\'envoi de votre message.');
            }

            $model = new ContactForm();
        }

        return $this->render('support', [
            'model' => $model,
            'producer' => $this->getProducerCurrent()
        ]);
    }

    /**
     * Ajoute ou supprime un producteur des favoris de l'utilisateur.
     * Redirige vers la page d'accueil du producteur.
     */
    public function actionBookmarks(string $action)
    {
        $producer = $this->getProducerCurrent();

        $userCurrent = $this->getUserCurrent();
        if($userCurrent) {
            $userProducer = $this->getUserProducerModule()
                ->createUserProducerIfNotExist($userCurrent, $producer);

            if ($action == 'add') {
                $userProducer->bookmark = 1;
                $this->setFlash(
                    'success',
                    'Le producteur <strong>' . Html::encode($producer->name) . '</strong> vient d\'être ajouté à votre liste de producteurs.'
                );
            } else {
                $userProducer->bookmark = 0;
                $this->setFlash(
                    'success',
                    'Le producteur <strong>' . Html::encode($producer->name) . '</strong> vient d\'être supprimé de votre liste de producteurs.'
                );
            }
            $userProducer->save();
        }

        return $this->redirect(['site/index']);
    }

    /**
     * Affiche les mentions légales du producteur.
     */
    public function actionMentions()
    {
        $producer = $this->getProducerCurrent();

        if (!strlen($producer->mentions)) {
            throw new \yii\base\UserException('Mentions légales introuvables.');
        }

        return $this->render('mentions', [
            'producer' => $producer
        ]);
    }

    /**
     * Affiche les conditions générales de vente du producteur.
     */
    public function actionGcs()
    {
        $producer = $this->getProducerCurrent();

        if (!strlen($producer->gcs)) {
            throw new \yii\base\UserException('Conditions générales de vente introuvables.');
        }

        return $this->render('gcs', [
            'producer' => $producer
        ]);
    }

    public function actionUserMessageRead(int $idUserMessage)
    {
        $userMessageModule = $this->getUserMessageModule();
        $userMessage = $userMessageModule->getRepository()->findOneUserMessageById($idUserMessage);
        if($userMessage) {
            $userMessageModule->getManager()->readUserMessage($userMessage);
        }
        return $this->redirectReferer();
    }
}

?>