// @ts-nocheck

/**
 * This plugin contains all the logic for setting up the singletons
 */

import { type DocumentDefinition } from 'sanity';
import { Iframe } from 'sanity-plugin-iframe-pane';
import { ListItemBuilder, type StructureResolver } from 'sanity/desk';

import { iframeOptions, PREVIEWABLE_DOCUMENT_TYPES } from '../sanity.config';

const hiddenDocTypes = (listItem: ListItemBuilder) => {
  const id = listItem.getId();

  if (!id) {
    return false;
  }

  return ![
    // 'category',
    // 'home',
    'media.tag',
    // 'page',
    // 'product',
    // 'settings',
    // 'blurb',
    // 'section',
    // 'usp',
    'navigation',
    'footerMenu',
    'utilityMenu'
  ].includes(id);
};

export const singletonPlugin = (types: string[]) => {
  return {
    name: 'singletonPlugin',
    document: {
      // Hide 'Singletons (such as Home)' from new document options
      // https://user-images.githubusercontent.com/81981/195728798-e0c6cf7e-d442-4e58-af3a-8cd99d7fcc28.png
      newDocumentOptions: (prev, { creationContext }) => {
        if (creationContext.type === 'global') {
          return prev.filter((templateItem) => !types.includes(templateItem.templateId));
        }

        return prev;
      },
      // Removes the "duplicate" action on the Singletons (such as Home)
      actions: (prev, { schemaType }) => {
        if (types.includes(schemaType)) {
          return prev.filter(({ action }) => action !== 'duplicate');
        }

        return prev;
      }
    }
  };
};

// The StructureResolver is how we're changing the DeskTool structure to linking to document (named Singleton)
// like how "Home" is handled.
export const pageStructure = (typeDefArray: DocumentDefinition[]): StructureResolver => {
  return (S) => {
    // Goes through all of the singletons that were provided and translates them into something the
    // Desktool can understand
    const singletonItems = typeDefArray.map((typeDef) => {
      return S.listItem()
        .title(typeDef.title)
        .icon(typeDef.icon)
        .child(
          S.documentList()
            .title(typeDef.name)
            .filter(`_type == "${typeDef.name}"`)
            .child((id = typeDef.name) =>
              S.document()
                .schemaType(typeDef.name)
                .id(id)
                .views([
                  S.view.form(),
                  // Preview
                  ...(PREVIEWABLE_DOCUMENT_TYPES.includes(typeDef.name as any)
                    ? [S.view.component(Iframe).options(iframeOptions).title('Preview')]
                    : [])
                ])
            )
        );
    });

    // The default root list items (except custom ones)
    const defaultListItems = S.documentTypeListItems()
      .filter((listItem) => !typeDefArray.find((singleton) => singleton.name === listItem.getId()))
      .filter(hiddenDocTypes);

    return S.list()
      .title('Content')
      .items([...singletonItems, S.divider(), ...defaultListItems]);
  };
};