<?php

namespace Tests\Feature;

use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithFaker;
use Tests\TestCase;

use Tests\Feature\ContentElementsTestTrait;
use Tests\Feature\ContentElementsSearchTestTrait;

use Illuminate\Support\Arr;

use App\Models\ContentElement;
use App\Models\ContentFilter;
use App\Models\User;
use App\Models\Page;

class ContentFilterTest extends TestCase
{
    use WithFaker;
    use ContentElementsTestTrait;
    use ContentElementsSearchTestTrait;

    protected function getClassname()
    {
        return 'content-filter';
    }

    public function test_a_content_filter_content_element_can_be_created()
    {
        $input = $this->createContentElement(ContentFilter::factory())->toArray();
        $input['id'] = 0;
        $input['type'] = 'content-filter';
        $input['content'] = ContentFilter::factory()->raw();
        $page = Page::factory()->create();
        $input['pivot'] = $this->getContentableArray($page);

        $this->json('POST', route('content-elements.store'), [])
            ->assertStatus(401);

        $this->signIn(User::factory()->create());

        $this->json('POST', route('content-elements.store'), [])
             ->assertStatus(422)
             ->assertJsonValidationErrors([
                 'pivot.contentable_id',
                 'pivot.contentable_type',
             ]);

        $this->json('POST', route('content-elements.store'), ['pivot' => ['contentable_id' => $page->id, 'contentable_type' => 'page']])
             ->assertStatus(403);

        $this->signInAdmin();

        $this->json('POST', route('content-elements.store'), ['pivot' => ['contentable_id' => $page->id, 'contentable_type' => 'page']])
             ->assertStatus(422)
             ->assertJsonValidationErrors([
                 'type',
             ]);

        $this->json('POST', route('content-elements.store'), ['type' => 'content-filter', 'pivot' => ['contentable_id' => $page->id, 'contentable_type' => 'page']])
             ->assertStatus(422)
             ->assertJsonValidationErrors([
                'content',
                'pivot.sort_order',
                'pivot.unlisted',
                //'pivot.expandable',
                'pivot.guest',
                'pivot.no_margin',
                'pivot.randomize',
                'pivot.filter',
                'pivot.hide_print',
             ]);


        $this->withoutExceptionHandling();
        $this->json('POST', route('content-elements.store'), $input)
             ->assertSuccessful()
             ->assertJsonFragment([
                'success' => 'Content Filter Saved',
                'contentable_id' => $page->id,
                'sort_order' => 1,
                'unlisted' => 0,
                'expandable' => null,
                'guest' => 0,
                'no_margin' => 0,
                'randomize' => 0,
                'filter' => 0,
                'hide_print' => 0,
             ]);

        $page->refresh();
        $content_filter = ContentFilter::all()->last();

        $this->assertNotNull($content_filter->header);
        $this->assertNotNull($content_filter->body);
        $this->assertNotNull($content_filter->title);
        $this->assertNotNull($content_filter->subtitle);
        $this->assertNotNull($content_filter->style);

        $this->assertEquals(Arr::get($input, 'content.header'), $content_filter->header);
        $this->assertEquals(Arr::get($input, 'content.body'), $content_filter->body);
        $this->assertEquals(Arr::get($input, 'content.style'), $content_filter->style);
        $this->assertEquals(Arr::get($input, 'content.multiple'), $content_filter->multiple);
        $this->assertEquals(Arr::get($input, 'content.title'), $content_filter->title);
        $this->assertEquals(Arr::get($input, 'content.subtitle'), $content_filter->subtitle);

        $this->assertEquals($page->id, $content_filter->contentElement->pages->first()->id);
        $this->assertTrue($page->contentElements()->count() > 0);
        $this->assertTrue($page->contentElements()->get()->contains('uuid', $content_filter->contentElement->uuid));

        $pivot = $page->contentElements()->where('content_element_id', $content_filter->contentElement->id)->first()->pivot;
        $this->assertEquals(1, $pivot->sort_order);
        $this->assertEquals(0, $pivot->unlisted);
        $this->assertNull($pivot->expandable);
        $this->assertEquals(0, $pivot->guest);
        $this->assertEquals(0, $pivot->no_margin);
        $this->assertEquals(0, $pivot->randomize);
        $this->assertEquals(0, $pivot->hide_print);
    }
}
