/* ====================================================================
   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;

/**
 * @author Yegor Kozlov
 */
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);
    }

}
