/* ====================================================================
   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.xslf.usermodel;

import static org.apache.poi.sl.TestCommonSL.sameColor;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;

import java.awt.Color;
import java.io.IOException;
import java.util.List;

import org.apache.poi.xslf.XSLFTestDataSamples;
import org.junit.Test;

/**
 * @author Yegor Kozlov
 */
public class TestXSLFSlide {
    
    @Test
    public void testReadShapes() throws IOException {
        XMLSlideShow  ppt = XSLFTestDataSamples.openSampleDocument("shapes.pptx");
        List<XSLFSlide> slides = ppt.getSlides();

        XSLFSlide slide1 = slides.get(0);
        List<XSLFShape> shapes1 = slide1.getShapes();
        assertEquals(7, shapes1.size());
        assertEquals("TextBox 3", shapes1.get(0).getShapeName());
        assertTrue(shapes1.get(0) instanceof XSLFTextBox);
        XSLFAutoShape sh0 = (XSLFAutoShape)shapes1.get(0);
        assertEquals("Learning PPTX", sh0.getText());


        assertEquals("Straight Connector 5", shapes1.get(1).getShapeName());
        assertTrue(shapes1.get(1) instanceof XSLFConnectorShape);

        assertEquals("Freeform 6", shapes1.get(2).getShapeName());
        assertTrue(shapes1.get(2) instanceof XSLFFreeformShape);
        XSLFAutoShape sh2 = (XSLFAutoShape)shapes1.get(2);
        assertEquals("Cloud", sh2.getText());

        assertEquals("Picture 1", shapes1.get(3).getShapeName());
        assertTrue(shapes1.get(3) instanceof XSLFPictureShape);

        assertEquals("Table 2", shapes1.get(4).getShapeName());
        assertTrue(shapes1.get(4) instanceof XSLFGraphicFrame);

        assertEquals("Straight Arrow Connector 7", shapes1.get(5).getShapeName());
        assertTrue(shapes1.get(5) instanceof XSLFConnectorShape);

        assertEquals("Elbow Connector 9", shapes1.get(6).getShapeName());
        assertTrue(shapes1.get(6) instanceof XSLFConnectorShape);

        // titles on slide2
        XSLFSlide slide2 = slides.get(1);
        List<XSLFShape> shapes2 = slide2.getShapes();
        assertEquals(2, shapes2.size());
        assertTrue(shapes2.get(0) instanceof XSLFAutoShape);
        assertEquals("PPTX Title", ((XSLFAutoShape)shapes2.get(0)).getText());
        assertTrue(shapes2.get(1) instanceof XSLFAutoShape);
        assertEquals("Subtitle\nAnd second line", ((XSLFAutoShape)shapes2.get(1)).getText());

        //  group shape on slide3
        XSLFSlide slide3 = slides.get(2);
        List<XSLFShape> shapes3 = slide3.getShapes();
        assertEquals(1, shapes3.size());
        assertTrue(shapes3.get(0) instanceof XSLFGroupShape);
        List<XSLFShape> groupShapes = ((XSLFGroupShape)shapes3.get(0)).getShapes();
        assertEquals(3, groupShapes.size());
        assertTrue(groupShapes.get(0) instanceof XSLFAutoShape);
        assertEquals("Rectangle 1", groupShapes.get(0).getShapeName());

        assertTrue(groupShapes.get(1) instanceof XSLFAutoShape);
        assertEquals("Oval 2", groupShapes.get(1).getShapeName());

        assertTrue(groupShapes.get(2) instanceof XSLFAutoShape);
        assertEquals("Right Arrow 3", groupShapes.get(2).getShapeName());

        XSLFSlide slide4 = slides.get(3);
        List<XSLFShape> shapes4 = slide4.getShapes();
        assertEquals(1, shapes4.size());
        assertTrue(shapes4.get(0) instanceof XSLFTable);
        XSLFTable tbl = (XSLFTable)shapes4.get(0);
        assertEquals(3, tbl.getNumberOfColumns());
        assertEquals(6, tbl.getNumberOfRows());
        
        ppt.close();
    }

    @Test
    public void testCreateSlide() throws IOException {
        XMLSlideShow  ppt = new XMLSlideShow();
        assertEquals(0, ppt.getSlides().size());

        XSLFSlide slide = ppt.createSlide();
        assertFalse(slide.getFollowMasterGraphics());
        slide.setFollowMasterGraphics(false);
        assertFalse(slide.getFollowMasterGraphics());
        slide.setFollowMasterGraphics(true);
        assertTrue(slide.getFollowMasterGraphics());
        
        ppt.close();
    }

    @Test
    public void testImportContent() throws IOException {
        XMLSlideShow ppt = new XMLSlideShow();

        XMLSlideShow  src = XSLFTestDataSamples.openSampleDocument("themes.pptx");

        // create a blank slide and import content from the 4th slide of themes.pptx
        XSLFSlide slide1 = ppt.createSlide().importContent(src.getSlides().get(3));
        List<XSLFShape> shapes1 = slide1.getShapes();
        assertEquals(2, shapes1.size());

        XSLFTextShape sh1 = (XSLFTextShape)shapes1.get(0);
        assertEquals("Austin Theme", sh1.getText());
        XSLFTextRun r1 = sh1.getTextParagraphs().get(0).getTextRuns().get(0);
        assertEquals("Century Gothic", r1.getFontFamily());
        assertEquals(40.0, r1.getFontSize(), 0);
        assertTrue(r1.isBold());
        assertTrue(r1.isItalic());
        assertTrue(sameColor(new Color(148, 198, 0), r1.getFontColor()));
        assertNull(sh1.getFillColor());
        assertNull(sh1.getLineColor());

        XSLFTextShape sh2 = (XSLFTextShape)shapes1.get(1);
        assertEquals(
                "Text in a autoshape is white\n" +
                "Fill: RGB(148, 198,0)", sh2.getText());
        XSLFTextRun r2 = sh2.getTextParagraphs().get(0).getTextRuns().get(0);
        assertEquals("Century Gothic", r2.getFontFamily());
        assertEquals(18.0, r2.getFontSize(), 0);
        assertFalse(r2.isBold());
        assertFalse(r2.isItalic());
        assertTrue(sameColor(Color.white, r2.getFontColor()));
        assertEquals(new Color(148, 198, 0), sh2.getFillColor());
        assertEquals(new Color(148, 198, 0), sh2.getLineColor()); // slightly different from PowerPoint!

        // the 5th slide has a picture and a texture fill
        XSLFSlide slide2 = ppt.createSlide().importContent(src.getSlides().get(4));
        List<XSLFShape> shapes2 = slide2.getShapes();
        assertEquals(2, shapes2.size());

        XSLFTextShape sh3 = (XSLFTextShape)shapes2.get(0);
        assertEquals("This slide overrides master background with a texture fill", sh3.getText());
        XSLFTextRun r3 = sh3.getTextParagraphs().get(0).getTextRuns().get(0);
        assertEquals("Century Gothic", r3.getFontFamily());
        //assertEquals(32.4.0, r3.getFontSize());
        assertTrue(r3.isBold());
        assertTrue(r3.isItalic());
        assertTrue(sameColor(new Color(148, 198, 0), r3.getFontColor()));
        assertNull(sh3.getFillColor());
        assertNull(sh3.getLineColor());

        XSLFPictureShape sh4 = (XSLFPictureShape)shapes2.get(1);
        XSLFPictureShape srcPic = (XSLFPictureShape)src.getSlides().get(4).getShapes().get(1);
        assertArrayEquals(sh4.getPictureData().getData(), srcPic.getPictureData().getData());
        
        ppt.close();
    }

    @Test
    public void testMergeSlides() throws IOException {
        XMLSlideShow ppt = new XMLSlideShow();
        String[] pptx = {"shapes.pptx", "themes.pptx", "layouts.pptx", "backgrounds.pptx"};

        for(String arg : pptx){
            XMLSlideShow  src = XSLFTestDataSamples.openSampleDocument(arg);

            for(XSLFSlide srcSlide : src.getSlides()){
                ppt.createSlide().importContent(srcSlide);
            }
        }
        assertEquals(30, ppt.getSlides().size());
        
        ppt.close();
    }    
}