<?php

namespace Tests\Traits;

use App\Console\Kernel;
use App\Models\User;
use Illuminate\Contracts\Console\Kernel as Artisan;
use Illuminate\Foundation\Application;
use Illuminate\Support\Facades\DB;
use Tests\TestCase;

use function Tests\test_path;

trait CreatesApplication
{
    protected string $mediaPath;
    protected string $baseUrl = 'http://localhost';
    public static bool $migrated = false;

    public function createApplication(): Application
    {
        /** @var Application $app */
        $app = require __DIR__ . '/../../bootstrap/app.php';

        $this->mediaPath = test_path('songs');

        /** @var Kernel $artisan */
        $artisan = $app->make(Artisan::class);

        $artisan->bootstrap();

        // Unless the DB is stored in memory, we need to migrate the DB only once for the whole test suite.
        if (!TestCase::$migrated || DB::connection()->getDatabaseName() === ':memory:') {
            $artisan->call('migrate');

            if (!User::query()->count()) {
                $artisan->call('db:seed');
            }

            TestCase::$migrated = true;
        }

        return $app;
    }
}