/*
 * Copyright 2020 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */
#include "tests/Test.h"

#ifdef SK_SUPPORT_PDF

#include "include/core/SkCanvas.h"
#include "include/core/SkFont.h"
#include "include/core/SkStream.h"
#include "include/docs/SkPDFDocument.h"

using PDFTag = SkPDF::StructureElementNode;

// Test building a tagged PDF where nodes are pruned.
// Add this to args.gn to output the PDF to a file:
//   extra_cflags = [ "-DSK_PDF_TEST_TAGS_OUTPUT_PATH=\"/tmp/pruning.pdf\"" ]
DEF_TEST(SkPDF_tagged_pruning, r) {
    REQUIRE_PDF_DOCUMENT(SkPDF_tagged, r);
#ifdef SK_PDF_TEST_TAGS_OUTPUT_PATH
    SkFILEWStream outputStream(SK_PDF_TEST_TAGS_OUTPUT_PATH);
#else
    SkDynamicMemoryWStream outputStream;
#endif

    SkSize pageSize = SkSize::Make(612, 792);  // U.S. Letter

    SkPDF::Metadata metadata;
    metadata.fTitle = "Example Tagged PDF";
    metadata.fCreator = "Skia";
    SkTime::DateTime now;
    SkTime::GetDateTime(&now);
    metadata.fCreation = now;
    metadata.fModified = now;

    // The document tag.
    auto root = std::make_unique<PDFTag>();
    root->fNodeId = 1;
    root->fTypeString = "Document";
    root->fLang = "en-US";

    // First paragraph.
    auto p1 = std::make_unique<PDFTag>();
    p1->fNodeId = 2;
    p1->fAdditionalNodeIds = {3, 4};
    p1->fTypeString = "P";
    root->fChildVector.push_back(std::move(p1));

    // Second paragraph.
    auto p2 = std::make_unique<PDFTag>();
    p2->fNodeId = 5;
    p2->fAdditionalNodeIds = {6, 7};
    p2->fTypeString = "P";
    root->fChildVector.push_back(std::move(p2));

    metadata.fStructureElementTreeRoot = root.get();
    sk_sp<SkDocument> document = SkPDF::MakeDocument(
        &outputStream, metadata);

    SkPaint paint;
    paint.setColor(SK_ColorBLACK);

    SkCanvas* canvas =
            document->beginPage(pageSize.width(),
                                pageSize.height());
    SkFont font(nullptr, 20);
    SkPDF::SetNodeId(canvas, 3);
    canvas->drawString("First paragraph line 1", 72, 72, font, paint);
    SkPDF::SetNodeId(canvas, 4);
    canvas->drawString("First paragraph line 2", 72, 108, font, paint);
    SkPDF::SetNodeId(canvas, 6);
    canvas->drawString("Second paragraph line 1", 72, 180, font, paint);
    SkPDF::SetNodeId(canvas, 7);
    canvas->drawString("Second paragraph line 2", 72, 216, font, paint);

    document->endPage();
    document->close();
    outputStream.flush();
}

#endif
