<?php

namespace SilverStripe\Tests\ORM\UniqueKey;

use SilverStripe\Core\Injector\Injector;
use SilverStripe\Dev\SapphireTest;
use SilverStripe\ORM\DataObject;

class ServiceTest extends SapphireTest
{
    /**
     * @var array
     */
    protected static $extra_dataobjects = [
        River::class,
        Mountain::class,
    ];

    /**
     * @param int $id
     * @param string $class
     * @param bool $extraKeys
     * @param string $expected
     * @dataProvider uniqueKeysProvider
     */
    public function testUniqueKey(int $id, string $class, bool $extraKeys, string $expected): void
    {
        if ($extraKeys) {
            $class::add_extension(ExtraKeysExtension::class);
        }

        /** @var DataObject $object */
        $object = Injector::inst()->create($class);
        $object->ID = $id;

        $this->assertEquals($expected, $object->getUniqueKey());

        if ($extraKeys) {
            $class::remove_extension(ExtraKeysExtension::class);
        }
    }

    public function uniqueKeysProvider(): array
    {
        return [
            [1, River::class, false, 'River-1-8d3310e232f75a01f5a0c9344655263d'],
            [1, River::class, true, 'River-1-ff2ea6e873a9e28538dd4af278f35e08'],
            [2, River::class, false, 'River-2-c562c31e5c2caaabb124b46e274097c1'],
            [2, River::class, true, 'River-2-410c1eb12697a26742bbe4b059625ab2'],
            [1, Mountain::class, false, 'Mountain-1-93164c0f65fa28778fb75163c1e3e2f0'],
            [1, Mountain::class, true, 'Mountain-1-2daf208e0b89252e5d239fbc0464a517'],
            [2, Mountain::class, false, 'Mountain-2-62366f2b970a64de6f2a8e8654f179d5'],
            [2, Mountain::class, true, 'Mountain-2-a724046b14d331a1486841eaa591d109'],
        ];
    }
}