﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Xml;
using System.Xml.Linq;
using DocumentFormat.OpenXml.Packaging;
using OpenXmlPowerTools;

namespace ExampleDocumentBuilder04
{
    class ContentControlsExample
    {
        static void Main(string[] args)
        {
            var n = DateTime.Now;
            var tempDi = new DirectoryInfo(string.Format("ExampleOutput-{0:00}-{1:00}-{2:00}-{3:00}{4:00}{5:00}", n.Year - 2000, n.Month, n.Day, n.Hour, n.Minute, n.Second));
            tempDi.Create();

            WmlDocument solarSystemDoc = new WmlDocument("../../solar-system.docx");
            using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(solarSystemDoc))
            using (WordprocessingDocument solarSystem = streamDoc.GetWordprocessingDocument())
            {
                // get children elements of the <w:body> element
                var q1 = solarSystem
                    .MainDocumentPart
                    .GetXDocument()
                    .Root
                    .Element(W.body)
                    .Elements();

                // project collection of tuples containing element and type
                var q2 = q1
                    .Select(
                        e =>
                        {
                            string keyForGroupAdjacent = ".NonContentControl";
                            if (e.Name == W.sdt)
                                keyForGroupAdjacent = e.Element(W.sdtPr)
                                    .Element(W.tag)
                                    .Attribute(W.val)
                                    .Value;
                            if (e.Name == W.sectPr)
                                keyForGroupAdjacent = null;
                            return new
                            {
                                Element = e,
                                KeyForGroupAdjacent = keyForGroupAdjacent
                            };
                        }
                    ).Where(e => e.KeyForGroupAdjacent != null);

                // group by type
                var q3 = q2.GroupAdjacent(e => e.KeyForGroupAdjacent);

                // temporary code to dump q3
                foreach (var g in q3)
                    Console.WriteLine("{0}:  {1}", g.Key, g.Count());
                //Environment.Exit(0);


                // validate existence of files referenced in content controls
                foreach (var f in q3.Where(g => g.Key != ".NonContentControl"))
                {
                    string filename = "../../" + f.Key + ".docx";
                    FileInfo fi = new FileInfo(filename);
                    if (!fi.Exists)
                    {
                        Console.WriteLine("{0} doesn't exist.", filename);
                        Environment.Exit(0);
                    }
                }

                // project collection with opened WordProcessingDocument
                var q4 = q3
                    .Select(g => new
                    {
                        Group = g,
                        Document = g.Key != ".NonContentControl" ?
                            new WmlDocument("../../" + g.Key + ".docx") :
                            solarSystemDoc
                    });

                // project collection of OpenXml.PowerTools.Source
                var sources = q4
                    .Select(
                        g =>
                        {
                            if (g.Group.Key == ".NonContentControl")
                                return new Source(
                                    g.Document,
                                    g.Group
                                        .First()
                                        .Element
                                        .ElementsBeforeSelf()
                                        .Count(),
                                    g.Group
                                        .Count(),
                                    false);
                            else
                                return new Source(g.Document, false);
                        }
                    ).ToList();

                DocumentBuilder.BuildDocument(sources, Path.Combine(tempDi.FullName, "solar-system-new.docx"));
            }
        }
    }
}
