/* ====================================================================
   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 org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.xwpf.XWPFTestDataSamples;
import org.junit.jupiter.api.Test;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.math.BigInteger;
import java.util.Calendar;

import static org.junit.jupiter.api.Assertions.*;

class TestXWPFComment {

    @Test
    void testText() throws IOException {
        try (XWPFDocument doc = XWPFTestDataSamples.openSampleDocument("comment.docx")) {
            assertEquals(1, doc.getComments().length);
            XWPFComment comment = doc.getComments()[0];
            assertEquals("Unbekannter Autor", comment.getAuthor());
            assertEquals("0", comment.getId());
            assertEquals("This is the first line\n\nThis is the second line", comment.getText());
        }
    }

    @Test
    public void testAddComment() throws IOException {
        BigInteger cId = BigInteger.valueOf(0);
        Calendar date = Calendar.getInstance();
        try (XWPFDocument docOut = new XWPFDocument()) {
            assertNull(docOut.getDocComments());

            XWPFComments comments = docOut.createComments();
            XWPFComment comment = comments.createComment(cId);
            comment.setAuthor("Author");
            comment.setInitials("s");
            comment.setDate(date);

            XWPFDocument docIn = XWPFTestDataSamples.writeOutAndReadBack(docOut);
            assertEquals(1, docIn.getComments().length);
            comment = docIn.getCommentByID(cId.toString());
            assertNotNull(comment);
            assertEquals("Author", comment.getAuthor());
            assertEquals("s", comment.getInitials());
            assertEquals(date.getTimeInMillis(), comment.getDate().getTimeInMillis());
        }
    }

    @Test
    void testRemoveComment() throws IOException {
        try (XWPFDocument doc = XWPFTestDataSamples.openSampleDocument("comment.docx")) {
            assertEquals(1, doc.getComments().length);

            doc.getDocComments().removeComment(0);

            XWPFDocument docIn = XWPFTestDataSamples.writeOutAndReadBack(doc);
            assertEquals(0, docIn.getComments().length);
        }
    }

    @Test
    void testCreateParagraph() throws IOException {
        try (XWPFDocument doc = new XWPFDocument()) {
            XWPFComments comments = doc.createComments();
            XWPFComment comment = comments.createComment(BigInteger.ONE);
            XWPFParagraph paragraph = comment.createParagraph();
            paragraph.createRun().setText("comment paragraph text");

            XWPFDocument docIn = XWPFTestDataSamples.writeOutAndReadBack(doc);
            XWPFComment xwpfComment = docIn.getCommentByID("1");
            assertEquals(1, xwpfComment.getParagraphs().size());
            String text = xwpfComment.getParagraphArray(0).getText();
            assertEquals("comment paragraph text", text);
        }
    }

    @Test
    void testAddPicture() throws IOException, InvalidFormatException {
        try (XWPFDocument doc = new XWPFDocument()) {
            XWPFComments comments = doc.createComments();
            XWPFComment comment = comments.createComment(BigInteger.ONE);
            XWPFParagraph paragraph = comment.createParagraph();
            XWPFRun r = paragraph.createRun();
            r.addPicture(new ByteArrayInputStream(new byte[0]),
                    Document.PICTURE_TYPE_JPEG, "test.jpg", 21, 32);

            assertEquals(1, comments.getAllPictures().size());
            assertEquals(1, doc.getAllPackagePictures().size());
        }
    }

    @Test
    void testCreateTable() throws IOException {
        try (XWPFDocument doc = new XWPFDocument()) {
            XWPFComments comments = doc.createComments();
            XWPFComment comment = comments.createComment(BigInteger.ONE);
            comment.createTable(1, 1);

            XWPFDocument docIn = XWPFTestDataSamples.writeOutAndReadBack(doc);
            XWPFComment xwpfComment = docIn.getCommentByID("1");
            assertEquals(1, xwpfComment.getTables().size());
        }
    }
}
