package font;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Iterator;
import java.util.Map;

import webrainbow.io.FileUtils;
import webrainbow.util.debug.WrCheck;

import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Font;
import com.lowagie.text.PageSize;
import com.lowagie.text.Paragraph;
import com.lowagie.text.pdf.BaseFont;
import com.lowagie.text.pdf.DefaultFontMapper;
import com.lowagie.text.pdf.PdfWriter;

public class ArabicAsianFont {
    
    public void go() {
        Document document = new Document(PageSize.A4, 50, 50, 70, 70);
        
        try {
            PdfWriter.getInstance(document, new FileOutputStream("test/pdf/arabicAsianFont.pdf"));
            
            document.open();

//          String string = "你好 CIAO راره،اللهم اجعله دائما خارج التغطية";
            String asianPure = "你好";
            String arabicByte = "\u0634\u0627\u062f\u062c\u0645\u0647\u0648\u0645\u0646";
            String arabicPure = "راره،اللهم اجعله دائما خارج التغطية";
            String mixed = "ciao 你好 ciao \u0634\u0627\u062f\u062c\u0645\u0647\u0648\u0645\u0646";
            
//            java.awt.Font awtPlainFont = new java.awt.Font("Times New Roman", java.awt.Font.PLAIN, 10);
//            java.awt.Font awtBoldFont = new java.awt.Font("Courier New", java.awt.Font.BOLD, 15);                        
//            java.awt.Font awtItalicFont = new java.awt.Font("Times New Roman", java.awt.Font.ITALIC, 20);
                        
            Font f;
            
//            f = awtToItextFont(awtPlainFont);            
                        
            BaseFont bf = BaseFont.createFont("c:/WINDOWS/Fonts/arial.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
            f = new Font(bf, 14);                        
            
            Paragraph simpleParagraph = new Paragraph(asianPure, f);            
            document.add(simpleParagraph);  
            WrCheck.logInfo("Added asian pure [" + asianPure + "] with Font --> " + f.getFamilyname());
            
            simpleParagraph = new Paragraph(arabicByte, f);            
            document.add(simpleParagraph);  
            WrCheck.logInfo("Added arabic unicode byte [" + arabicByte + "] with Font --> " + f.getFamilyname());
            
            simpleParagraph = new Paragraph(arabicPure, f);            
            document.add(simpleParagraph);  
            WrCheck.logInfo("Added arabic pure [" + arabicPure + "] with Font --> " + f.getFamilyname());
            
            simpleParagraph = new Paragraph(mixed, f);            
            document.add(simpleParagraph);  
            WrCheck.logInfo("Added mixed sentence [" + mixed + "] with Font --> " + f.getFamilyname());
            
//            // La dimensione del font, la setto manualmente, in quanto sembra
//            // che il mapping di prima non ne tenga conto
//            com.lowagie.text.Font boldFont = awtToItextFont(awtBoldFont);
//            // Istanzio un paragraph con Font
//            simpleParagraph = new Paragraph("Ah yeah bold - size 15", boldFont);            
//            document.add(simpleParagraph);            
//            WrCheck.logInfo("Added paragraph with Font --> " + boldFont);
//            
//            // La dimensione del font, la setto manualmente, in quanto sembra
//            // che il mapping di prima non ne tenga conto
//            com.lowagie.text.Font italicFont = awtToItextFont(awtItalicFont);            
//            // Istanzio un paragraph con Font
//            simpleParagraph = new Paragraph("Ah yeah italic - size 20", italicFont);
//            document.add(simpleParagraph);            
//            WrCheck.logInfo("Added paragraph with Font --> " + italicFont);
            
            document.close();
        
        } catch (FileNotFoundException e) {
            WrCheck.logError(e);
        } catch (DocumentException e) {            
            WrCheck.logError(e);
        } catch (IOException e) {
            WrCheck.logError(e);
        }
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        new ArabicAsianFont().go();
    }
    
    private Font awtToItextFont(java.awt.Font awtFont) {
                
        // Effettuo un mapping tra un java.awt.Font verso un Font di tipo itext
        DefaultFontMapper mapper = new DefaultFontMapper();
        
        // TODO COnsiderare il fatto di chimare questo metodo pesantuccio una volta sola, dovrebbe poter essere possibile
        mapper.insertDirectory(FileUtils.getFontDirectory());
        
//        Map map = mapper.getMapper();
//        for (Iterator iterator = map.keySet().iterator(); iterator.hasNext();) {
//            String name = (String)iterator.next();
//            WrCheck.logInfo(name + ": " + ((DefaultFontMapper.BaseFontParameters)map.get(name)).fontName);            
//        }        
        
        
        DefaultFontMapper.BaseFontParameters pp = mapper.getBaseFontParameters(/*"Arial Unicode MS"*/awtFont.getName());
            if (pp!=null) {
                pp.encoding = BaseFont.IDENTITY_H;
//                pp.encoding = BaseFont.FONT_TYPE_CJK;
            } 
        
        
        BaseFont pdfFont = mapper.awtToPdf(awtFont);
        
        // La dimensione del font, la setto manualmente, in quanto sembra
        // che il mapping di prima non ne tenga conto
        Font itextFont = new Font(pdfFont);   
        itextFont.setSize(awtFont.getSize());                
        
        return itextFont;
    }
}
