<?php

namespace Tests\Actions;

use BookStack\Actions\ActivityType;
use BookStack\Actions\Webhook;
use BookStack\Actions\WebhookFormatter;
use BookStack\Entities\Models\Book;
use BookStack\Entities\Models\Chapter;
use BookStack\Entities\Models\Page;
use Illuminate\Support\Arr;
use Tests\TestCase;

class WebhookFormatTesting extends TestCase
{
    public function test_entity_events_show_related_user_info()
    {
        $events = [
            ActivityType::BOOK_UPDATE    => Book::query()->first(),
            ActivityType::CHAPTER_CREATE => Chapter::query()->first(),
            ActivityType::PAGE_MOVE      => Page::query()->first(),
        ];

        foreach ($events as $event => $entity) {
            $data = $this->getWebhookData($event, $entity);

            $this->assertEquals($entity->createdBy->name, Arr::get($data, 'related_item.created_by.name'));
            $this->assertEquals($entity->updatedBy->id, Arr::get($data, 'related_item.updated_by.id'));
            $this->assertEquals($entity->ownedBy->slug, Arr::get($data, 'related_item.owned_by.slug'));
        }
    }

    public function test_page_create_and_update_events_show_revision_info()
    {
        /** @var Page $page */
        $page = Page::query()->first();
        $this->asEditor()->put($page->getUrl(), ['name' => 'Updated page', 'html' => 'new page html', 'summary' => 'Update a']);

        $data = $this->getWebhookData(ActivityType::PAGE_UPDATE, $page);
        $this->assertEquals($page->currentRevision->id, Arr::get($data, 'related_item.current_revision.id'));
        $this->assertEquals($page->currentRevision->type, Arr::get($data, 'related_item.current_revision.type'));
        $this->assertEquals('Update a', Arr::get($data, 'related_item.current_revision.summary'));
    }

    protected function getWebhookData(string $event, $detail): array
    {
        $webhook = Webhook::factory()->make();
        $user = $this->getEditor();
        $formatter = WebhookFormatter::getDefault($event, $webhook, $detail, $user, time());

        return $formatter->format();
    }
}
