/*
 * 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.fop.render.pdf.pdfbox;

import java.io.IOException;
import java.io.InputStream;

import java.util.Collections;
import java.util.List;

import org.apache.commons.io.IOUtils;
import org.apache.fontbox.cmap.CMap;
import org.apache.fontbox.cmap.CMapParser;
import org.apache.fontbox.util.BoundingBox;
import org.apache.pdfbox.cos.COSArray;
import org.apache.pdfbox.cos.COSBase;
import org.apache.pdfbox.cos.COSDictionary;
import org.apache.pdfbox.cos.COSName;
import org.apache.pdfbox.cos.COSStream;
import org.apache.pdfbox.pdmodel.common.COSArrayList;
import org.apache.pdfbox.pdmodel.font.PDCIDFont;
import org.apache.pdfbox.pdmodel.font.PDFont;
import org.apache.pdfbox.pdmodel.font.PDFontFactory;
import org.apache.pdfbox.pdmodel.font.PDSimpleFont;
import org.apache.pdfbox.pdmodel.font.PDType0Font;
import org.apache.pdfbox.pdmodel.font.encoding.BuiltInEncoding;
import org.apache.pdfbox.pdmodel.font.encoding.DictionaryEncoding;
import org.apache.pdfbox.pdmodel.font.encoding.Encoding;

public class FontContainer {
    private COSDictionary dict;
    private List<Integer> widths;
    PDFont font;

    FontContainer(COSDictionary fontData) throws IOException {
        dict = fontData;
        font = PDFontFactory.createFont(fontData);
    }

    int getFirstChar() {
        return dict.getInt(COSName.FIRST_CHAR);
    }

    int getLastChar() {
        return dict.getInt(COSName.LAST_CHAR);
    }

    CMap getToUnicodeCMap() throws IOException {
        COSBase base = dict.getDictionaryObject(COSName.TO_UNICODE);
        if (font instanceof PDType0Font && base == null) {
            PDCIDFont cidFont = ((PDType0Font) font).getDescendantFont();
            base = cidFont.getCOSObject().getDictionaryObject(COSName.TO_UNICODE);
        }
        if (base instanceof COSName) {
            // predefined CMap
            String name = ((COSName)base).getName();
            CMapParser parser = new CMapParser();
            return parser.parsePredefined(name);
        } else if (base instanceof COSStream) {
            // embedded CMap
            InputStream input = null;
            try {
                input = ((COSStream)base).getUnfilteredStream();
                CMapParser parser = new CMapParser();
                return parser.parse(input);
            } finally {
                IOUtils.closeQuietly(input);
            }
        } else {
//            throw new IOException("Expected Name or Stream");
        }
        return null;
    }

    COSBase getToUnicode() {
        return dict.getDictionaryObject(COSName.TO_UNICODE);
    }

    List<Integer> getWidths() {
        if (widths == null) {
            COSArray array = (COSArray) dict.getDictionaryObject(COSName.WIDTHS);
            if (array != null) {
                widths = COSArrayList.convertIntegerCOSArrayToList(array);
            } else {
                widths = Collections.emptyList();
            }
        }
        return widths;
    }

    Encoding getEncoding() {
        if (font instanceof PDSimpleFont) {
            if (((PDSimpleFont) font).getEncoding() instanceof DictionaryEncoding) {
                return new DictionaryEncoding(
                        (COSDictionary)((PDSimpleFont)font).getEncoding().getCOSObject(), true, null);
            }
            return ((PDSimpleFont) font).getEncoding();
        }
        return null;
    }

    String getBaseEncodingName() {
        Encoding encoding = getEncoding();
        if (encoding != null && !(encoding instanceof BuiltInEncoding)) {
            COSBase cosObject = encoding.getCOSObject();
            if (cosObject != null) {
                if (cosObject instanceof COSDictionary) {
                    COSBase item = ((COSDictionary) cosObject).getItem(COSName.BASE_ENCODING);
                    if (item != null) {
                        return ((COSName)item).getName();
                    }
                } else if (cosObject instanceof COSName) {
                    return ((COSName) cosObject).getName();
                } else {
                    throw new RuntimeException(cosObject.toString() + " not supported");
                }
            }
        }
        return null;
    }

    float[] getBoundingBox() throws IOException {
        BoundingBox bb = font.getBoundingBox();
        return new float[] {bb.getLowerLeftX(), bb.getLowerLeftY(), bb.getUpperRightX(), bb.getUpperRightY()};
    }
}
