<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Str;

class CustomEmoji extends Model
{
    use HasFactory;

    const SCAN_RE = "/(?<=[^[:alnum:]:]|\n|^):([a-zA-Z0-9_]{2,}):(?=[^[:alnum:]:]|$)/x";

    const CACHE_KEY = 'pf:custom_emoji:';

    protected $guarded = [];

    public static function scan($text, $activitypub = false)
    {
        if ((bool) config_cache('federation.custom_emoji.enabled') == false) {
            return [];
        }

        return Str::of($text)
            ->matchAll(self::SCAN_RE)
            ->map(function ($match) use ($activitypub) {
                $tag = Cache::remember(self::CACHE_KEY.$match, 14400, function () use ($match) {
                    return self::orderBy('id')->whereDisabled(false)->whereShortcode(':'.$match.':')->first();
                });

                if ($tag) {
                    $url = url('/storage/'.$tag->media_path);

                    if ($activitypub == true) {
                        $mediaType = Str::endsWith($url, '.png') ? 'image/png' : 'image/jpg';

                        return [
                            'id' => url('emojis/'.$tag->id),
                            'type' => 'Emoji',
                            'name' => $tag->shortcode,
                            'updated' => $tag->updated_at->toAtomString(),
                            'icon' => [
                                'type' => 'Image',
                                'mediaType' => $mediaType,
                                'url' => $url,
                            ],
                        ];
                    } else {
                        return [
                            'shortcode' => $match,
                            'url' => $url,
                            'static_url' => $url,
                            'visible_in_picker' => $tag->disabled == false,
                        ];
                    }
                }
            })
            ->filter(function ($tag) use ($activitypub) {
                if ($activitypub == true) {
                    return $tag && isset($tag['icon']);
                } else {
                    return $tag && isset($tag['static_url']);
                }
            })
            ->values()
            ->toArray();
    }
}
