<?php

/**
 * Copyright distrib (2018)
 *
 * contact@opendistrib.net
 *
 * 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.
 */

use common\components\BusinessLogic;
use common\components\DolibarrApi;
use common\logic\Distribution\Distribution\Model\Distribution;
use common\logic\Document\DeliveryNote\Model\DeliveryNote;
use common\logic\Order\Order\Model\Order;
use common\logic\Ticket\Ticket\Model\Ticket;
use common\logic\Payment\Model\Payment;
use common\logic\User\User\Model\User;

$serverName = isset($_SERVER['SERVER_NAME']) ?? '';

return [
    'bootstrap' => ['listener'],
    'aliases' => [
        '@bower' => '@vendor/bower-asset',
    ],
    'vendorPath' => dirname(__DIR__, 2) . '/vendor',
    'on beforeRequest' => function () {
        if (method_exists(Yii::$app->request, 'getAbsoluteUrl')) {
            $url = Yii::$app->request->getAbsoluteUrl();
            if ($_SERVER['SERVER_NAME'] != 'localhost' && !empty($url) && substr($url, -1) == '/' && substr($url, -5) != '.net/') {
                $url = substr($url, 0, strlen($url) - 1);
                Yii::$app->getResponse()->redirect($url, 301);
                Yii::$app->end();
            }
        }

        if (Yii::$app->params['maintenanceMode']) {
            if(isset($_GET['letMeIn'])) {
                Yii::$app->session->set('letMeIn', (int) $_GET['letMeIn']);
            }
            $letMeIn = Yii::$app->session['letMeIn'];
            if (!$letMeIn) {
                Yii::$app->catchAll = ['site/maintenance'];
            }
        }
    },
    'components' => [
        'parameterBag' => [
          'class' => 'common\components\ParameterBag'
        ],
        'pageSizer' => [
            'class' => 'common\components\PageSizer'
        ],
        'alwaysdataClient' => [
            'class' => 'common\components\AlwaysdataClient'
        ],
        'assetManager' => [
            'linkAssets' => YII_ENV == "dev" ? 'true' : false,
        ],
        'user' => [
            'class' => 'yii\web\User',
            'identityClass' => 'common\logic\User\User\Model\User',
            'enableAutoLogin' => true,
            'identityCookie' => [
                'name' => 'distrib',
                'domain' => (($serverName != 'localhost') ? '.' : '') . Yii::getAlias('@domainName'),
                'path' => '/',
            ]
        ],
        'session' => [
            'class' => 'yii\web\Session',
            'name' => 'PHPDISTRIBSESSID',
            'cookieParams' => [
                'domain' => (($serverName != 'localhost') ? '.' : '') . Yii::getAlias('@domainName'),
                'httpOnly' => true,
            ],
        ],
        'cache' => [
            'class' => 'yii\caching\FileCache',
        ],
        'image' => [
            'class' => 'yii\image\ImageDriver',
            'driver' => 'GD',  //GD or Imagick
        ],
        'mailerService' => [
            'class' => 'common\components\MailerService'
        ],
        'view' => [
            'class' => 'yii\web\View',
            'renderers' => [
                'twig' => [
                    'class' => 'yii\twig\ViewRenderer',
                    'cachePath' => '@runtime/Twig/cache',
                    'options' => [
                        'auto_reload' => true,
                    ],
                    'globals' => [
                        'html' => ['class' => '\yii\helpers\Html'],
                    ],
                    'uses' => ['yii\bootstrap'],
                ],
            ],
        ],
        'urlManagerProducer' => [
            'class' => 'producer\components\UrlManagerProducer',
            'subDomain' => Yii::getAlias('@producerSubdomain'),
            'domainName' => Yii::getAlias('@domainName'),
            'baseUrl' => Yii::getAlias('@baseUrl') . Yii::getAlias('@baseUrlProducer'),
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'enableStrictParsing' => false,
            'rules' => [
                '<slug_producer:\w+>' => 'site/index',
                '<slug_producer:\w+>/<controller>/<action>' => '<controller>/<action>',
            ],
            'normalizer' => [
                'class' => 'yii\web\UrlNormalizer',
            ],
        ],
        'urlManagerFrontend' => [
            'class' => 'common\components\UrlManagerCommon',
            'subDomain' => Yii::getAlias('@frontendSubdomain'),
            'domainName' => Yii::getAlias('@domainName'),
            'baseUrl' => Yii::getAlias('@baseUrl') . Yii::getAlias('@baseUrlFrontend'),
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'enableStrictParsing' => false,
            'rules' => [
            ],
        ],
        'urlManagerBackend' => [
            'class' => 'common\components\UrlManagerCommon',
            'subDomain' => Yii::getAlias('@backendSubdomain'),
            'domainName' => Yii::getAlias('@domainName'),
            'baseUrl' => Yii::getAlias('@baseUrl') . Yii::getAlias('@baseUrlBackend'),
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'enableStrictParsing' => false,
            'rules' => [],
        ],
        'dolibarrApi' => function() {
            return new DolibarrApi(
                Yii::$app->parameterBag->get('dolibarrApiUrl'),
                ['DOLAPIKEY', \Yii::$app->parameterBag->get('dolibarrApiKey')]
            );
        },
        'logic' => function () {
            return new BusinessLogic();
        },
        'listener' => [
            'class'     => \justcoded\yii2\eventlistener\components\EventListener::class,
            'listeners' => [],
            'observers' => [
                User::class => [
                    // Producer : lien avec utilisateur
                    common\logic\Producer\Producer\Event\UserObserver::class
                ],
                Order::class => [
                    // Payment : remboursement commande
                    common\logic\Payment\Event\OrderObserver::class
                ],
                Payment::class => [
                    // UserProducer : mise à jour du crédit
                    common\logic\User\UserProducer\Event\PaymentObserver::class
                ],
                Distribution::class => [
                    // Subscription : génération des commandes sur base des abonnements
                    common\logic\Subscription\Subscription\Event\DistributionObserver::class
                ],
                DeliveryNote::class => [
                    // Order : assignation du bon de livraison aux commandes
                    common\logic\Order\Order\Event\DeliveryNoteObserver::class
                ],
                Ticket::class => [
                    // User : envoi email nouveau ticket à l'administrateur
                    common\logic\User\User\Event\TicketObserver::class,
                ],
            ],
        ],
    ],
    'language' => 'fr-FR',
    'timeZone' => 'Europe/Paris',
];
