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

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;

import java.io.IOException;

import org.apache.poi.xwpf.XWPFTestDataSamples;
import org.apache.poi.xwpf.model.XWPFHeaderFooterPolicy;
import org.junit.Test;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTP;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTR;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTText;

public final class TestXWPFHeader {

    @Test
    public void testSimpleHeader() throws IOException {
        XWPFDocument sampleDoc = XWPFTestDataSamples.openSampleDocument("headerFooter.docx");

        XWPFHeaderFooterPolicy policy = sampleDoc.getHeaderFooterPolicy();

        XWPFHeader header = policy.getDefaultHeader();
        XWPFFooter footer = policy.getDefaultFooter();
        assertNotNull(header);
        assertNotNull(footer);
    }

    @Test
    public void testImageInHeader() throws IOException {
        XWPFDocument sampleDoc = XWPFTestDataSamples.openSampleDocument("headerPic.docx");

        XWPFHeaderFooterPolicy policy = sampleDoc.getHeaderFooterPolicy();

        XWPFHeader header = policy.getDefaultHeader();

        assertNotNull(header.getRelations());
        assertEquals(1, header.getRelations().size());
    }

    @Test
    public void testSetHeader() throws IOException {
        XWPFDocument sampleDoc = XWPFTestDataSamples.openSampleDocument("SampleDoc.docx");
        // no header is set (yet)
        XWPFHeaderFooterPolicy policy = sampleDoc.getHeaderFooterPolicy();
        assertNull(policy.getDefaultHeader());
        assertNull(policy.getFirstPageHeader());
        assertNull(policy.getDefaultFooter());
        assertNull(policy.getFirstPageFooter());

        CTP ctP1 = CTP.Factory.newInstance();
        CTR ctR1 = ctP1.addNewR();
        CTText t = ctR1.addNewT();
        String tText = "Paragraph in header";
        t.setStringValue(tText);

        // Commented MB 23 May 2010
        //CTP ctP2 = CTP.Factory.newInstance();
        //CTR ctR2 = ctP2.addNewR();
        //CTText t2 = ctR2.addNewT();
        //t2.setStringValue("Second paragraph.. for footer");

        // Create two paragraphs for insertion into the footer.
        // Previously only one was inserted MB 23 May 2010
        CTP ctP2 = CTP.Factory.newInstance();
        CTR ctR2 = ctP2.addNewR();
        CTText t2 = ctR2.addNewT();
        t2.setStringValue("First paragraph for the footer");

        CTP ctP3 = CTP.Factory.newInstance();
        CTR ctR3 = ctP3.addNewR();
        CTText t3 = ctR3.addNewT();
        t3.setStringValue("Second paragraph for the footer");

        XWPFParagraph p1 = new XWPFParagraph(ctP1, sampleDoc);
        XWPFParagraph[] pars = new XWPFParagraph[1];
        pars[0] = p1;

        XWPFParagraph p2 = new XWPFParagraph(ctP2, sampleDoc);
        XWPFParagraph p3 = new XWPFParagraph(ctP3, sampleDoc);
        XWPFParagraph[] pars2 = new XWPFParagraph[2];
        pars2[0] = p2;
        pars2[1] = p3;

        // Set headers
        XWPFHeader headerD = policy.createHeader(XWPFHeaderFooterPolicy.DEFAULT, pars);
        XWPFHeader headerF = policy.createHeader(XWPFHeaderFooterPolicy.FIRST);
        // Set a default footer and capture the returned XWPFFooter object.
        XWPFFooter footerD = policy.createFooter(XWPFHeaderFooterPolicy.DEFAULT, pars2);
        XWPFFooter footerF = policy.createFooter(XWPFHeaderFooterPolicy.FIRST);

        // Ensure the headers and footer were set correctly....
        assertNotNull(policy.getDefaultHeader());
        assertNotNull(policy.getFirstPageHeader());
        assertNotNull(policy.getDefaultFooter());
        assertNotNull(policy.getFirstPageFooter());
        // ....and that the footer object captured above contains two
        // paragraphs of text.
        assertEquals(2, footerD.getParagraphs().size());
        assertEquals(0, footerF.getParagraphs().size());

        // Check the header created with the paragraph got them, and the one
        // created without got none
        assertEquals(1, headerD.getParagraphs().size());
        assertEquals(tText, headerD.getParagraphs().get(0).getText());

        assertEquals(0, headerF.getParagraphs().size());

        // As an additional check, recover the defauls footer and
        // make sure that it contains two paragraphs of text and that
        // both do hold what is expected.
        footerD = policy.getDefaultFooter();
        XWPFParagraph[] paras = footerD.getParagraphs().toArray(new XWPFParagraph[0]);

        assertEquals(2, paras.length);
        assertEquals("First paragraph for the footer", paras[0].getText());
        assertEquals("Second paragraph for the footer", paras[1].getText());


        // Add some text to the empty header
        String fText1 = "New Text!";
        String fText2 = "More Text!";
        headerF.createParagraph().insertNewRun(0).setText(fText1);
        headerF.createParagraph().insertNewRun(0).setText(fText2);
//        headerF.getParagraphs().get(0).insertNewRun(0).setText(fText1);
    
        // Check it
        assertEquals(tText, headerD.getParagraphs().get(0).getText());
        assertEquals(fText1, headerF.getParagraphs().get(0).getText());
        assertEquals(fText2, headerF.getParagraphs().get(1).getText());


        // Save, re-open, ensure it's all still there
        XWPFDocument reopened = XWPFTestDataSamples.writeOutAndReadBack(sampleDoc);
        policy = reopened.getHeaderFooterPolicy();
        assertNotNull(policy.getDefaultHeader());
        assertNotNull(policy.getFirstPageHeader());
        assertNull(policy.getEvenPageHeader());
        assertNotNull(policy.getDefaultFooter());
        assertNotNull(policy.getFirstPageFooter());
        assertNull(policy.getEvenPageFooter());

        // Check the new headers still have their text
        headerD = policy.getDefaultHeader();
        headerF = policy.getFirstPageHeader();
        assertEquals(tText, headerD.getParagraphs().get(0).getText());
        assertEquals(fText1, headerF.getParagraphs().get(0).getText());
        assertEquals(fText2, headerF.getParagraphs().get(1).getText());

        // Check the new footers have their new text too
        footerD = policy.getDefaultFooter();
        paras = footerD.getParagraphs().toArray(new XWPFParagraph[0]);
        footerF = policy.getFirstPageFooter();

        assertEquals(2, paras.length);
        assertEquals("First paragraph for the footer", paras[0].getText());
        assertEquals("Second paragraph for the footer", paras[1].getText());
        assertEquals(1, footerF.getParagraphs().size());
    }

    @Test
    public void testSetWatermark() throws IOException {
        XWPFDocument sampleDoc = XWPFTestDataSamples.openSampleDocument("SampleDoc.docx");

        // No header is set (yet)
        XWPFHeaderFooterPolicy policy = sampleDoc.getHeaderFooterPolicy();
        assertNull(policy.getDefaultHeader());
        assertNull(policy.getFirstPageHeader());
        assertNull(policy.getDefaultFooter());

        policy.createWatermark("DRAFT");

        assertNotNull(policy.getDefaultHeader());
        assertNotNull(policy.getFirstPageHeader());
        assertNotNull(policy.getEvenPageHeader());

        // Re-open, and check
        XWPFDocument reopened = XWPFTestDataSamples.writeOutAndReadBack(sampleDoc);
        policy = reopened.getHeaderFooterPolicy();

        assertNotNull(policy.getDefaultHeader());
        assertNotNull(policy.getFirstPageHeader());
        assertNotNull(policy.getEvenPageHeader());
    }

    @Test
    public void testAddPictureData() {
        // TODO
    }

    @Test
    public void testGetAllPictures() {
        // TODO
    }

    @Test
    public void testGetAllPackagePictures() {
        // TODO
    }

    @Test
    public void testGetPictureDataById() {
        // TODO
    }

    @Test
    public void bug60293() throws Exception {
        //test handling of non-standard header/footer options
        XWPFDocument xwpf = XWPFTestDataSamples.openSampleDocument("60293.docx");
        assertEquals(3, xwpf.getHeaderList().size());
    }
}
