using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using iText.Kernel.Pdf;
using iText.Kernel.Pdf.Annot;
using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;

namespace PDF3D.Addin
{
    [Transaction(TransactionMode.Manual)]
    public class ExportCmd : IExternalCommand
    {
        public static string PDF = @"D:\OneDrive\Code\Private\PDFGenerator\PDF3D.Addin\bin" + @"\\Pdf3D.pdf";
        public static string U3D = Directory.GetParent(Assembly.GetExecutingAssembly().Location) + @"\\test.u3d";
        public static string IDTF = Directory.GetParent(Assembly.GetExecutingAssembly().Location) + @"\\test.IDTF";
        public static string PDFTool = Directory.GetParent(Assembly.GetExecutingAssembly().Location) + @"\\PDFGenerator.exe";
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            UIDocument uIDocument = commandData.Application.ActiveUIDocument;
            Document doc = uIDocument.Document;

            try
            {
                var elems = uIDocument.Selection.PickObjects(Autodesk.Revit.UI.Selection.ObjectType.Element).Select(x => doc.GetElement(x)).ToList();

                SaveFileDialog fileDialog = new SaveFileDialog()
                {
                    Filter = "Adobe 3dPdf Files (*.pdf)|*.pdf"
                };
                if (fileDialog.ShowDialog() == true)
                {
                    var idtf = Path.GetTempFileName();

                    IDTFBuilder iDTFBuilder = new IDTFBuilder(doc);

                    var categorys = elems.GroupBy(x => x.Category.Name);
                    foreach (var category in categorys)
                    {
                        iDTFBuilder.InsertGroup(category.Key);
                    }

                    foreach (var item in elems)
                    {
                        iDTFBuilder.InsertElement(item);
                    }

                    //var views = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Views).OfClass(typeof(View3D)).Cast<View3D>().ToList();
                    //foreach (var item in views)
                    //{
                    //    iDTFBuilder.InsertView(item);
                    //}

                    iDTFBuilder.Export(idtf);

                    GeneratePDF(idtf,fileDialog.FileName);
                }
            }
            catch
            {

            }

            return Result.Succeeded;
        }

        public IEnumerable<Solid> GetSolids(GeometryObject go)
        {
            if (go is GeometryElement ge)
            {
                foreach (GeometryObject item in ge)
                {
                    foreach (var g in GetSolids(item))
                    {
                        yield return g;
                    }
                }
            }
            if (go is Solid solid)
            {
                yield return solid;
            }
            yield return null;
        }

        public void GeneratePDF(string idtf,string pdf)
        {
            System.Diagnostics.Process exep = new System.Diagnostics.Process();
            System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
            startInfo.FileName = PDFTool;
            startInfo.Arguments = $"\"{idtf}\" \"{pdf}\"";
            startInfo.CreateNoWindow = true;
            startInfo.UseShellExecute = false;
            exep.StartInfo = startInfo;
            exep.Start();
            exep.WaitForExit();
        }
    }
}
