<?php

namespace Tests\Unit\Services\PromptLandingPageEditor;

use App\Enums\PromptLandingPageVersionKind;
use App\Models\PromptLandingPage;
use App\Models\PromptLandingPageVersion;
use App\Services\PromptLandingPageEditor\RecordPublishedVersion;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;

class RecordPublishedVersionTest extends TestCase
{
    use RefreshDatabase;

    public function test_ensure_original_stores_the_live_page_as_published_version_one(): void
    {
        $page = PromptLandingPage::factory()->approved()->create([
            'html' => '<h1>Prompted</h1>',
            'css' => 'h1 { color: navy; }',
            'js' => 'var live = 1;',
        ]);

        $version = (new RecordPublishedVersion)->ensureOriginal($page);

        $this->assertNotNull($version);
        $this->assertSame(1, $version->version);
        $this->assertSame(PromptLandingPageVersionKind::Published, $version->kind);
        $this->assertSame('<h1>Prompted</h1>', $version->html);
        $this->assertSame(1, $page->versions()->count());
    }

    public function test_ensure_original_does_not_replace_an_existing_version_one(): void
    {
        $page = PromptLandingPage::factory()->approved()->create([
            'html' => '<h1>Current live</h1>',
        ]);
        PromptLandingPageVersion::factory()->for($page, 'page')->create([
            'version' => 1,
            'kind' => PromptLandingPageVersionKind::Published,
            'html' => '<h1>First prompted page</h1>',
        ]);

        (new RecordPublishedVersion)->ensureOriginal($page);

        $this->assertSame(1, $page->versions()->count());
        $this->assertSame('<h1>First prompted page</h1>', $page->versions()->where('version', 1)->value('html'));
    }

    public function test_snapshot_live_adds_a_published_version_when_the_live_page_changed(): void
    {
        $page = PromptLandingPage::factory()->approved()->create([
            'html' => '<h1>Revised live</h1>',
            'css' => 'h1 { color: green; }',
            'js' => '',
        ]);
        PromptLandingPageVersion::factory()->for($page, 'page')->create([
            'version' => 1,
            'kind' => PromptLandingPageVersionKind::Published,
            'html' => '<h1>First prompted page</h1>',
            'css' => 'h1 { color: navy; }',
            'js' => '',
        ]);

        $snapshot = (new RecordPublishedVersion)->snapshotLive($page);

        $this->assertSame(2, $snapshot?->version);
        $this->assertSame(PromptLandingPageVersionKind::Published, $snapshot?->kind);
        $this->assertSame('<h1>Revised live</h1>', $snapshot?->html);
        $this->assertSame('<h1>First prompted page</h1>', $page->versions()->where('version', 1)->value('html'));
    }

    public function test_a_draft_that_stole_version_one_is_shifted_so_the_live_page_can_be_original(): void
    {
        $page = PromptLandingPage::factory()->approved()->create([
            'html' => '<h1>Prompted</h1>',
            'css' => 'h1 { color: navy; }',
            'js' => '',
        ]);
        PromptLandingPageVersion::factory()->draft()->for($page, 'page')->create([
            'version' => 1,
            'html' => '<h1>Draft</h1>',
        ]);

        (new RecordPublishedVersion)->ensureOriginal($page);

        $this->assertDatabaseHas('prompt_landing_page_versions', [
            'prompt_landing_page_id' => $page->id,
            'version' => 1,
            'kind' => PromptLandingPageVersionKind::Published->value,
            'html' => '<h1>Prompted</h1>',
        ]);
        $this->assertDatabaseHas('prompt_landing_page_versions', [
            'prompt_landing_page_id' => $page->id,
            'version' => 2,
            'kind' => PromptLandingPageVersionKind::Draft->value,
            'html' => '<h1>Draft</h1>',
        ]);
    }
}
