import type { Metadata } from 'next';

import type { Config, Media, Page, Post } from '../payload-types';
import { getServerSideURL } from './getURL';
import { mergeOpenGraph } from './mergeOpenGraph';

const getImageURL = (image?: Media | Config['db']['defaultIDType'] | null) => {
  const serverUrl = getServerSideURL();

  let url = serverUrl + '/website-template-OG.webp';

  if (image && typeof image === 'object' && 'url' in image) {
    const ogUrl = image.sizes?.og?.url;

    url = ogUrl ? serverUrl + ogUrl : serverUrl + image.url;
  }

  return url;
};

export const generateMeta = async (args: {
  doc: Partial<Page> | Partial<Post> | null;
}): Promise<Metadata> => {
  const { doc } = args;

  const ogImage = getImageURL(doc?.meta?.image);

  const title = doc?.meta?.title ? doc?.meta?.title + ' | Suno' : 'Suno';

  const serverUrl = getServerSideURL();
  const slug = Array.isArray(doc?.slug) ? doc?.slug.join('/') : doc?.slug || '';

  // Determine the path prefix based on post type
  let pathPrefix = '';
  if (doc && 'postType' in doc && doc.postType) {
    pathPrefix = doc.postType === 'hub' ? '/hub' : '/blog';
  }

  const canonicalUrl = slug ? `${serverUrl}${pathPrefix}/${slug}` : serverUrl;

  return {
    metadataBase: new URL('https://cdn1.suno.ai'),
    title,
    description: doc?.meta?.description,
    alternates: {
      canonical: canonicalUrl,
    },
    openGraph: mergeOpenGraph({
      description: doc?.meta?.description || '',
      images: ogImage
        ? [
            {
              url: ogImage,
            },
          ]
        : undefined,
      title,
      url: canonicalUrl,
    }),
  };
};
