import assert from 'node:assert/strict';
import { test } from 'node:test';
import { isJumbo, segmentEmoji, twemojiUrl } from '../src/lib/twemoji.ts';

const emojiOf = (text: string) => segmentEmoji(text).filter((s) => s.emoji).map((s) => s.text);

test('plain text takes the fast path', () => {
  assert.deepEqual(segmentEmoji('hello world 123 #1 *'), [{ text: 'hello world 123 #1 *', emoji: false }]);
});

test('splits text and emoji', () => {
  assert.deepEqual(segmentEmoji('hi 🎉 there'), [
    { text: 'hi ', emoji: false },
    { text: '🎉', emoji: true },
    { text: ' there', emoji: false }
  ]);
});

test('keeps ZWJ sequences whole', () => {
  assert.deepEqual(emojiOf('a 👩‍💻 b 👨‍👩‍👧‍👦'), ['👩‍💻', '👨‍👩‍👧‍👦']);
});

test('keeps skin tones whole', () => {
  assert.deepEqual(emojiOf('👍🏽'), ['👍🏽']);
});

test('treats a regional indicator pair as one flag', () => {
  assert.deepEqual(emojiOf('🇳🇿 and 🇯🇵'), ['🇳🇿', '🇯🇵']);
});

test('keycaps need FE0F and 20E3', () => {
  assert.deepEqual(emojiOf('1️⃣ #️⃣'), ['1️⃣', '#️⃣']);
  assert.deepEqual(emojiOf('1 # *'), []);
});

test('text presentation symbols stay text without FE0F', () => {
  assert.deepEqual(emojiOf('© ® ☺'), []);
  assert.deepEqual(emojiOf('☺️'), ['☺️']);
});

test('jumbo only for one to three emoji', () => {
  assert.equal(isJumbo(segmentEmoji('🎉')), true);
  assert.equal(isJumbo(segmentEmoji('🎉 🎉🎉')), true);
  assert.equal(isJumbo(segmentEmoji('🎉🎉🎉🎉')), false);
  assert.equal(isJumbo(segmentEmoji('hi 🎉')), false);
  assert.equal(isJumbo(segmentEmoji('hello')), false);
});

test('twemojiUrl follows the filename rule', () => {
  assert.equal(twemojiUrl('🎉'), '/twemoji/1f389.svg');
  assert.equal(twemojiUrl('❤️'), '/twemoji/2764.svg');
  assert.equal(twemojiUrl('👨‍⚕️'), '/twemoji/1f468-200d-2695-fe0f.svg');
  assert.equal(twemojiUrl('1️⃣'), '/twemoji/31-20e3.svg');
});
