import { beforeEach, describe, expect, it, vi } from 'vitest';

import {
  extractClipMetadata,
  extractPlaylistMetadata,
  extractProfileMetadata,
} from '@/utils/embeds';

describe('OpenGraph embeds', () => {
  beforeEach(() => {
    vi.clearAllMocks();
  });

  it('song embed', async () => {
    const clip = {
      id: 'ac1bfc88-6a7a-4085-ba49-fad0068ee0d0',
      title: 'Test Song',
      audio_url: 'https://cdn1.suno.ai/audio.mp3',
      video_url: 'https://cdn1.suno.ai/video.mp4',
      image_url: 'https://cdn1.suno.ai/suno-square.jpg',
      image_large_url: 'https://cdn1.suno.ai/image_large.png',
      avatar_image_url: 'https://cdn1.suno.ai/image_large.png',
      metadata: {},
      model_name: 'v3',
      major_model_version: '3',
      display_name: 'Test User',
      handle: 'testuser',
      is_handle_updated: true,
      is_liked: true,
      is_trashed: false,
      reaction: {} as any,
      created_at: '',
      user_id: '234456',
    };
    const md = extractClipMetadata(clip);
    expect(md).toEqual({
      title: 'Test Song by Test User | Suno',
      description:
        'Test Song by Test User (@testuser). Listen and make your own on Suno.',
      metadataBase: new URL('https://cdn1.suno.ai'),
      alternates: {
        canonical: '//song/ac1bfc88-6a7a-4085-ba49-fad0068ee0d0',
        types: {
          'application/json+oembed': `https://studio-api.prod.suno.com/api/oembed?url=%2F%2Fsong%2Fac1bfc88-6a7a-4085-ba49-fad0068ee0d0`,
        },
      },
      openGraph: {
        audio: [
          {
            url: 'https://cdn1.suno.ai/audio.mp3',
            type: 'audio/mpeg',
          },
        ],
        images: [
          {
            height: 256,
            type: 'image/png',
            url: 'https://cdn1.suno.ai/suno-square.jpg',
            width: 256,
          },
        ],
        type: 'music.song',
        title: 'Test Song',
        description: 'Listen and make your own on Suno.',
      },
      twitter: {
        card: 'player',
        description: 'Listen and make your own on Suno.',
        images: [
          {
            url: 'https://cdn1.suno.ai/suno-square.jpg',
          },
        ],
        players: {
          height: 240,
          playerUrl: '//embed/ac1bfc88-6a7a-4085-ba49-fad0068ee0d0',
          streamUrl: 'https://cdn1.suno.ai/audio.mp3',
          width: 760,
        },
        site: '@suno_ai_',
        title: 'Test Song',
      },
    });
  });

  it('profile embed', async () => {
    const profile = {
      clips: [
        {
          id: 'aaa-bbb-ccc',
          title: 'Test Song',
          audio_url: 'https://cdn1.suno.ai/audio.mp3',
          image_url: 'https://cdn1.suno.ai/suno-square.jpg',
          user_id: '234456',
        },
      ],
      display_name: 'Test User',
      handle: 'testuser',
      profile_description: 'I am a test user',
      avatar_image: null,
      user_id: 234456,
    };
    const md = extractProfileMetadata(profile);
    expect(md).toEqual({
      metadataBase: new URL('https://cdn1.suno.ai'),
      description: 'I am a test user',
      alternates: {
        canonical: '//@testuser',
      },
      openGraph: {
        audio: ['https://cdn1.suno.ai/audio.mp3'],
        images: [
          {
            height: 256,
            type: 'image/png',
            url: 'https://cdn1.suno.ai/suno-square.jpg',
            width: 256,
          },
        ],
        type: 'music.song',
      },
      title: 'Test User | Join me on Suno',
      twitter: {
        card: 'player',
        description: 'I am a test user',
        images: [
          {
            url: 'https://cdn1.suno.ai/suno-square.jpg',
          },
          {
            url: 'https://cdn1.suno.ai/suno-square.jpg',
          },
        ],
        players: {
          height: 240,
          playerUrl: '//embed/aaa-bbb-ccc',
          streamUrl: 'https://cdn1.suno.ai/audio.mp3',
          width: 760,
        },
        site: '@suno_ai_',
        title: 'Test User | Join me on Suno',
      },
    });
  });

  it('playlist embed', () => {
    const playlist = {
      name: 'Test Playlist',
      id: 'blah',
      playlist_clips: [],
      image_url: 'https://cdn1.suno.ai/suno-square.jpg',
      is_trashed: false,
    };
    const md = extractPlaylistMetadata(playlist);
    expect(md).toEqual({
      alternates: {
        canonical: '//playlist/blah',
      },
      description:
        'Suno is building a future where anyone can make great music.',
      openGraph: {
        audio: [],
        images: [
          {
            height: 256,
            type: 'image/png',
            url: 'https://cdn1.suno.ai/suno-square.jpg',
            width: 256,
          },
        ],
        type: 'music.playlist',
      },
      title: 'Test Playlist | Suno',
      twitter: {
        card: 'player',
        description:
          'Suno is building a future where anyone can make great music.',
        images: [
          {
            url: 'https://cdn1.suno.ai/suno-square.jpg',
          },
          {
            url: 'https://cdn1.suno.ai/suno-square.jpg',
          },
        ],
        players: undefined,
        site: '@suno_ai_',
        title: 'Test Playlist | Suno',
      },
    });
  });
});
