<?php
namespace MMK2410\FeIpLogin\Domain\Repository;

/***************************************************************
 *  Copyright notice
 *
 *  (c) 2016 Alex Kellner <alexander.kellner@in2code.de>, in2code.de
 *  (c) 2018 Marcel Kapfer <stuve.oeffentlichkeitsarbeit@uni-ulm.de>, Verfasste Studierendenschaft der Universität Ulm
 *  (c) 2021 Marcel Kapfer <opensource@mmk2410.org>
 *
 *  All rights reserved
 *
 *  This script is part of the TYPO3 project. The TYPO3 project is
 *  free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  The GNU General Public License can be found at
 *  http://www.gnu.org/copyleft/gpl.html.
 *
 *  This script is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  This copyright notice MUST APPEAR in all copies of the script!
 ***************************************************************/

use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Core\Database\ConnectionPool;
use TYPO3\CMS\Core\Database\Query\Restriction\DeletedRestriction;
use TYPO3\CMS\Core\Database\Query\Restriction\HiddenRestriction;

/**
 * Class Contact
 */
class FeGroupsRepository
{
    const TABLE_NAME = 'fe_groups';

    /**
     * Find groups with current IP address
     *
     * @return array
     */
    public function findByCurrentIpAddress()
    {
        $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable(self::TABLE_NAME);

        $queryBuilder
            ->getRestrictions()
            ->removeAll()
            ->add(GeneralUtility::makeInstance(DeletedRestriction::class))
            ->add(GeneralUtility::makeInstance(HiddenRestriction::class));

        $queryBuilder
            ->select('*')
            ->from(self::TABLE_NAME);

        $this->getIpQueryString($queryBuilder);

        $rows = $queryBuilder->execute()
                             ->fetchAll();

        if (!empty($rows)) {
            return $rows;
        }
        return [];
    }

    /**
     * Build string like
     *      ip_mask like "%1.1.1.1%" and ip_mask like "%2.2.2.2%"
     *
     * @param QueryBuilder $queryBuilder
     */
    protected function getIpQueryString(&$queryBuilder)
    {
        foreach ($this->getCurrentIpAddresses() as $ipAddress) {
            $queryBuilder->orWhere(
                $queryBuilder->expr()->like(
                    'ip_mask',
                    $queryBuilder->createNamedParameter(
                        '%' .
                        $queryBuilder->escapeLikeWildcards($ipAddress) .
                        '%'
                    )
                )
            );
        }
    }

    /**
     * Get current IP address and all variants with wildcards
     *
     * @return array
     */
    protected function getCurrentIpAddresses()
    {
        $ips = [
            GeneralUtility::getIndpEnv('REMOTE_ADDR')
        ];
        $parts = GeneralUtility::trimExplode('.', $ips[0], true);
        $ips[] = '*.*.*.*';
        $ips[] = $parts[0] . '.*.*.*';
        $ips[] = $parts[0] . '.' . $parts[1] . '.*.*';
        $ips[] = $parts[0] . '.' . $parts[1] . '.' . $parts[2] . '.*';
        return $ips;
    }
}