<?php

declare(strict_types=1);

namespace App\Tests;

use PHPUnit\Framework\TestCase;
use PHPUnit\Framework\Attributes\CoversClass;
use PHPUnit\Framework\Attributes\DataProvider;
use Psr\Log\LoggerInterface;
use App\App;

#[CoversClass(App::class)]
final class AppTest extends \PHPUnit\Framework\TestCase
{
    public function testNonexistentConfigFile(): void
    {
        $this->expectException(\Exception::class);
        new App('no_file');
        $this->fail('Exception was not thrown');
    }

    public function testGoodConfig(): void
    {
        $app = new App('config.example.yml');
        $this->assertEquals('output.log', $app->getConfig('log'));
        $this->assertInstanceOf(LoggerInterface::class, $app->getLogger());
    }

    public function testBadConfigFileSyntaxError(): void
    {
        $this->expectException(\TypeError::class);

        $app = new App('tests/config/bad/syntaxerror.yml');
        $app->getConfig('rclone');
        $app->getConfig('rclone.path');
        $app->getConfig('backup');
        $app->getConfig('notification');
        $app->getConfig('log');
        $app->getConfig('templates');
        $app->getConfig('templates.notify');
        $app->getConfig('templates.error');

        $this->fail('Exception was not thrown');
    }

    public function testBadConfigFileEmpty(): void
    {
        $this->expectException(\TypeError::class);

        $app = new App('tests/config/bad/empty.yml');
        $app->getConfig('rclone');
        $app->getConfig('rclone.path');
        $app->getConfig('backup');
        $app->getConfig('notification');
        $app->getConfig('log');
        $app->getConfig('templates');
        $app->getConfig('templates.notify');
        $app->getConfig('templates.error');

        $this->fail('Exception was not thrown');
    }

    public function testBadConfigFileTypos(): void
    {
        $this->expectException(\League\Config\Exception\ValidationException::class);

        $app = new App('tests/config/bad/typos.yml');
        $app->getConfig('rclone');
        $app->getConfig('rclone.path');
        $app->getConfig('backup');
        $app->getConfig('notification');
        $app->getConfig('log');
        $app->getConfig('templates');
        $app->getConfig('templates.notify');
        $app->getConfig('templates.error');

        $this->fail('Exception was not thrown');
    }
}