import { expect } from "chai";

import { Formatter } from "export/formatter";

import { Body } from "./body";

describe("Body", () => {
    let body: Body;

    beforeEach(() => {
        body = new Body();
    });

    describe("#constructor()", () => {
        it("should create default section", () => {
            const formatted = new Formatter().format(body)["w:body"][0];
            expect(formatted)
                .to.have.property("w:sectPr")
                .and.to.be.an.instanceof(Array);
            expect(formatted["w:sectPr"]).to.have.length(4);
        });
    });

    describe("#addSection", () => {
        it("should add section with options", () => {
            body.addSection({
                width: 10000,
                height: 10000,
            });

            const formatted = new Formatter().format(body)["w:body"];
            expect(formatted).to.be.an.instanceof(Array);
            const defaultSectionPr = formatted[0]["w:p"][0]["w:pPr"][0]["w:sectPr"];

            // check that this is the default section and added first in paragraph
            expect(defaultSectionPr[0]).to.deep.equal({ "w:pgSz": { _attr: { "w:h": 16838, "w:w": 11906, "w:orient": "portrait" } } });

            // check for new section (since it's the last one, it's direct child of body)
            const newSection = formatted[1]["w:sectPr"];
            expect(newSection[0]).to.deep.equal({ "w:pgSz": { _attr: { "w:h": 10000, "w:w": 10000, "w:orient": "portrait" } } });
        });

        it("should add section with default parameters", () => {
            body.addSection({
                width: 10000,
                height: 10000,
            });

            const tree = new Formatter().format(body);

            expect(tree).to.deep.equal({
                "w:body": [
                    {
                        "w:p": [
                            {
                                "w:pPr": [
                                    {
                                        "w:sectPr": [
                                            { "w:pgSz": { _attr: { "w:w": 11906, "w:h": 16838, "w:orient": "portrait" } } },
                                            {
                                                "w:pgMar": {
                                                    _attr: {
                                                        "w:top": 1440,
                                                        "w:right": 1440,
                                                        "w:bottom": 1440,
                                                        "w:left": 1440,
                                                        "w:header": 708,
                                                        "w:footer": 708,
                                                        "w:gutter": 0,
                                                        "w:mirrorMargins": false,
                                                    },
                                                },
                                            },
                                            { "w:cols": { _attr: { "w:space": 708 } } },
                                            { "w:docGrid": { _attr: { "w:linePitch": 360 } } },
                                        ],
                                    },
                                ],
                            },
                        ],
                    },
                    {
                        "w:sectPr": [
                            { "w:pgSz": { _attr: { "w:w": 10000, "w:h": 10000, "w:orient": "portrait" } } },
                            {
                                "w:pgMar": {
                                    _attr: {
                                        "w:top": 1440,
                                        "w:right": 1440,
                                        "w:bottom": 1440,
                                        "w:left": 1440,
                                        "w:header": 708,
                                        "w:footer": 708,
                                        "w:gutter": 0,
                                        "w:mirrorMargins": false,
                                    },
                                },
                            },
                            { "w:cols": { _attr: { "w:space": 708 } } },
                            { "w:docGrid": { _attr: { "w:linePitch": 360 } } },
                        ],
                    },
                ],
            });
        });
    });

    describe("#getParagraphs", () => {
        it("should get no paragraphs", () => {
            const paragraphs = body.getParagraphs();

            expect(paragraphs).to.be.an.instanceof(Array);
        });
    });

    describe("#DefaultSection", () => {
        it("should get section", () => {
            const section = body.DefaultSection;

            const tree = new Formatter().format(section);
            expect(tree["w:sectPr"]).to.be.an.instanceof(Array);
        });
    });
});
