<?php

namespace Tests\Feature;

use App\Enums\LandingPageLayoutMode;
use App\Enums\LandingPageVersion;
use App\Models\LandingPage;
use App\Models\LandingPageGeneration;
use App\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;

class CatalogLandingPagePublishTest extends TestCase
{
    use RefreshDatabase;

    public function test_only_the_published_page_is_publicly_servable(): void
    {
        $generation = LandingPageGeneration::factory()
            ->catalog()
            ->withPartnerWebsite()
            ->withAffiliateTracking()
            ->for(User::factory())
            ->create([
                'layout_mode' => LandingPageLayoutMode::Catalog,
            ]);

        $published = LandingPage::factory()
            ->for($generation, 'generation')
            ->completed()
            ->create([
                'version' => LandingPageVersion::Benefits,
            ]);

        $draft = LandingPage::factory()
            ->for($generation, 'generation')
            ->completed()
            ->create([
                'version' => LandingPageVersion::Comparison,
            ]);

        $generation->update([
            'published_landing_page_id' => $published->id,
            'published_at' => now(),
        ]);

        $this->assertTrue($published->fresh(['generation'])->isPubliclyServable());
        $this->assertFalse($draft->fresh(['generation'])->isPubliclyServable());
    }

    public function test_publish_action_sets_the_live_page(): void
    {
        $user = User::factory()->create();
        $generation = LandingPageGeneration::factory()
            ->catalog()
            ->withPartnerWebsite()
            ->withAffiliateTracking()
            ->for($user)
            ->create([
                'layout_mode' => LandingPageLayoutMode::Catalog,
            ]);

        $page = LandingPage::factory()
            ->for($generation, 'generation')
            ->completed()
            ->create([
                'version' => LandingPageVersion::Benefits,
                'template' => 'template-1',
                'theme' => 'amazon',
            ]);

        $this->actingAs($user)
            ->patch(route('catalog-landing-pages.publish', [$generation, $page]))
            ->assertRedirect();

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

        $this->assertSame($page->id, $generation->published_landing_page_id);
        $this->assertSame($page->partnerPreviewUrl() ?? $page->publicUrl(), $generation->primaryLiveUrl());
    }

    public function test_unpublished_pages_return_404_on_the_public_route(): void
    {
        $generation = LandingPageGeneration::factory()
            ->catalog()
            ->withPartnerWebsite()
            ->withAffiliateTracking()
            ->for(User::factory())
            ->create([
                'layout_mode' => LandingPageLayoutMode::Catalog,
            ]);

        $page = LandingPage::factory()
            ->for($generation, 'generation')
            ->completed()
            ->create([
                'version' => LandingPageVersion::Benefits,
            ]);

        $this->get(route('public-prompt-landing-pages.show', [
            'domain' => $generation->publicHost(),
            'purpose' => $page->purposeSlug(),
            'landing_page' => $page->id,
        ]))->assertNotFound();
    }
}
