<?php

namespace Tests\Unit\Services\PromptLandingPageEditor;

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

class PublishVersionTest extends TestCase
{
    use RefreshDatabase;

    public function test_it_copies_the_snapshot_to_live_without_creating_a_new_version(): void
    {
        $page = PromptLandingPage::factory()->approved()->create([
            'html' => '<h1>Live</h1>',
            'css' => 'h1 { color: red; }',
            'js' => 'var live = 1;',
        ]);
        PromptLandingPageVersion::factory()->for($page, 'page')->create([
            'version' => 1,
            'html' => '<h1>Live</h1>',
            'css' => 'h1 { color: red; }',
            'js' => 'var live = 1;',
        ]);
        $draft = PromptLandingPageVersion::factory()->draft()->for($page, 'page')->create([
            'version' => 2,
            'html' => '<h1>Draft</h1>',
            'css' => 'h1 { color: blue; }',
            'js' => 'var draft = 1;',
        ]);

        $published = (new PublishVersion)->handle($page, $draft);

        $page->refresh();
        $draft->refresh();

        $this->assertSame('<h1>Draft</h1>', $page->html);
        $this->assertSame('h1 { color: blue; }', $page->css);
        $this->assertSame('var draft = 1;', $page->js);
        $this->assertSame(2, $published['version']);
        $this->assertSame(PromptLandingPageVersionKind::Published->value, $published['kind']);
        $this->assertSame(PromptLandingPageVersionKind::Published, $draft->kind);
        $this->assertSame(2, $page->versions()->count());
    }

    public function test_it_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 PublishVersion)->handle($page, $foreign);
        } catch (HttpException $exception) {
            $this->assertSame(404, $exception->getStatusCode());

            throw $exception;
        }
    }
}
