export const doc = {
    content: "article", // Transformations don't work well on the top most element
    selectable: false
}

export const article = {
    defining: true,
    content: "title part*",
    selectable: false,
    allowGapCursor: false,
    attrs: {
        documentstyle: {
            default: ""
        },
        tracked: {
            default: false
        },
        citationstyle: { // Default citation style
            default: "apa"
        },
        citationstyles: { // Available citation styles
            default: [
                "american-anthropological-association",
                "apa",
                "chicago-author-date",
                "chicago-note-bibliography",
                "harvard-cite-them-right", // previously harvard1
                "modern-language-association", // previously mla
                "nature",
                "oxford-university-press-humsoc"
            ]
        },
        language: { // Default language
            default: "en-US"
        },
        languages: { // Available languages
            default: [
                "af-ZA",
                "sq-AL",
                "ar",
                "ast",
                "be",
                "br",
                "bg",
                "ca",
                "ca-ES-Valencia",
                "zh-CN",
                "da",
                "nl",
                "en-AU",
                "en-CA",
                "en-NZ",
                "en-ZA",
                "en-GB",
                "en-US",
                "eo",
                "fr",
                "gl",
                "de-DE",
                "de-AU",
                "de-CH",
                "el",
                "he",
                "is",
                "it",
                "ja",
                "km",
                "lt",
                "ml",
                "nb-NO",
                "nn-NO",
                "fa",
                "pl",
                "pt-BR",
                "pt-PT",
                "ro",
                "ru",
                "tr",
                "sr-SP-Cy",
                "sr-SP-Lt",
                "sk",
                "sl",
                "es",
                "sv",
                "ta",
                "tl",
                "uk"
            ]
        },
        papersize: { // Default paper size
            default: "A4"
        },
        papersizes: { // Available paper sizes
            default: ["A4", "US Letter"]
        },
        footnote_marks: {
            default: ["strong", "em", "link"]
        },
        footnote_elements: {
            default: ["paragraph", "heading1", "heading2", "heading3", "heading4", "heading5", "heading6", "figure", "ordered_list", "bullet_list", "horizontal_rule", "equation", "citation", "cross_reference", "blockquote", "table"]
        },
        bibliography_header: {
            default: {}
        },
        template: {
            default: ""
        },
        import_id: {
            default: ""
        },
        copyright: {
            default: {
                holder: false,
                year: false,
                freeToRead: true,
                licenses: []
            }
        }
    },
    parseDOM: [{
        tag: "div.article",
        getAttrs(dom) {
            return {
                papersize: dom.dataset.papersize,
                citationstyle: dom.dataset.citationstyle,
                documentstyle: dom.dataset.documentstyle
            }
        }
    }],
    toDOM(node) {
        return ["div", {
            class: "article",
            "data-papersize": node.attrs.papersize,
            "data-citationstyle": node.attrs.citationstyle,
            "data-documentstyle": node.attrs.documentstyle
        }, 0]
    }
}

const partSpec = (type, content, attrs = {}) => ({
    content,
    group: "part",
    marks: "annotation track",
    isolating: true,
    attrs: Object.assign({
        title: {
            default: ""
        },
        id: {
            default: ""
        },
        locking: {
            default: false
        },
        language: {
            default: false
        },
        optional: {
            default: false
        },
        hidden: {
            default: false
        },
        help: {
            default: false
        },
        initial: {
            default: false
        },
        deleted: { // used when a part is present in a document but not part of the document template due to template changes
            default: false
        }
    }, attrs),
    parseDOM: [{
        tag: `div.article-${type}`,
        getAttrs(dom) {
            return {
                hidden: dom.dataset.hidden === "true" ? true : false
            }
        }
    }],
    toDOM(node) {
        const attrs = {
            class: `article-part article-${type} article-${node.attrs.id}`
        }
        if (node.attrs.hidden) {
            attrs["data-hidden"] = "true"
        }
        if (node.attrs.deleted) {
            attrs.class += " article-deleted"
        }
        return ["div", attrs, 0]
    }
})

export const richtext_part = partSpec("richtext", "block+", {
    elements: {
        default: ["paragraph", "heading1", "heading2", "heading3", "heading4", "heading5", "heading6", "code_block", "figure", "ordered_list", "bullet_list", "horizontal_rule", "equation", "citation", "cross_reference", "blockquote", "footnote", "table"]
    },
    marks: {
        default: ["strong", "em", "link", "anchor"]
    },
    metadata: {
        default: false
    }
})
export const heading_part = partSpec("heading", "heading", {
    elements: {
        default: ["heading1"]
    },
    marks: {
        default: ["strong", "em", "link", "anchor"]
    },
    metadata: {
        default: false
    }
})
export const contributors_part = partSpec("contributors", "contributor*", {
    item_title: {
        default: "Contributor"
    },
    metadata: {
        default: false
    }
})
export const tags_part = partSpec("tags", "tag*", {
    item_title: {
        default: "Tag"
    },
    metadata: {
        default: false
    }
})
export const table_part = partSpec("table", "table", {
    elements: {
        default: ["paragraph", "heading1", "heading2", "heading3", "heading4", "heading5", "heading6", "figure", "ordered_list", "bullet_list", "horizontal_rule", "equation", "citation", "blockquote", "footnote"]
    },
    marks: {
        default: ["strong", "em", "link", "anchor"]
    }
})

export const table_of_contents = {
    group: "part",
    marks: "annotation track",
    defining: true,
    parseDOM: [{
        tag: "div.table-of-contents"
    }],
    attrs: {
        title: {
            default: "Table of Contents"
        },
        id: {
            default: "toc"
        },
        optional: {
            default: false
        },
        hidden: {
            default: false
        }
    },
    toDOM(node) {
        const dom = document.createElement("div")
        dom.classList.add("article-part", "table-of-contents")
        if (node.attrs.hidden) {
            dom.dataset.hidden = "true"
        }
        dom.innerHTML = `<h1 class="toc">${node.attrs.title}</h1>`
        return dom
    }

}

export const separator_part = {
    marks: "annotation track",
    group: "part",
    defining: true,
    attrs: {
        id: {
            default: "separator"
        }
    },
    parseDOM: [{
        tag: "hr.article-separator_part"
    }],
    toDOM(node) {
        const dom = document.createElement("hr")
        dom.classList.add("article-separator_part")
        dom.classList.add(`article-${node.attrs.id}`)
        return dom
    }
}

export const title = {
    content: "text*",
    marks: "annotation track",
    group: "fixedpart",
    defining: true,
    isolating: true,
    attrs: {
        id: {
            default: "title"
        }
    },
    parseDOM: [{
        tag: "div.article-title"
    }],
    toDOM(_node) {
        return ["div", {
            class: "article-part article-title"
        }, 0]
    }
}
