<?php

namespace Xentral\Modules\TimeManagement;

use ApplicationCore;
use Mitarbeiterzeiterfassung;
use Xentral\Core\DependencyInjection\ContainerInterface;
use Xentral\Modules\TimeManagement\Service\GroupGateway;
use Xentral\Modules\TimeManagement\Service\HolidayGateway;
use Xentral\Modules\TimeManagement\Service\TimeManagementHistoryService;
use Xentral\Modules\TimeManagement\Service\TimeManagementSettingGateway;
use Xentral\Modules\TimeManagement\Service\TimeManagementTargetHourGateway;
use Xentral\Modules\TimeManagement\Service\TimeManagementTargetHourService;
use Xentral\Modules\TimeManagement\Wrapper\TimeManagementMailerWrapper;
use Xentral\Modules\TimeManagement\Wrapper\TimeManagementTargetHourWrapper;


final class Bootstrap
{
    /**
     * @return array
     */
    public static function registerServices(): array
    {
        return [
            'TimeManagementModule' => 'onInitTimeManagementModule',
            'TimeManagementMailer' => 'onInitTimeManagementMailer',
        ];
    }

    /**
     * @param ContainerInterface $container
     *
     * @return TimeManagementModule
     */
    public static function onInitTimeManagementModule(ContainerInterface $container): TimeManagementModule
    {
        return new TimeManagementModule(
            self::onInitTimeManagementTargetHourGateway($container),
            self::onInitTimeManagementTargetHourService($container),
            self::onInitTimeManagementSettingGateway($container),
            self::onInitHolidayGateway($container),
            self::onInitGroupGateway($container),
            self::onInitTimeManagementTargetHourWrapper($container),
            self::onInitTimeManagementHistoryService($container)
        );
    }

    /**
     * @param ContainerInterface $container
     *
     * @return TimeManagementTargetHourService
     */
    private static function onInitTimeManagementTargetHourService(ContainerInterface $container
    ): TimeManagementTargetHourService {
        return new TimeManagementTargetHourService(
            $container->get('Database')
        );
    }

    /**
     * @param ContainerInterface $container
     *
     * @return TimeManagementTargetHourGateway
     */
    private static function onInitTimeManagementTargetHourGateway(ContainerInterface $container
    ): TimeManagementTargetHourGateway {
        return new TimeManagementTargetHourGateway(
            $container->get('Database')
        );
    }

    /**
     * @param ContainerInterface $container
     *
     * @return TimeManagementSettingGateway
     */
    private static function onInitTimeManagementSettingGateway(ContainerInterface $container
    ): TimeManagementSettingGateway {
        return new TimeManagementSettingGateway(
            $container->get('Database')
        );
    }

    /**
     * @param ContainerInterface $container
     *
     * @return HolidayGateway
     */
    private static function onInitHolidayGateway(ContainerInterface $container): HolidayGateway
    {
        return new HolidayGateway(
            $container->get('Database')
        );
    }

    /**
     * @param ContainerInterface $container
     *
     * @return GroupGateway
     */
    private static function onInitGroupGateway(ContainerInterface $container): GroupGateway
    {
        return new GroupGateway(
            $container->get('Database')
        );
    }

    /**
     * @param ContainerInterface $container
     *
     * @return TimeManagementTargetHourWrapper
     */
    private static function onInitTimeManagementTargetHourWrapper(ContainerInterface $container
    ): TimeManagementTargetHourWrapper {
        /** @var ApplicationCore $app */
        $app = $container->get('LegacyApplication');

        /** @var Mitarbeiterzeiterfassung $timeRecordingModule */
        $timeRecordingModule = $app->erp->LoadModul('mitarbeiterzeiterfassung');

        return new TimeManagementTargetHourWrapper($timeRecordingModule);
    }

    /**
     * @param ContainerInterface $container
     *
     * @return TimeManagementHistoryService
     */
    private static function onInitTimeManagementHistoryService(ContainerInterface $container
    ): TimeManagementHistoryService {
        return new TimeManagementHistoryService(
            $container->get('Database')
        );
    }

    /**
     * @param ContainerInterface $container
     *
     * @return TimeManagementMailerWrapper
     */
    public function onInitTimeManagementMailer(ContainerInterface $container): TimeManagementMailerWrapper
    {
        /** @var ApplicationCore $app */
        $app = $container->get('LegacyApplication');

        return new TimeManagementMailerWrapper(
            $app->erp
        );
    }
}