/*
 *  ====================================================================
 *    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.sl;

import static org.apache.poi.sl.TestTable.openSampleSlideshow;
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 static org.junit.Assume.assumeFalse;

import java.io.IOException;
import java.util.List;

import org.apache.poi.hslf.model.HeadersFooters;
import org.apache.poi.hslf.usermodel.HSLFSlide;
import org.apache.poi.hslf.usermodel.HSLFTextParagraph;
import org.apache.poi.sl.usermodel.Shape;
import org.apache.poi.sl.usermodel.Slide;
import org.apache.poi.sl.usermodel.SlideShow;
import org.apache.poi.sl.usermodel.TextParagraph;
import org.apache.poi.sl.usermodel.TextShape;
import org.junit.BeforeClass;
import org.junit.Test;

public class TestHeadersFooters {
    private static boolean xslfOnly = false;

    @BeforeClass
    public static void checkHslf() {
        try {
            Class.forName("org.apache.poi.hslf.usermodel.HSLFSlideShow");
        } catch (Exception e) {
            xslfOnly = true;
        }
    }

    
    @Test
    public void bug58144a() throws IOException {
        assumeFalse(xslfOnly);
        SlideShow<?,?> ppt = openSampleSlideshow("bug58144-headers-footers-2003.ppt");
        HSLFSlide sl = (HSLFSlide)ppt.getSlides().get(0);
        HeadersFooters hfs = sl.getHeadersFooters();
        assertNull(hfs.getHeaderText());
        assertEquals("Confidential", hfs.getFooterText());
        List<List<HSLFTextParagraph>> llp = sl.getTextParagraphs();
        assertEquals("Test", HSLFTextParagraph.getText(llp.get(0)));
        assertFalse(llp.get(0).get(0).isHeaderOrFooter());
        ppt.close();
    }
    
    @Test
    public void bug58144b() throws IOException {
        assumeFalse(xslfOnly);
        SlideShow<?,?> ppt = openSampleSlideshow("bug58144-headers-footers-2007.ppt");
        Slide<?,?> sl =  ppt.getSlides().get(0);
        HeadersFooters hfs2 = ((HSLFSlide)sl).getHeadersFooters();
        assertNull(hfs2.getHeaderText());
        assertEquals("Slide footer", hfs2.getFooterText());

        testSlideShow(ppt);
        ppt.close();
    }
    
    @Test
    public void bug58144c() throws IOException {
        SlideShow<?,?> ppt = openSampleSlideshow("bug58144-headers-footers-2007.pptx");
        testSlideShow(ppt);
        ppt.close();
    }
    
    private void testSlideShow(SlideShow<?,?> ppt) {
        Slide<?,?> sl =  ppt.getSlides().get(0);
        
        List<? extends Shape<?,?>> shapes = sl.getShapes();
        TextShape<?,?> ts0 = (TextShape<?,?>)shapes.get(0);
        assertEquals("Test file", ts0.getText());
        TextShape<?,?> ts1 = (TextShape<?,?>)shapes.get(1);
        assertEquals("Has some text in the headers and footers", ts1.getText());
        TextShape<?,?> ts2 = (TextShape<?,?>)shapes.get(2);
        assertEquals("Slide footer", ts2.getText());
        List<? extends TextParagraph<?,?,?>> ltp = ts2.getTextParagraphs();
        assertTrue(ltp.get(0).isHeaderOrFooter());
    }
}
