package org.vandeseer.integrationtest;

import de.redsix.pdfcompare.CompareResult;
import de.redsix.pdfcompare.PdfComparator;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.font.PDType1Font;
import org.junit.Test;
import org.vandeseer.TestUtils;
import org.vandeseer.easytable.TableDrawer;
import org.vandeseer.easytable.structure.Row;
import org.vandeseer.easytable.structure.Table;
import org.vandeseer.easytable.structure.cell.TextCell;

import java.io.IOException;

import static junit.framework.TestCase.assertTrue;
import static org.apache.pdfbox.pdmodel.PDPageContentStream.AppendMode.APPEND;
import static org.apache.pdfbox.pdmodel.font.PDType1Font.HELVETICA;
import static org.vandeseer.TestUtils.getActualPdfFor;
import static org.vandeseer.TestUtils.getExpectedPdfFor;

public class FinalYTest {

    private static final String FILE_NAME = "finalY.pdf";

    @Test
    public void testFinalY() throws IOException {

        try (final PDDocument document = new PDDocument()) {
            for (int i = 0; i < 10; i++) {
                final PDPage page = new PDPage(PDRectangle.A4);
                try (final PDPageContentStream contentStream = new PDPageContentStream(document, page, APPEND, false)) {
                    contentStream.beginText();
                    contentStream.setFont(PDType1Font.HELVETICA, 12);
                    contentStream.newLineAtOffset(100, 100);
                    contentStream.showText("text number " + i);
                    contentStream.endText();
                }
                document.addPage(page);
            }

            for (int i = 0; i < document.getNumberOfPages(); i++) {
                try (final PDPageContentStream contentStream = new PDPageContentStream(document, document.getPage(i), APPEND, false)) {
                    TableDrawer tableDrawer = TableDrawer.builder()
                            .contentStream(contentStream)
                            .table(createHeaderTableForPage(i))
                            .startX(50)
                            .startY(document.getPage(i).getMediaBox().getHeight() - 50)
                            .build();
                    tableDrawer.draw();

                    contentStream.beginText();
                    contentStream.setFont(PDType1Font.HELVETICA, 12);
                    contentStream.newLineAtOffset(100, tableDrawer.getFinalY() - 12);
                    contentStream.showText("text after final y " + tableDrawer.getFinalY());
                    contentStream.endText();
                }
            }

            document.save(TestUtils.TARGET_FOLDER + "/" + FILE_NAME);
        }

        final CompareResult compareResult = new PdfComparator<>(getExpectedPdfFor(FILE_NAME), getActualPdfFor(FILE_NAME)).compare();
        assertTrue(compareResult.isEqual());
    }

    private static Table createHeaderTableForPage(int pageNumber) {
        return Table.builder()
                .addColumnsOfWidth(100, 100, 100, 100)
                .fontSize(8)
                .font(HELVETICA)
                .addRow(Row.builder()
                        .add(TextCell.builder().borderWidth(1).text("Header").build())
                        .add(TextCell.builder().borderWidth(1).text("of").build())
                        .add(TextCell.builder().borderWidth(1).text("Page").build())
                        .add(TextCell.builder().borderWidth(1).text(String.valueOf(pageNumber)).build())
                        .build())
                .build();
    }

}