<?php

namespace Tests\Unit\Services\PromptLandingPageEditor;

use App\Enums\PromptLandingPageVersionKind;
use App\Models\PromptLandingPage;
use App\Models\PromptLandingPageVersion;
use App\Services\PromptLandingPageEditor\RestoreVersion;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Symfony\Component\HttpKernel\Exception\HttpException;
use Tests\TestCase;

class RestoreVersionTest extends TestCase
{
    use RefreshDatabase;

    public function test_restore_returns_the_snapshot_without_changing_the_live_page(): void
    {
        $page = PromptLandingPage::factory()->approved()->create([
            'html' => '<h1>Current</h1>',
            'css' => 'h1 { color: red; }',
            'js' => 'var current = 1;',
        ]);
        $version = PromptLandingPageVersion::factory()->draft()->for($page, 'page')->create([
            'version' => 1,
            'html' => '<h1>Original</h1>',
            'css' => 'h1 { color: black; }',
            'js' => 'var original = 1;',
        ]);

        $restored = (new RestoreVersion)->handle($page, $version);

        $page->refresh();

        $this->assertSame('<h1>Original</h1>', $restored['html']);
        $this->assertSame('h1 { color: black; }', $restored['css']);
        $this->assertSame('var original = 1;', $restored['js']);
        $this->assertSame(1, $restored['version']);
        $this->assertSame(PromptLandingPageVersionKind::Draft->value, $restored['kind']);
        $this->assertSame('<h1>Current</h1>', $page->html);
        $this->assertSame('h1 { color: red; }', $page->css);
        $this->assertSame('var current = 1;', $page->js);
        $this->assertSame(1, $page->versions()->count());
    }

    public function test_restore_returns_404_when_the_snapshot_belongs_to_another_page(): void
    {
        $page = PromptLandingPage::factory()->approved()->create();
        $foreign = PromptLandingPageVersion::factory()->create();

        $this->expectException(HttpException::class);

        try {
            (new RestoreVersion)->handle($page, $foreign);
        } catch (HttpException $exception) {
            $this->assertSame(404, $exception->getStatusCode());

            throw $exception;
        }
    }
}
