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

import static org.junit.Assert.assertNotNull;

import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.sl.draw.DrawFactory;
import org.apache.poi.sl.draw.Drawable;
import org.apache.poi.xslf.XSLFSlideShow;
import org.apache.poi.xslf.usermodel.XMLSlideShow;
import org.apache.poi.xslf.usermodel.XSLFNotes;
import org.apache.poi.xslf.usermodel.XSLFShape;
import org.apache.poi.xslf.usermodel.XSLFSlide;
import org.apache.poi.xslf.usermodel.XSLFTextParagraph;
import org.apache.poi.xslf.usermodel.XSLFTextShape;
import org.junit.Test;

public class XSLFFileHandler extends AbstractFileHandler {
	@Override
    public void handleFile(InputStream stream) throws Exception {
        XSLFSlideShow slide = new XSLFSlideShow(OPCPackage.open(stream));
		assertNotNull(slide.getPresentation());
		assertNotNull(slide.getSlideMasterReferences());
		assertNotNull(slide.getSlideReferences());
		
		new POIXMLDocumentHandler().handlePOIXMLDocument(slide);

		ByteArrayOutputStream out = new ByteArrayOutputStream();
		try {
		    slide.write(out);
		} finally {
		    out.close();
		}
		
        createBitmaps(out);		
	}

    private void createBitmaps(ByteArrayOutputStream out) throws IOException {
        XMLSlideShow ppt = new XMLSlideShow(new ByteArrayInputStream(out.toByteArray()));
        Dimension pgsize = ppt.getPageSize();
        for (XSLFSlide xmlSlide : ppt.getSlides()) {
//            System.out.println("slide-" + (i + 1));
//            System.out.println("" + xmlSlide[i].getTitle());

            BufferedImage img = new BufferedImage(pgsize.width, pgsize.height, BufferedImage.TYPE_INT_RGB);
            Graphics2D graphics = img.createGraphics();

            // draw stuff
            xmlSlide.draw(graphics);

            // Also try to read notes
            XSLFNotes notes = xmlSlide.getNotes();
            if(notes != null) {
                for (XSLFShape note : notes) {
                    DrawFactory df = DrawFactory.getInstance(graphics);
                    Drawable d = df.getDrawable(note);
                    d.draw(graphics);
                    
                    if (note instanceof XSLFTextShape) {
                        XSLFTextShape txShape = (XSLFTextShape) note;
                        for (XSLFTextParagraph xslfParagraph : txShape.getTextParagraphs()) {
                            xslfParagraph.getText();
                        }
                    }
                }
            }
        }
        
        ppt.close();
    }

	// a test-case to test this locally without executing the full TestAllFiles
	@Test
	public void test() throws Exception {
		InputStream stream = new FileInputStream("test-data/slideshow/SampleShow.pptx");
		try {
			handleFile(stream);
		} finally {
			stream.close();
		}
	}


    // a test-case to test this locally without executing the full TestAllFiles
    @Test
    public void testExtractor() throws Exception {
        handleExtracting(new File("test-data/slideshow/testPPT.thmx"));
    }
}