<?php

declare(strict_types=1);

namespace Engelsystem\Test\Unit;

use Engelsystem\Models\AngelType;
use Engelsystem\Models\Faq;
use Engelsystem\Models\Group;
use Engelsystem\Models\Message;
use Engelsystem\Models\News;
use Engelsystem\Models\NewsComment;
use Engelsystem\Models\OAuth;
use Engelsystem\Models\Privilege;
use Engelsystem\Models\Question;
use Engelsystem\Models\Location;
use Engelsystem\Models\Session;
use Engelsystem\Models\Shifts\NeededAngelType;
use Engelsystem\Models\Shifts\Schedule;
use Engelsystem\Models\Shifts\Shift;
use Engelsystem\Models\Shifts\ShiftEntry;
use Engelsystem\Models\Shifts\ShiftType;
use Engelsystem\Models\User\Contact;
use Engelsystem\Models\User\License;
use Engelsystem\Models\User\PasswordReset;
use Engelsystem\Models\User\PersonalData;
use Engelsystem\Models\User\Settings;
use Engelsystem\Models\User\State;
use Engelsystem\Models\User\User;
use Engelsystem\Models\UserAngelType;
use Engelsystem\Models\Worklog;
use Illuminate\Database\Eloquent\Model;

class FactoriesTest extends TestCase
{
    use HasDatabase;

    /**
     * @return string[][]
     */
    public function factoriesProvider(): array
    {
        return [
            [AngelType::class],
            [Contact::class],
            [Faq::class],
            [Group::class],
            [License::class],
            [Location::class],
            [Message::class],
            [NeededAngelType::class],
            [News::class],
            [NewsComment::class],
            [OAuth::class],
            [PasswordReset::class],
            [PersonalData::class],
            [Privilege::class],
            [Question::class],
            [Schedule::class],
            [Session::class],
            [Settings::class],
            [Shift::class],
            [ShiftEntry::class],
            [ShiftType::class],
            [State::class],
            [UserAngelType::class],
            [User::class],
            [Worklog::class],
        ];
    }

    /**
     * Test all model factories
     *
     * @covers       \Database\Factories\Engelsystem\Models\AngelTypeFactory
     * @covers       \Database\Factories\Engelsystem\Models\FaqFactory
     * @covers       \Database\Factories\Engelsystem\Models\GroupFactory
     * @covers       \Database\Factories\Engelsystem\Models\LocationFactory
     * @covers       \Database\Factories\Engelsystem\Models\MessageFactory
     * @covers       \Database\Factories\Engelsystem\Models\NewsCommentFactory
     * @covers       \Database\Factories\Engelsystem\Models\NewsFactory
     * @covers       \Database\Factories\Engelsystem\Models\OAuthFactory
     * @covers       \Database\Factories\Engelsystem\Models\PrivilegeFactory
     * @covers       \Database\Factories\Engelsystem\Models\QuestionFactory
     * @covers       \Database\Factories\Engelsystem\Models\SessionFactory
     * @covers       \Database\Factories\Engelsystem\Models\Shifts\NeededAngelTypeFactory
     * @covers       \Database\Factories\Engelsystem\Models\Shifts\ScheduleFactory
     * @covers       \Database\Factories\Engelsystem\Models\Shifts\ShiftEntryFactory
     * @covers       \Database\Factories\Engelsystem\Models\Shifts\ShiftFactory
     * @covers       \Database\Factories\Engelsystem\Models\Shifts\ShiftTypeFactory
     * @covers       \Database\Factories\Engelsystem\Models\UserAngelTypeFactory
     * @covers       \Database\Factories\Engelsystem\Models\User\ContactFactory
     * @covers       \Database\Factories\Engelsystem\Models\User\LicenseFactory
     * @covers       \Database\Factories\Engelsystem\Models\User\PasswordResetFactory
     * @covers       \Database\Factories\Engelsystem\Models\User\PersonalDataFactory
     * @covers       \Database\Factories\Engelsystem\Models\User\SettingsFactory
     * @covers       \Database\Factories\Engelsystem\Models\User\StateFactory
     * @covers       \Database\Factories\Engelsystem\Models\User\UserFactory
     * @covers       \Database\Factories\Engelsystem\Models\WorklogFactory
     *
     * @dataProvider factoriesProvider
     */
    public function testFactories(string $model): void
    {
        $this->initDatabase();

        $instance = (new $model())->factory()->create();
        $this->assertInstanceOf(Model::class, $instance);
    }

    /**
     * @covers \Database\Factories\Engelsystem\Models\User\StateFactory
     */
    public function testStateFactoryArrived(): void
    {
        $this->initDatabase();

        /** @var State $instance */
        $instance = (new State())->factory()->arrived()->create();
        $this->assertInstanceOf(Model::class, $instance);
        $this->assertTrue($instance->arrived);
    }
}
