<?php

declare(strict_types=1);
error_reporting(E_ALL);
ini_set('display_errors', 1);


use Lewisdale\Webmentions\Gateways\SqliteGateway;
use Lewisdale\Webmentions\Models\MentionType;
use Lewisdale\Webmentions\Models\Webmention;
use PHPUnit\Framework\TestCase;

class SqliteGatewayTest extends TestCase
{
    private SqliteGateway $gateway;

    protected function setUp(): void
    {
        $this->gateway = new SqliteGateway(":memory:");
    }

    public function testCanInsertAWebmention()
    {

        $webmention = new Webmention(
            null,
            "https://lewisdale.dev/post/a-post",
            "https://a-source.url",
            MentionType::Like,
            "No content",
            new \Lewisdale\Webmentions\Models\Author(),
        );

        $webmention->id = $this->gateway->save($webmention);
        $this->assertNotNull($webmention->id);
    }

    public function testCanRetrieveAWebmention()
    {
        $webmention = new Webmention(
            null,
            "https://lewisdale.dev/post/a-post",
            "https://a-source.url",
            MentionType::Like,
            "No content",
            new \Lewisdale\Webmentions\Models\Author(),
        );

        $webmention->id = $this->gateway->save($webmention);

        $retrieved = $this->gateway->get($webmention->id);

        $this->assertEquals($webmention, $retrieved);
    }

    public function testCanDeleteAWebmention()
    {
        $webmention = new Webmention(
            null,
            "https://lewisdale.dev/post/a-post",
            "https://a-source.url",
            MentionType::Like,
            "No content",
            new \Lewisdale\Webmentions\Models\Author()
        );

        $webmention->id = $this->gateway->save($webmention);
        $this->gateway->delete($webmention);

        $retrieved = $this->gateway->get($webmention->id);

        $this->assertNull($retrieved);
    }

    public function testCanGetByPost()
    {
        foreach (range(0, 4) as $_) {
            $this->gateway->save(new Webmention(
                null,
                "https://lewisdale.dev/post/a-new-post",
                "https://a-source.url",
                MentionType::Reply,
                "No content",
                new \Lewisdale\Webmentions\Models\Author()
            ));
        }

        foreach (range(0, 4) as $_) {
            $this->gateway->save(new Webmention(
                null,
                "https://lewisdale.dev/post/a-different-post",
                "https://a-source.url",
                MentionType::Like,
                "No content",
                new \Lewisdale\Webmentions\Models\Author()
            ));
        }

        $mentions = $this->gateway->getByPost("https://lewisdale.dev/post/a-new-post");

        $this->assertCount(5, $mentions);
    }

    public function testCanFindByParams()
    {
        $this->gateway->save(new Webmention(
            null,
            "https://lewisdale.dev/post/a-new-post",
            "https://a-source.url",
            MentionType::Reply,
            "No content",
            new \Lewisdale\Webmentions\Models\Author()
        ));

        $this->gateway->save(new Webmention(
            null,
            "https://lewisdale.dev/post/a-new-post",
            "https://a-different-source.url",
            MentionType::Like,
            "No content",
            new \Lewisdale\Webmentions\Models\Author()
        ));

        $this->gateway->save(new Webmention(
            null,
            "https://lewisdale.dev/post/a-new-post",
            "https://a-source.url",
            MentionType::Reply,
            "Some content",
            new \Lewisdale\Webmentions\Models\Author()
        ));

        $this->assertCount(
            2,
            $this->gateway->find([
                "target" => "https://lewisdale.dev/post/a-new-post",
                "source" => "https://a-source.url",
            ])
        );

        $this->assertCount(
            1,
            $this->gateway->find([
                "target" => "https://lewisdale.dev/post/a-new-post",
                "source" => "https://a-different-source.url",
            ])
        );

        $this->assertCount(
            1,
            $this->gateway->find([
                "target" => "https://lewisdale.dev/post/a-new-post",
                "source" => "https://a-source.url",
                "content" => "Some content",
            ])
        );
    }
}