// tslint:disable:object-literal-key-quotes
import { expect } from "chai";
import { stub } from "sinon";

import { Formatter } from "export/formatter";

import { File } from "../file";
import { Paragraph } from "../paragraph";
import { Media } from "./media";

describe("Media", () => {
    describe("#addImage", () => {
        it("should add image", () => {
            const file = new File();
            const image = Media.addImage(file, "");

            let tree = new Formatter().format(new Paragraph(image));
            expect(tree["w:p"]).to.be.an.instanceof(Array);

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

        it("should ensure the correct relationship id is used when adding image", () => {
            // tslint:disable-next-line:no-any
            stub(Media as any, "generateId").callsFake(() => "testId");

            const file = new File();
            const image1 = Media.addImage(file, "test");
            const tree = new Formatter().format(new Paragraph(image1));
            const inlineElements = tree["w:p"][0]["w:r"][0]["w:drawing"][0]["wp:inline"];
            const graphicData = inlineElements.find((x) => x["a:graphic"]);

            expect(graphicData["a:graphic"][1]["a:graphicData"][1]["pic:pic"][2]["pic:blipFill"][0]["a:blip"]).to.deep.equal({
                _attr: {
                    "r:embed": `rId{testId.png}`,
                    cstate: "none",
                },
            });

            const image2 = Media.addImage(file, "test");
            const tree2 = new Formatter().format(new Paragraph(image2));
            const inlineElements2 = tree2["w:p"][0]["w:r"][0]["w:drawing"][0]["wp:inline"];
            const graphicData2 = inlineElements2.find((x) => x["a:graphic"]);

            expect(graphicData2["a:graphic"][1]["a:graphicData"][1]["pic:pic"][2]["pic:blipFill"][0]["a:blip"]).to.deep.equal({
                _attr: {
                    "r:embed": `rId{testId.png}`,
                    cstate: "none",
                },
            });
        });
    });

    describe("#addMedia", () => {
        it("should add media", () => {
            // tslint:disable-next-line:no-any
            (Media as any).generateId = () => "test";

            const image = new Media().addMedia("");
            expect(image.fileName).to.equal("test.png");
            expect(image.dimensions).to.deep.equal({
                pixels: {
                    x: 100,
                    y: 100,
                },
                emus: {
                    x: 952500,
                    y: 952500,
                },
            });
        });

        it("should return UInt8Array if atob is present", () => {
            // tslint:disable-next-line
            ((process as any).atob as any) = () => "atob result";
            // tslint:disable-next-line:no-any
            (Media as any).generateId = () => "test";

            const image = new Media().addMedia("");
            expect(image.stream).to.be.an.instanceof(Uint8Array);
        });
    });

    describe("#getMedia", () => {
        it("should get media", () => {
            // tslint:disable-next-line:no-any
            (Media as any).generateId = () => "test";

            const media = new Media();
            media.addMedia("");

            const image = media.getMedia("test.png");

            expect(image.fileName).to.equal("test.png");
            expect(image.dimensions).to.deep.equal({
                pixels: {
                    x: 100,
                    y: 100,
                },
                emus: {
                    x: 952500,
                    y: 952500,
                },
            });
        });

        it("Get media", () => {
            const media = new Media();

            expect(() => media.getMedia("test.png")).to.throw();
        });
    });

    describe("#Array", () => {
        it("Get images as array", () => {
            // tslint:disable-next-line:no-any
            (Media as any).generateId = () => "test";

            const media = new Media();
            media.addMedia("");

            const array = media.Array;
            expect(array).to.be.an.instanceof(Array);
            expect(array.length).to.equal(1);

            const image = array[0];
            expect(image.fileName).to.equal("test.png");
            expect(image.dimensions).to.deep.equal({
                pixels: {
                    x: 100,
                    y: 100,
                },
                emus: {
                    x: 952500,
                    y: 952500,
                },
            });
        });
    });
});
