<?php

namespace Tests\Feature;

use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithFaker;
use Illuminate\Support\Collection;
use Illuminate\Support\Arr;
use Illuminate\Support\Str;
use Tests\TestCase;

use App\Models\Timetable;
use App\Models\TimetableContent;
use App\Models\Tag;
use App\Models\ContentElement;
use App\Models\Page;

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

class TimetableTest extends TestCase
{
    use ContentElementsTestTrait;
    use ContentElementsSearchTestTrait;

    protected function getClassname()
    {
        return 'timetable';
    }

    public function test_a_timetable_can_be_created()
    {
        $tag1 = Tag::factory()->create();
        $tag2 = Tag::factory()->create();

        $page = Page::factory()->create();

        $timetable_input = Timetable::factory()->raw();

        $input = [
            'pivot' => $this->getContentableArray($page),
            'type' => Str::kebab(class_basename(Timetable::class)),
            'content' => array_merge($timetable_input, [
                'tags' => [
                    [ 'id' => $tag1->id, 'pivot' => ['exclude' => false ]],
                    [ 'id' => $tag2->id, 'pivot' => ['exclude' => false ]],
                ]
            ]),
        ];

        $this->signInAdmin();
        $this->enableEditing();

        $this->json('POST', route('content-elements.store'), $input)
             ->assertSuccessful()
             ->assertJsonFragment([
                 'success' => 'Timetable Saved',
             ]);

        $content_element = ContentElement::all()->last();
        $this->assertInstanceOf(ContentElement::class, $content_element);

        $timetable = $content_element->content;

        $this->assertInstanceOf(Timetable::class, $timetable);

        $this->assertNotNull($timetable->hide_links);
        $this->assertEquals(Arr::get($input, 'content.hide_links'), $timetable->hide_links);

        $this->assertEquals($tag1->id, $timetable->tags->first()->id);
        $this->assertNotNull($timetable->tags->first()->pivot);
        $this->assertEquals(0, $timetable->tags->first()->pivot->exclude);

        $this->assertEquals($tag2->id, $timetable->tags->last()->id);
        $this->assertNotNull($timetable->tags->last()->pivot);
        $this->assertEquals(0, $timetable->tags->last()->pivot->exclude);
    }

    public function test_a_timetable_can_be_updated()
    {
        $tag1 = Tag::factory()->create();
        $tag2 = Tag::factory()->create();

        $page = Page::factory()->create();
        $content_element = $this->createContentElement(Timetable::factory(), $page);
        $timetable = $content_element->content;
        $timetable->addTag($tag2);

        $input = $content_element->toArray();
        $input['content'] = array_merge($timetable->toArray(), Timetable::factory()->raw(['hide_links' => true]));
        $input['pivot'] = $this->getContentableArray($page);

        $input['content']['tags'] = [
            [ 'id' => $tag1->id, 'pivot' => ['exclude' => false ]],
            [ 'id' => $tag2->id, 'pivot' => ['exclude' => false ]],
        ];

        $this->signInAdmin();
        $this->enableEditing();

        $this->json('POST', route('content-elements.update', ['id' => $content_element->id]), $input)
             ->assertSuccessful()
             ->assertJsonFragment([
                 'success' => 'Timetable Saved',
             ]);

        $timetable->refresh();

        $this->assertEquals($content_element->id, ContentElement::all()->last()->id);
        $this->assertEquals($timetable->id, Timetable::all()->last()->id);

        $this->assertEquals(Arr::get($input, 'content.hide_links'), $timetable->hide_links);

        $this->assertEquals($tag1->id, $timetable->tags->first()->id);
        $this->assertNotNull($timetable->tags->first()->pivot);
        $this->assertEquals(0, $timetable->tags->first()->pivot->exclude);

        $this->assertEquals($tag2->id, $timetable->tags->last()->id);
        $this->assertNotNull($timetable->tags->last()->pivot);
        $this->assertEquals(0, $timetable->tags->last()->pivot->exclude);
    }

    /*
    public function a_timetable_includes_the_timetable_content()
    {
        $timetable_content = TimetableContent::factory()->create();
        $timetable = Timetable::factory()->create();

        $this->assertNotNull($timetable->content);
        $this->assertInstanceOf(Collection::class, $timetable->content);
        $this->assertTrue($timetable->content->contains('id', $timetable_content->id));

        $timetable->refresh();
        $data = $timetable->toArray();
        $this->assertNotNull( Arr::get($data, 'content'));

    }
     */
}
