<?php

use function DI\autowire, DI\create, DI\get;

use %NAMESPACE%\Entity;

use Psr\Http\Message\ServerRequestInterface;

use Ulmus\Entity\Field\Datetime,
    Ulmus\User\Lib\Authenticate;

use Storage\{ Session, Cookie };

use Laminas\Diactoros\Response\{ RedirectResponse, HtmlResponse };

use Notes\Security\SecurityHandler;

use Picea\Picea;

use TheBugs\Email\{ EmailConfiguration, MailerInterface, SwiftMailer };

use Taxus\{ Taxus, PermissionGrantInterface };

return [
    Entity\User::class => autowire(Entity\User::class),

    Authenticate::class => create(Authenticate::class)->constructor(get(Session::class), get(Cookie::class), get('authentication.method')),

    SecurityHandler::class => create(SecurityHandler::class)->constructor(function() {
        return new RedirectResponse(getenv("URL_BASE")."/login");
    }, get('authentication.unauthorize'), get(Taxus::class)),

    'authentication.error' => function($c, Picea $picea) {
        return function($message) use ($picea) {
            return new HtmlResponse($picea->renderHtml('lean/error/500', [
                'title' => "",
                'subtitle' => "",
                'message' => $message,
            ]));
        };
    },

    'authentication.unauthorize' => function($c, Picea $picea) {
        return function($message) use ($picea) {
            return new HtmlResponse($picea->renderHtml('lean/error/401', [
                'title' => "",
                'subtitle' => "",
                'message' => $message,
            ]));
        };
    },

    EmailConfiguration::class => function($c) {
        $email = new EmailConfiguration( EmailConfiguration::AUTH_TYPE_SMTP );
        $email->smtpHost = getenv('SMTP_HOSTNAME');
        $email->smtpPort = getenv('SMTP_PORT');
        $email->smtpUsername = getenv('SMTP_USERNAME');
        $email->smtpPassword = getenv('SMTP_PASSWORD');
        $email->smtpUseTLS = getenv('SMTP_TLS');
        $email->toAddress = getenv("TO_EMAIL");
        $email->fromAddress = getenv("FROM_EMAIL");
        $email->fromName = getenv("FROM_NAME");

        return $email;
    },

    PermissionGrantInterface::class => create(%NAMESPACE%\PrivilegeGrantAccess::class)->constructor(get(ServerRequestInterface::class), get(Session::class)),
];