<?php

namespace Engelsystem\Test\Unit;

use Engelsystem\Models\Faq;
use Engelsystem\Models\Message;
use Engelsystem\Models\News;
use Engelsystem\Models\NewsComment;
use Engelsystem\Models\Question;
use Engelsystem\Models\Room;
use Engelsystem\Models\Shifts\Schedule;
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\Worklog;
use Illuminate\Database\Eloquent\Model;

class FactoriesTest extends TestCase
{
    use HasDatabase;

    /** @var string[] */
    protected array $models = [
        Contact::class,
        Faq::class,
        License::class,
        Message::class,
        News::class,
        NewsComment::class,
        PasswordReset::class,
        PersonalData::class,
        Question::class,
        Room::class,
        Schedule::class,
        Settings::class,
        State::class,
        User::class,
        Worklog::class,
    ];

    /**
     * Test all existing model factories
     *
     * @covers \Database\Factories\Engelsystem\Models\User\ContactFactory
     * @covers \Database\Factories\Engelsystem\Models\FaqFactory
     * @covers \Database\Factories\Engelsystem\Models\User\LicenseFactory
     * @covers \Database\Factories\Engelsystem\Models\MessageFactory
     * @covers \Database\Factories\Engelsystem\Models\NewsFactory
     * @covers \Database\Factories\Engelsystem\Models\NewsCommentFactory
     * @covers \Database\Factories\Engelsystem\Models\User\PasswordResetFactory
     * @covers \Database\Factories\Engelsystem\Models\User\PersonalDataFactory
     * @covers \Database\Factories\Engelsystem\Models\QuestionFactory
     * @covers \Database\Factories\Engelsystem\Models\RoomFactory
     * @covers \Database\Factories\Engelsystem\Models\Shifts\ScheduleFactory
     * @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
     */
    public function testFactories(): void
    {
        $this->initDatabase();

        foreach ($this->models as $model) {
            $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);
    }
}