<?php

/**
 * @copyright  2021 Podlibre
 * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
 * @link       https://castopod.org/
 */

namespace ActivityPub\Models;

use CodeIgniter\Database\BaseResult;
use ActivityPub\Entities\PreviewCard;
use CodeIgniter\Model;

class PreviewCardModel extends Model
{
    /**
     * @var string
     */
    protected $table = 'activitypub_preview_cards';

    /**
     * @var string[]
     */
    protected $allowedFields = [
        'id',
        'url',
        'title',
        'description',
        'type',
        'author_name',
        'author_url',
        'provider_name',
        'provider_url',
        'image',
        'html',
    ];

    /**
     * @var string
     */
    protected $returnType = PreviewCard::class;

    /**
     * @var bool
     */
    protected $useSoftDeletes = false;

    /**
     * @var bool
     */
    protected $useTimestamps = true;

    public function getPreviewCardFromUrl(string $url): ?PreviewCard
    {
        $hashedPreviewCardUrl = md5($url);
        $cacheName =
            config('ActivityPub')->cachePrefix .
            "preview_card-{$hashedPreviewCardUrl}";
        if (!($found = cache($cacheName))) {
            $found = $this->where('url', $url)->first();
            cache()->save($cacheName, $found, DECADE);
        }

        return $found;
    }

    public function getNotePreviewCard(string $noteId): ?PreviewCard
    {
        $cacheName =
            config('ActivityPub')->cachePrefix . "note#{$noteId}_preview_card";
        if (!($found = cache($cacheName))) {
            $found = $this->join(
                'activitypub_notes_preview_cards',
                'activitypub_notes_preview_cards.preview_card_id = id',
                'inner',
            )
                ->where(
                    'note_id',
                    service('uuid')
                        ->fromString($noteId)
                        ->getBytes(),
                )
                ->first();

            cache()->save($cacheName, $found, DECADE);
        }

        return $found;
    }

    public function deletePreviewCard(int $id, string $url): BaseResult|bool
    {
        $hashedPreviewCardUrl = md5($url);
        cache()->delete(
            config('ActivityPub')->cachePrefix .
                "preview_card-{$hashedPreviewCardUrl}",
        );

        return $this->delete($id);
    }
}