/* ====================================================================
   Licensed to the Apache Software Foundation (ASF) under one or more
   contributor license agreements.  See the NOTICE file distributed with
   this work for additional information regarding copyright ownership.
   The ASF licenses this file to You under the Apache License, Version 2.0
   (the "License"); you may not use this file except in compliance with
   the License.  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
==================================================================== */

package org.apache.poi.xwpf.usermodel;

import java.util.HashMap;
import java.util.Map;

import org.apache.poi.ooxml.POIXMLDocument;
import org.apache.poi.ooxml.POIXMLRelation;
import org.apache.poi.openxml4j.opc.PackageRelationshipTypes;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public final class XWPFRelation extends POIXMLRelation {

    /**
     * A map to lookup POIXMLRelation by its relation type
     */
    private static final Map<String, XWPFRelation> _table = new HashMap<>();

    public static final XWPFRelation DOCUMENT = new XWPFRelation(
            "application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml",
            PackageRelationshipTypes.CORE_DOCUMENT,
            "/word/document.xml"
    );

    public static final XWPFRelation TEMPLATE = new XWPFRelation(
        "application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml",
        PackageRelationshipTypes.CORE_DOCUMENT,
        "/word/document.xml"
    );

    public static final XWPFRelation MACRO_DOCUMENT = new XWPFRelation(
        "application/vnd.ms-word.document.macroEnabled.main+xml",
        PackageRelationshipTypes.CORE_DOCUMENT,
        "/word/document.xml"
    );

    public static final XWPFRelation MACRO_TEMPLATE_DOCUMENT = new XWPFRelation(
        "application/vnd.ms-word.template.macroEnabledTemplate.main+xml",
        PackageRelationshipTypes.CORE_DOCUMENT,
        "/word/document.xml"
    );

    public static final XWPFRelation GLOSSARY_DOCUMENT = new XWPFRelation(
        "application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml",
        "http://schemas.openxmlformats.org/officeDocument/2006/relationships/glossaryDocument",
        "/word/glossary/document.xml"
    );

    public static final XWPFRelation NUMBERING = new XWPFRelation(
        "application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml",
        "http://schemas.openxmlformats.org/officeDocument/2006/relationships/numbering",
        "/word/numbering.xml",
        XWPFNumbering::new, XWPFNumbering::new
    );

    public static final XWPFRelation FONT_TABLE = new XWPFRelation(
            "application/vnd.openxmlformats-officedocument.wordprocessingml.fontTable+xml",
            "http://schemas.openxmlformats.org/officeDocument/2006/relationships/fontTable",
            "/word/fontTable.xml"
    );

    public static final XWPFRelation SETTINGS = new XWPFRelation(
        "application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml",
        "http://schemas.openxmlformats.org/officeDocument/2006/relationships/settings",
        "/word/settings.xml",
        XWPFSettings::new, XWPFSettings::new
    );

    public static final XWPFRelation STYLES = new XWPFRelation(
        "application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml",
        "http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles",
        "/word/styles.xml",
        XWPFStyles::new, XWPFStyles::new
    );

    public static final XWPFRelation WEB_SETTINGS = new XWPFRelation(
        "application/vnd.openxmlformats-officedocument.wordprocessingml.webSettings+xml",
        "http://schemas.openxmlformats.org/officeDocument/2006/relationships/webSettings",
        "/word/webSettings.xml"
    );

    public static final XWPFRelation HEADER = new XWPFRelation(
        "application/vnd.openxmlformats-officedocument.wordprocessingml.header+xml",
        "http://schemas.openxmlformats.org/officeDocument/2006/relationships/header",
        "/word/header#.xml",
        XWPFHeader::new, XWPFHeader::new
    );

    public static final XWPFRelation FOOTER = new XWPFRelation(
        "application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml",
        "http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer",
        "/word/footer#.xml",
        XWPFFooter::new, XWPFFooter::new
    );

    public static final XWPFRelation THEME = new XWPFRelation(
        "application/vnd.openxmlformats-officedocument.theme+xml",
        "http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme",
        "/word/theme/theme#.xml"
    );

    public static final XWPFRelation WORKBOOK = new XWPFRelation(
        "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
        POIXMLDocument.PACK_OBJECT_REL_TYPE,
        "/word/embeddings/Microsoft_Excel_Worksheet#.xlsx",
        XSSFWorkbook::new, (PackagePartConstructor)XSSFWorkbook::new
    );

    public static final XWPFRelation CHART = new XWPFRelation(
        "application/vnd.openxmlformats-officedocument.drawingml.chart+xml",
        "http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart",
        "/word/charts/chart#.xml",
        XWPFChart::new, XWPFChart::new
    );
    public static final XWPFRelation HYPERLINK = new XWPFRelation(
        null,
        "http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink",
        null
    );
    public static final XWPFRelation COMMENT = new XWPFRelation(
        "application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml",
        "http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments",
        "/word/comments.xml",
        XWPFComments::new, XWPFComments::new
    );
    public static final XWPFRelation FOOTNOTE = new XWPFRelation(
        "application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml",
        "http://schemas.openxmlformats.org/officeDocument/2006/relationships/footnotes",
        "/word/footnotes.xml",
        XWPFFootnotes::new, XWPFFootnotes::new
    );
    public static final XWPFRelation ENDNOTE = new XWPFRelation(
        "application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml",
        "http://schemas.openxmlformats.org/officeDocument/2006/relationships/endnotes",
        "/word/endnotes.xml",
        XWPFEndnotes::new, XWPFEndnotes::new
    );
    /**
     * Supported image formats
     */
    public static final XWPFRelation IMAGE_EMF = new XWPFRelation(
        "image/x-emf",
        "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image",
        "/word/media/image#.emf",
        XWPFPictureData::new, XWPFPictureData::new
    );
    public static final XWPFRelation IMAGE_WMF = new XWPFRelation(
        "image/x-wmf",
        "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image",
        "/word/media/image#.wmf",
        XWPFPictureData::new, XWPFPictureData::new
    );
    public static final XWPFRelation IMAGE_PICT = new XWPFRelation(
        "image/pict",
        "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image",
        "/word/media/image#.pict",
        XWPFPictureData::new, XWPFPictureData::new
    );
    public static final XWPFRelation IMAGE_JPEG = new XWPFRelation(
        "image/jpeg",
        "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image",
        "/word/media/image#.jpeg",
        XWPFPictureData::new, XWPFPictureData::new
    );
    public static final XWPFRelation IMAGE_PNG = new XWPFRelation(
        "image/png",
        "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image",
        "/word/media/image#.png",
        XWPFPictureData::new, XWPFPictureData::new
    );
    public static final XWPFRelation IMAGE_DIB = new XWPFRelation(
        "image/dib",
        "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image",
        "/word/media/image#.dib",
        XWPFPictureData::new, XWPFPictureData::new
    );
    public static final XWPFRelation IMAGE_GIF = new XWPFRelation(
        "image/gif",
        "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image",
        "/word/media/image#.gif",
        XWPFPictureData::new, XWPFPictureData::new
    );
    public static final XWPFRelation IMAGE_TIFF = new XWPFRelation(
        "image/tiff",
        "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image",
        "/word/media/image#.tiff",
        XWPFPictureData::new, XWPFPictureData::new
    );
    public static final XWPFRelation IMAGE_EPS = new XWPFRelation(
        "image/x-eps",
        "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image",
        "/word/media/image#.eps",
        XWPFPictureData::new, XWPFPictureData::new
    );
    public static final XWPFRelation IMAGE_BMP = new XWPFRelation(
        "image/x-ms-bmp",
        "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image",
        "/word/media/image#.bmp",
        XWPFPictureData::new, XWPFPictureData::new
    );
    public static final XWPFRelation IMAGE_WPG = new XWPFRelation(
        "image/x-wpg",
        "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image",
        "/word/media/image#.wpg",
        XWPFPictureData::new, XWPFPictureData::new
    );
    public static final XWPFRelation IMAGES = new XWPFRelation(
        null,
        "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image",
        null,
        XWPFPictureData::new, XWPFPictureData::new
    );

    private XWPFRelation(String type, String rel, String defaultName) {
        super(type, rel, defaultName);
        _table.put(rel, this);
    }

    private XWPFRelation(String type, String rel, String defaultName,
                         NoArgConstructor noArgConstructor,
                         PackagePartConstructor packagePartConstructor) {
        super(type, rel, defaultName, noArgConstructor, packagePartConstructor, null);
        _table.put(rel, this);
    }

    private XWPFRelation(String type, String rel, String defaultName,
                         NoArgConstructor noArgConstructor,
                         ParentPartConstructor parentPartConstructor) {
        super(type, rel, defaultName, noArgConstructor, null, parentPartConstructor);
        _table.put(rel, this);
    }

    /**
     * Get POIXMLRelation by relation type
     *
     * @param rel relation type, for example,
     *            <code>http://schemas.openxmlformats.org/officeDocument/2006/relationships/image</code>
     * @return registered POIXMLRelation or null if not found
     */
    public static XWPFRelation getInstance(String rel) {
        return _table.get(rel);
    }

}
