<?php

declare(strict_types=1);

/*
* This file is part of contao-weinanlieferung-bundle.
*
* (c) vonRotenberg
*
* @license commercial
*/

namespace vonRotenberg\WeinanlieferungBundle\Cron;

use Contao\CoreBundle\Monolog\ContaoContext;
use Contao\CoreBundle\ServiceAnnotation\CronJob;
use Contao\MemberModel;
use Doctrine\DBAL\Connection;
use Psr\Log\LoggerInterface;
use Psr\Log\LogLevel;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use vonRotenberg\WeinanlieferungBundle\Event\CheckInCompletedEvent;
use vonRotenberg\WeinanlieferungBundle\Model\WeinanlieferungReservationModel;

/**
 * @CronJob("* * * * *")
 */
class AutoCheckInJob
{
    /** @var LoggerInterface */
    private $logger;

    /** @var Connection */
    private $db;

    private $eventDispatcher;


    public function __construct(Connection $db, LoggerInterface $logger, EventDispatcherInterface $eventDispatcher)
    {
        $this->logger = $logger;
        $this->db = $db;
        $this->eventDispatcher = $eventDispatcher;
    }

    public function __invoke(string $scope)
    {
        $intThreshold = strtotime('+5 minutes');
        $strDefaultNumber = '9999';

        $Reservations = WeinanlieferungReservationModel::findFutureBy([
            "approved = '1'",
            "checked_in = ''",
            "? >= (SELECT tl_vr_wa_slot.time FROM tl_vr_wa_slot WHERE tl_vr_wa_slot.id=tl_vr_wa_reservation.pid)"
        ],[$intThreshold]);

        if ($Reservations === null) {
            return;
        }

        foreach ($Reservations as $reservation) {
            $reservation = $reservation->current();

            $memberModel = MemberModel::findById($reservation->uid);

            if (null === $memberModel) {
                $this->logger->log(
                    LogLevel::ERROR,
                    sprintf('Could not find member with ID: %s', $reservation->uid),
                    ['contao' => new ContaoContext(__METHOD__, 'AUTO_CHECK_IN')]
                );
                continue;
            }

            $time = time();
            $reservation->checked_in = '1';
            $reservation->checked_in_on = $time;

            $arrBehaelterNumbers = [];
            for ($i = 1; $i <= $reservation->behaelter; $i++) {
                $arrBehaelterNumbers[] = [
                    'behaelter' => $strDefaultNumber,
                    'member' => $memberModel->memberno
                ];
            }

            $reservation->behaelter_numbers = json_encode($arrBehaelterNumbers);
            $reservation->save();

            $event = new CheckInCompletedEvent($reservation->row(), $reservation);
            $this->eventDispatcher->dispatch($event, CheckInCompletedEvent::NAME);
        }
    }
}