import {mergeAttributes, Node} from '@tiptap/core'


export const Box = Node.create({
    name: 'box',

    addOptions() {
        return {
            types: ['info', 'warning', 'danger', 'success', 'bug'],
            HTMLAttributes: {
                class: 'box',
            },
        }
    },

    addAttributes() {
        return {
            type: {
                default: 'info',
                rendered: false,
            },
        }
    },

    group: 'block',

    content: 'inline*',

    defining: true,

    parseHTML() {
        return this.options.types.map((/* type */) => ({
            tag: 'div',
            getAttrs: (node) => {
                // Extract the class attribute and find the type based on the class
                const classList = node.getAttribute('class')?.split(' ') || [];
                const boxType = classList.find(cls => this.options.types.includes(cls));
                return {
                    type: boxType || this.options.types[0], // Default to 'info' if no matching type is found
                };
            },
        }));
    },

    renderHTML({ node, HTMLAttributes }) {
        const hasType = this.options.types.includes(node.attrs.type);
        const type = hasType
            ? node.attrs.type
            : this.options.types[0]

        let classes = 'box ' + type;
        return ['div', mergeAttributes({ class: classes }, HTMLAttributes), 0]
    },

    addCommands() {
        return {
            setBox: attributes => ({ commands }) => {
                if (!this.options.types.includes(attributes.type)) {
                    return false
                }

                return commands.setNode(this.name, attributes)
            },
            toggleBox: attributes => ({ commands }) => {
                if (!this.options.types.includes(attributes.type)) {
                    return false
                }

                return commands.toggleNode(this.name, 'paragraph', attributes)
            },
        }
    },
})
