<?php

namespace Tests\Unit\Services\PromptLandingPageEditor;

use App\Enums\PromptLandingPageVersionKind;
use App\Models\PromptLandingPage;
use App\Models\User;
use App\Services\PromptLandingPageEditor\MergeEditedDocument;
use App\Services\PromptLandingPageEditor\RecordPublishedVersion;
use App\Services\PromptLandingPageEditor\SanitizeDocument;
use App\Services\PromptLandingPageEditor\SaveDraft;
use App\Services\PromptLandingPageEditor\UniqueDuplicateIds;
use App\Services\PromptLandingPageHtmlSanitizer;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;

class SaveDraftTest extends TestCase
{
    use RefreshDatabase;

    public function test_save_draft_stores_a_draft_version_without_changing_the_live_page(): void
    {
        $user = User::factory()->create();
        $page = PromptLandingPage::factory()->approved()->for($user)->create([
            'html' => '<h1>Live</h1>',
            'css' => 'h1 { color: black; }',
            'js' => 'var live = 1;',
        ]);

        $saved = $this->saveDraft()->handle($page, $user, '<h1>Draft</h1>', 'h1 { color: red; }', 'var live = 1;');

        $page->refresh();

        $this->assertSame('<h1>Live</h1>', $page->html);
        $this->assertSame('h1 { color: black; }', $page->css);
        $this->assertSame('var live = 1;', $page->js);
        $this->assertNull($page->editorDraft);
        $this->assertSame(2, $page->versions()->count());
        $this->assertSame(2, $saved['version']);
        $this->assertSame(PromptLandingPageVersionKind::Draft->value, $saved['kind']);
        $this->assertDatabaseHas('prompt_landing_page_versions', [
            'prompt_landing_page_id' => $page->id,
            'version' => 1,
            'kind' => PromptLandingPageVersionKind::Published->value,
            'html' => '<h1>Live</h1>',
        ]);
        $this->assertDatabaseHas('prompt_landing_page_versions', [
            'prompt_landing_page_id' => $page->id,
            'version' => 2,
            'kind' => PromptLandingPageVersionKind::Draft->value,
            'html' => '<h1>Draft</h1>',
        ]);
    }

    private function saveDraft(): SaveDraft
    {
        return new SaveDraft(
            new SanitizeDocument(new PromptLandingPageHtmlSanitizer),
            new UniqueDuplicateIds,
            new MergeEditedDocument,
            new RecordPublishedVersion,
        );
    }
}
