<?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 backend\controllers\admin;

use backend\controllers\BackendController;
use common\helpers\Ajax;
use common\helpers\Alwaysdata;
use domain\Order\Order\Order;
use domain\Order\Order\OrderRepositoryQuery;
use domain\Producer\Producer\Producer;
use domain\Product\Product\Product;
use Yii;
use yii\data\ActiveDataProvider;
use yii\filters\AccessControl;
use yii\filters\VerbFilter;
use yii\helpers\Html;
use yii\web\NotFoundHttpException;

class ProducerAdminController extends BackendController
{
    public function behaviors()
    {
        return [
            'verbs' => [
                'class' => VerbFilter::class,
                'actions' => [
                    'delete' => ['post'],
                ],
            ],
            'access' => [
                'class' => AccessControl::class,
                'rules' => [
                    [
                        'allow' => true,
                        'roles' => ['@'],
                        'matchCallback' => function ($rule, $action) {
                            return $this->getUserModule()
                                ->getAuthorizationChecker()
                                ->isGrantedAsAdministrator($this->getUserCurrent());
                        }
                    ]
                ],
            ],
        ];
    }

    /**
     * Liste les producteurs.
     *
     * @return mixed
     */
    public function actionIndex()
    {
        $dataProviderProducer = new ActiveDataProvider([
            'query' => Producer::find()
                ->with('userProducer', 'user')
                ->orderBy('active DESC, free_price DESC'),
            'pagination' => [
                'pageSize' => 1000,
            ],
        ]);

        return $this->render('index', [
            'dataProviderProducer' => $dataProviderProducer
        ]);
    }

    /**
     * Crée un producteur.
     */
    public function actionCreate()
    {
        $producerModule = $this->getProducerModule();
        $producer = $producerModule->instanciateProducer();

        if ($producer->load(\Yii::$app->request->post()) && $producerModule->saveCreate($producer)) {
            $this->setFlash('success', 'Producteur créé.');
            return $this->redirect(['index']);
        } else {
            return $this->render('create', [
                'model' => $producer,
            ]);
        }
    }

    /**
     * Modification d'un producteur.
     */
    public function actionUpdate(int $id)
    {
        $producerModule = $this->getProducerModule();
        $producer = $this->findProducer($id);

        if ($producer->load(\Yii::$app->request->post()) && $producerModule->saveCreate($producer)) {
            $this->setFlash('success', 'Producteur modifié.');
            return $this->redirect(['index']);
        } else {
            return $this->render('update', [
                'model' => $producer,
            ]);
        }
    }

    /**
     * Facturation producteur.
     */
    public function actionBilling(int $id)
    {
        $producer = $this->findProducer($id);

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

    public function actionAlwaysdata(int $id)
    {
        $producer = $this->findProducer($id);

        if($producer->contact_email) {
            Yii::$app->alwaysdataClient->initRedirections($producer);
            return Ajax::responseSuccess('Redirections initialisées chez Alwaysdata');
        }
        else {
            return Ajax::responseError("L'adresse email de contact du producteur n'est pas définie");
        }
    }

    public function actionDolibarr(int $id)
    {
        $producerModule = $this->getProducerModule();
        $producer = $this->findProducer($id);
        if($producer->dolibarr_socid) {
            $producerModule->generateDolibarrProducerInvoice($producer);
            return Ajax::responseSuccess("Facture générée sur Dolibarr pour le producteur \"".Html::encode($producer->name)."\"");
        }
        else {
            return Ajax::responseError("Dolibarr : l'id user du producteur doit être défini");
        }
    }

    public function actionUserTransfer($fromProducerId, $toProducerId, $withOrders = 1)
    {
        $producerModule = $this->getProducerModule();
        $userModule = $this->getUserModule();

        $fromProducerId = (int)$fromProducerId;
        $toProducerId = (int)$toProducerId;
        $count = 0;
        $usersArray = $userModule->queryUsersBy(['id_producer' => $fromProducerId])->all();

        foreach ($usersArray as $user) {
            $idUser = $user['user_id'];

            $countOrders = 0;
            if ($withOrders) {
                $countOrders = Order::searchCount([
                    'id_user' => $idUser,
                    'distribution.id_producer' => $fromProducerId,
                ], [
                    'conditions' => OrderRepositoryQuery::getSqlFilterIsValid()
                ]);
            }

            if (($withOrders && $countOrders) || !$withOrders) {
                $producerModule->addUser(
                    $userModule->findOneUserById($idUser),
                    $producerModule->findOneProducerById($toProducerId)
                );
                $count++;
            }
        }

        if ($count) {
            $this->setFlash('success', $count . ' clients importés du producteur #' . $fromProducerId . ' vers le producteur #' . $toProducerId . '.');
        } else {
            $this->setFlash('error', 'Aucun client à importer.');
        }

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

    public function actionProducerInstallTaxUpdatePrices($idProducer)
    {
        $productsArray = Product::searchAll([
            'id_producer' => $idProducer
        ]);

        $connection = Yii::$app->getDb();

        foreach ($productsArray as $product) {
            $product->price = round($product->price / (1 + $product->taxRate->value), 2);
            $product->save();

            $command = $connection->createCommand("
                        UPDATE `product_order`
                        SET price = ROUND(price / (1 + :tax_value), 2),
                            id_tax_rate = :id_tax_rate
                        WHERE id_product = :id_product",
                [
                    ':id_product' => $product->id,
                    ':tax_value' => $product->taxRate->value,
                    ':id_tax_rate' => $product->taxRate->id,
                ]);

            $result = $command->query();
        }

        echo 'ok';
    }

    /**
     * Recherche un producteur.
     */
    protected function findProducer(int $id)
    {
        $producerModule = $this->getProducerModule();

        if (($model = $producerModule->findOneProducerById($id)) !== null) {
            return $model;
        } else {
            throw new NotFoundHttpException('Producteur introuvable.');
        }
    }

}
