<?php

declare(strict_types=1);

use App\Application\Service\QrCodeService;
use App\Domain\QrCode\Exception\QrCodeException;
use App\Domain\QrCode\QrCode;
use App\Domain\QrCode\ValueObject\ErrorCorrectionLevel;
use App\Domain\QrCode\ValueObject\QrCodeVersion;

test('QR-Code kann mit grundlegenden Daten erstellt werden', function () {
    $qrCode = new QrCode('Hallo Welt');

    expect($qrCode->getData())->toBe('Hallo Welt');
    expect($qrCode->getErrorCorrectionLevel())->toBe(ErrorCorrectionLevel::M);
});

test('QR-Code wirft eine Exception bei leeren Daten', function () {
    expect(fn () => new QrCode(''))->toThrow(QrCodeException::class);
});

test('QR-Code kann als SVG generiert werden', function () {
    $service = new QrCodeService();
    $svg = $service->generateSvg('Test');

    expect($svg)->toContain('<svg');
    expect($svg)->toContain('</svg>');
    expect($svg)->toContain('fill="black"');
});

test('QR-Code kann als PNG generiert werden', function () {
    $service = new QrCodeService();
    $png = $service->generatePng('Test');

    expect($png)->toStartWith("\x89PNG");
});

test('QR-Code kann als ASCII-Art generiert werden', function () {
    $service = new QrCodeService();
    $ascii = $service->generateAscii('Test');

    expect($ascii)->toBeString();
    expect(strlen($ascii))->toBeGreaterThan(100);
});

test('Fehlerkorrekturlevel beeinflusst die Generierung', function () {
    $service = new QrCodeService();

    $lowMatrix = $service->generateQrCode('Test', ErrorCorrectionLevel::L);
    $highMatrix = $service->generateQrCode('Test', ErrorCorrectionLevel::H);

    expect($lowMatrix->getSize())->toBeGreaterThan(0);
    expect($highMatrix->getSize())->toBeGreaterThan(0);
});

test('QR-Code-Version bestimmt die Größe', function () {
    $version1 = new QrCodeVersion(1);
    $version10 = new QrCodeVersion(10);

    expect($version1->getSize())->toBe(21);
    expect($version10->getSize())->toBe(57);
});
