<?php

namespace Tests\Unit;

use Illuminate\Foundation\Testing\WithFaker;
use Illuminate\Support\Str;

use App\Models\Page;
use App\Models\User;

trait FieldLinkTestTrait
{
    use WithFaker;
    abstract protected function getModel();
    abstract protected function getLinkFields();

    public function test_if_a_page_is_displayed_in_the_front_end_we_convert_page_id_links_to_full_slugs()
    {
        $this->signIn(User::factory()->create());
        $content = $this->getModel();
        $page1 = Page::factory()->create();
        $page2 = Page::factory()->create();
        $page3 = Page::factory()->create();
        $page1->publish();
        $page2->publish();
        $page3->publish();

        //$this->assertNotNull($page1->full_slug);

        foreach ($this->getLinkFields() as $link_field) {
            $body = '<p>'.$this->faker->sentence.' <a href="'.$page1->id.'" >'.$page1->version->name.'</a></p>';
            $body .= '<p>'.$this->faker->sentence.' <a href="'.$page2->id.'" >'.$page2->version->name.'</a></p>';
            $body .= '<p>'.$this->faker->sentence.' <a href="'.$page3->id.'" >'.$page3->version->name.'</a></p>';

            $content->{$link_field} = $body;
            $content->save();

            $content->refresh();

            $this->enableEditing();
            $this->assertTrue(editing());

            $this->assertTrue(Str::contains($content->{$link_field}, 'href="'.$page1->id.'"'));
            $this->assertFalse(Str::contains($content->{$link_field}, 'href="/'.$page1->full_slug.'"'));
            $this->assertTrue(Str::contains($content->{$link_field}, 'href="'.$page2->id.'"'));
            $this->assertFalse(Str::contains($content->{$link_field}, 'href="/'.$page2->full_slug.'"'));
            $this->assertTrue(Str::contains($content->{$link_field}, 'href="'.$page3->id.'"'));
            $this->assertFalse(Str::contains($content->{$link_field}, 'href="/'.$page3->full_slug.'"'));

            $this->disableEditing();
            $this->assertFalse(editing());

            // if not editing, the links should be parsed for the frontend
            $this->assertFalse(Str::contains($content->{$link_field}, 'href="'.$page1->id.'"'));
            $this->assertTrue(Str::contains($content->{$link_field}, 'href="/'.$page1->full_slug.'"'));
            $this->assertFalse(Str::contains($content->{$link_field}, 'href="'.$page2->id.'"'));
            $this->assertTrue(Str::contains($content->{$link_field}, 'href="/'.$page2->full_slug.'"'));
            $this->assertFalse(Str::contains($content->{$link_field}, 'href="'.$page3->id.'"'));
            $this->assertTrue(Str::contains($content->{$link_field}, 'href="/'.$page3->full_slug.'"'));
        }
    }
}
