<?php

namespace MintyPHP\Tests\Architecture;

use PHPUnit\Framework\TestCase;

final class AddressBookModuleIsolationContractTest extends TestCase
{
    use ModuleExtractionContractSupport;

    public function testSearchInfrastructureHasNoAddressBookHardcoding(): void
    {
        $searchDir = dirname(__DIR__, 2) . '/core/Support/Search';
        $hits = $this->grepDir($searchDir, '/address.book/i', ['*.php']);

        self::assertSame([], $hits, sprintf(
            "Search infrastructure still contains address-book hardcodings:\n%s",
            implode("\n", $hits)
        ));
    }

    public function testSearchConfigHasNoAddressBookHardcoding(): void
    {
        $file = dirname(__DIR__, 2) . '/core/Support/SearchConfig.php';
        $content = file_get_contents($file);
        self::assertIsString($content);

        self::assertStringNotContainsString('address-book', $content);
        self::assertStringNotContainsString('address_book', $content);
        self::assertStringNotContainsString('addressBook', $content);
    }

    public function testLayoutContextHasNoHardcodedAddressBookBlock(): void
    {
        $file = dirname(__DIR__, 2) . '/core/Support/helpers/app.php';
        $content = file_get_contents($file);
        self::assertIsString($content);

        self::assertDoesNotMatchRegularExpression(
            "/'\s*addressBook\s*'\s*=>\s*\[/",
            $content,
            'appBuildLayoutNavContext() still has hardcoded addressBook array block'
        );
    }

    public function testAsideTemplatesHaveNoHardcodedPeopleUi(): void
    {
        $this->assertFilesDoNotContain(
            [
                dirname(__DIR__, 2) . '/templates/partials/app-main-aside-icon-bar.phtml',
                dirname(__DIR__, 2) . '/templates/partials/app-main-aside.phtml',
            ],
            [
                'aside-tab-people',
                '$canViewAddressBook',
                '$addressBookUrl',
                'id="aside-panel-people"',
                'data-search-key="address-book"',
            ]
        );

        $aside = file_get_contents(dirname(__DIR__, 2) . '/templates/partials/app-main-aside.phtml');
        self::assertIsString($aside);
        self::assertDoesNotMatchRegularExpression('/^\$canViewAddressBook\s*=/m', $aside);
        self::assertDoesNotMatchRegularExpression('/^\$peopleGroups\s*=/m', $aside);
    }

    public function testCoreNoLongerContainsAddressBookServiceDirectory(): void
    {
        $coreServiceDir = dirname(__DIR__, 2) . '/core/Service/AddressBook';
        self::assertDirectoryDoesNotExist(
            $coreServiceDir,
            'Addressbook service classes should live in modules/addressbook/lib, not in core/Service'
        );
    }
}
