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

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.io.IOException;
import java.io.InputStream;
import java.util.List;

import org.apache.poi.POIDataSamples;
import org.apache.poi.hslf.HSLFTestDataSamples;
import org.apache.poi.hslf.usermodel.HSLFSlide;
import org.apache.poi.hslf.usermodel.HSLFSlideShow;
import org.junit.Test;

/**
 * Test {@link org.apache.poi.hslf.model.HeadersFooters} object
 */
public final class TestHeadersFooters
{

    private static POIDataSamples _slTests = POIDataSamples.getSlideShowInstance();

    @Test
    public void testRead() throws IOException {
        InputStream is = _slTests.openResourceAsStream("headers_footers.ppt");
        HSLFSlideShow ppt = new HSLFSlideShow(is);
        is.close();

        HeadersFooters slideHdd = ppt.getSlideHeadersFooters();
        assertTrue(slideHdd.isFooterVisible());
        assertEquals("Global Slide Footer", slideHdd.getFooterText());
        assertTrue(slideHdd.isSlideNumberVisible());
        assertFalse(slideHdd.isHeaderVisible());
        assertNull(slideHdd.getHeaderText());
        assertFalse(slideHdd.isUserDateVisible());
        assertNull(slideHdd.getDateTimeText());


        HeadersFooters notesHdd = ppt.getNotesHeadersFooters();
        assertTrue(notesHdd.isFooterVisible());
        assertEquals("Notes Footer", notesHdd.getFooterText());
        assertTrue(notesHdd.isHeaderVisible());
        assertEquals("Notes Header", notesHdd.getHeaderText());
        assertTrue(notesHdd.isUserDateVisible());
        assertNull(notesHdd.getDateTimeText());

        List<HSLFSlide> slide = ppt.getSlides();
        //the first slide uses presentation-scope headers / footers
        HeadersFooters hd1 = slide.get(0).getHeadersFooters();
        assertEquals(slideHdd.isFooterVisible(), hd1.isFooterVisible());
        assertEquals(slideHdd.getFooterText(), hd1.getFooterText());
        assertEquals(slideHdd.isSlideNumberVisible(), hd1.isSlideNumberVisible());
        assertEquals(slideHdd.isHeaderVisible(), hd1.isHeaderVisible());
        assertEquals(slideHdd.getHeaderText(), hd1.getHeaderText());
        assertEquals(slideHdd.isUserDateVisible(), hd1.isUserDateVisible());
        assertEquals(slideHdd.getDateTimeText(), hd1.getDateTimeText());

        //the first slide uses per-slide headers / footers
        HeadersFooters hd2 = slide.get(1).getHeadersFooters();
        assertEquals(true, hd2.isFooterVisible());
        assertEquals("per-slide footer", hd2.getFooterText());
        assertEquals(true, hd2.isUserDateVisible());
        assertEquals("custom date format", hd2.getDateTimeText());

        ppt.close();
    }

    /**
     * If Headers / Footers are not set, all the getters should return <code>false</code> or <code>null</code>
     */
    @Test
    public void testReadNoHeadersFooters() throws Exception {
        InputStream is = _slTests.openResourceAsStream("basic_test_ppt_file.ppt");
        HSLFSlideShow ppt = new HSLFSlideShow(is);
        is.close();

        HeadersFooters slideHdd = ppt.getSlideHeadersFooters();
        assertFalse(slideHdd.isFooterVisible());
        assertNull(slideHdd.getFooterText());
        assertFalse(slideHdd.isSlideNumberVisible());
        assertFalse(slideHdd.isHeaderVisible());
        assertNull(slideHdd.getHeaderText());
        assertFalse(slideHdd.isUserDateVisible());
        assertNull(slideHdd.getDateTimeText());


        HeadersFooters notesHdd = ppt.getNotesHeadersFooters();
        assertFalse(notesHdd.isFooterVisible());
        assertNull(notesHdd.getFooterText());
        assertFalse(notesHdd.isHeaderVisible());
        assertNull(notesHdd.getHeaderText());
        assertFalse(notesHdd.isUserDateVisible());
        assertNull(notesHdd.getDateTimeText());

        for(HSLFSlide s : ppt.getSlides()) {
            HeadersFooters hd1 = s.getHeadersFooters();
            assertFalse(hd1.isFooterVisible());
            assertNull(hd1.getFooterText());
            assertFalse(hd1.isHeaderVisible());
            assertNull(hd1.getHeaderText());
            assertFalse(hd1.isUserDateVisible());
            assertNull(hd1.getDateTimeText());
        }
        
        ppt.close();
    }

    /**
     * Test extraction of headers / footers from PPTs saved in Office 2007
     */
    @Test
    public void testRead2007() throws IOException {
        InputStream is = _slTests.openResourceAsStream("headers_footers_2007.ppt");
        HSLFSlideShow ppt = new HSLFSlideShow(is);
        is.close();

        HeadersFooters slideHdd = ppt.getSlideHeadersFooters();
        assertTrue(slideHdd.isFooterVisible());
        assertEquals("THE FOOTER TEXT", slideHdd.getFooterText());
        assertTrue(slideHdd.isSlideNumberVisible());
        assertFalse(slideHdd.isHeaderVisible());
        assertNull(slideHdd.getHeaderText());
        assertTrue(slideHdd.isUserDateVisible());
        assertEquals("Wednesday, August 06, 2008", slideHdd.getDateTimeText());


        HeadersFooters notesHdd = ppt.getNotesHeadersFooters();
        assertTrue(notesHdd.isFooterVisible());
        assertEquals("THE NOTES FOOTER TEXT", notesHdd.getFooterText());
        assertTrue(notesHdd.isHeaderVisible());
        assertEquals("THE NOTES HEADER TEXT", notesHdd.getHeaderText());
        assertTrue(notesHdd.isUserDateVisible());
        assertTrue(notesHdd.isDateTimeVisible());
        //TODO: depending on the formatId getDateTimeText() should return formatted date
        //assertEquals("08/12/08", notesHdd.getDateTimeText());

        //per-slide headers / footers
        List<HSLFSlide> slide = ppt.getSlides();
        //the first slide uses presentation-scope headers / footers
        HeadersFooters hd1 = slide.get(0).getHeadersFooters();
        assertTrue(hd1.isFooterVisible());
        assertEquals("THE FOOTER TEXT", hd1.getFooterText());
        assertTrue(hd1.isSlideNumberVisible());
        assertFalse(hd1.isHeaderVisible());
        assertNull(hd1.getHeaderText());
        assertTrue(hd1.isUserDateVisible());
        assertTrue(hd1.isDateTimeVisible());
        assertEquals("Wednesday, August 06, 2008", hd1.getDateTimeText());

        //the second slide uses custom per-slide headers / footers
        HeadersFooters hd2 = slide.get(1).getHeadersFooters();
        assertTrue(hd2.isFooterVisible());
        assertEquals("THE FOOTER TEXT FOR SLIDE 2", hd2.getFooterText());
        assertTrue(hd2.isSlideNumberVisible());
        assertFalse(hd2.isHeaderVisible());
        assertNull(hd2.getHeaderText());
        assertTrue(hd2.isUserDateVisible());
        assertTrue(hd2.isDateTimeVisible());
        assertEquals("August 06, 2008", hd2.getDateTimeText());

        //the third slide uses per-slide headers / footers
        HeadersFooters hd3 = slide.get(2).getHeadersFooters();
        assertTrue(hd3.isFooterVisible());
        assertEquals("THE FOOTER TEXT", hd3.getFooterText());
        assertTrue(hd3.isSlideNumberVisible());
        assertFalse(hd3.isHeaderVisible());
        assertNull(hd3.getHeaderText());
        assertTrue(hd3.isUserDateVisible());
        assertTrue(hd3.isDateTimeVisible());
        assertEquals("Wednesday, August 06, 2008", hd3.getDateTimeText());

        ppt.close();
    }

    @Test
    public void testCreateSlideFooters() throws IOException {
        HSLFSlideShow ppt1 = new HSLFSlideShow();
        HeadersFooters hdd = ppt1.getSlideHeadersFooters();
        hdd.setFootersText("My slide footer");
        hdd.setSlideNumberVisible(true);

        HSLFSlideShow ppt2 = HSLFTestDataSamples.writeOutAndReadBack(ppt1);
        HeadersFooters hdd2 = ppt2.getSlideHeadersFooters();
        assertTrue(hdd2.isSlideNumberVisible());
        assertTrue(hdd2.isFooterVisible());
        assertEquals("My slide footer", hdd2.getFooterText());
        
        ppt2.close();
        ppt1.close();
    }

    @Test
    public void testCreateNotesFooters() throws IOException {
        HSLFSlideShow ppt1 = new HSLFSlideShow();
        HeadersFooters hdd = ppt1.getNotesHeadersFooters();
        hdd.setFootersText("My notes footer");
        hdd.setHeaderText("My notes header");
        hdd.setSlideNumberVisible(true);

        HSLFSlideShow ppt2 = HSLFTestDataSamples.writeOutAndReadBack(ppt1);
        HeadersFooters hdd2 = ppt2.getNotesHeadersFooters();
        assertTrue(hdd2.isSlideNumberVisible());
        assertTrue(hdd2.isFooterVisible());
        assertEquals("My notes footer", hdd2.getFooterText());
        assertTrue(hdd2.isHeaderVisible());
        assertEquals("My notes header", hdd2.getHeaderText());
        
        ppt2.close();
        ppt1.close();
    }
}
