private static void ImportHandler(int deep, string parent, string path, bool overwrite, string destination, bool checkIndex = false)
        {
            foreach (DirectoryInfo folder in new DirectoryInfo(path).GetDirectories())
            {
                string dirName  = folder.Name;
                string infoPath = Path.Combine(path, dirName, dirName + ".info");

                if (File.Exists(infoPath))
                {
                    string[] nameSplit = dirName.Split('.');
                    string   oldId     = dirName.Split('.')[0];
                    string   newId;
                    if (overwrite || deep < 2)
                    {
                        newId = oldId;
                    }
                    else
                    {
                        newId = PathHelper.GenerateId(10);
                    }
                    if (nameSplit.Length < 2)
                    {
                        newId = PathHelper.GenerateId(10) + ".Folder" + random.Next(1000, 10000);
                    }

                    bool   copyInfo   = true;
                    string newDirName = dirName.Replace(oldId, newId);
                    if (!string.IsNullOrEmpty(destination))
                    {
                        string[] dest = destination.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries);
                        if (dest.Length > 0)
                        {
                            newDirName  = dest[0];
                            newId       = dest[0].Split('.')[0];
                            destination = destination.Replace(dest[0], "");
                            copyInfo    = false;
                        }
                    }

                    if (deep == 2)
                    {
                        tempIds.Add(new IdContainer(oldId, newId));
                    }

                    if (dirName != newDirName)
                    {
                        Directory.Move(Path.Combine(path, dirName), Path.Combine(path, newDirName));
                        infoPath = Path.Combine(path, newDirName, dirName + ".info");
                        if (copyInfo)
                        {
                            if (File.Exists(Path.Combine(path, newDirName, newDirName + ".info")))
                            {
                                File.Delete(Path.Combine(path, newDirName, newDirName + ".info"));
                            }
                            File.Move(infoPath, Path.Combine(path, newDirName, newDirName + ".info"));
                        }
                        else
                        {
                            File.Delete(infoPath);
                        }
                    }
                    ImportHandler(deep + 1, Path.Combine(parent, newDirName), folder.FullName.Replace(dirName, newDirName), overwrite, destination, checkIndex);
                }

                if (dirName == "topics")
                {
                    FileInfo[] folderFiles = folder.GetFiles();
                    int        filesCount  = 0;
                    if (checkIndex)
                    {
                        string repoPath    = Path.Combine(UsersHelper.GetUserFolder(), UsersHelper.GetToolsFolder()).Replace("\\", "/");
                        string newLocation = Path.Combine(repoPath, parent).Replace("\\", "/") + "/topics";

                        if (!Directory.Exists(newLocation))
                        {
                            Directory.CreateDirectory(newLocation);
                        }

                        filesCount = Directory.GetFiles(newLocation, "*", SearchOption.AllDirectories).Length;
                    }
                    int indexId = 0;
                    foreach (FileInfo t in folderFiles)
                    {
                        TopicModel    topic    = JsonConvert.DeserializeObject <TopicModel>(File.ReadAllText(t.FullName));
                        OldTopicModel oldTopic = JsonConvert.DeserializeObject <OldTopicModel>(File.ReadAllText(t.FullName));
                        if (!string.IsNullOrEmpty(oldTopic.pathToZip))
                        {
                            topic.localization = "default";
                            topic.pathToZip    = oldTopic.pathToZip;
                            //Debug.Log("Old import");
                        }
                        if (!string.IsNullOrEmpty(oldTopic.vmpPath))
                        {
                            topic.localization = "default";
                            topic.vmpPath      = oldTopic.vmpPath;
                            //Debug.Log("Old import");
                        }

                        if (string.IsNullOrEmpty(topic.unique_id))
                        {
                            topic.unique_id = PathHelper.GenerateId(6);
                        }

                        if (checkIndex)
                        {
                            topic.index = filesCount;
                        }

                        string oldTopicName = t.Name;
                        string newTopicName = "topic" + PathHelper.GenerateIntId(8) + ".info";

                        topic.localization = "default";
                        string locPath  = Path.Combine(Path.Combine(UsersHelper.GetUserFolder(), UsersHelper.GetToolsFolder()), parent, "default");
                        string tempPath = Path.Combine(t.Directory.Parent.FullName, "default");

                        if (!string.IsNullOrEmpty(topic.pathToZip))
                        {
                            string oldZipName = new FileInfo(topic.pathToZip).Name;
                            string newZipName = "zip" + PathHelper.GenerateIntId(8) + ".zip";
                            if (File.Exists(Path.Combine(tempPath, "pub_in", oldZipName)))
                            {
                                if (File.Exists(Path.Combine(tempPath, "pub_in", newZipName)))
                                {
                                    File.Delete(Path.Combine(tempPath, "pub_in", newZipName));
                                }
                                File.Move(Path.Combine(tempPath, "pub_in", oldZipName), Path.Combine(tempPath, "pub_in", newZipName));
                            }
                            topic.pathToZip        = Path.Combine(locPath, "pub_in", newZipName);
                            topic.pathToZip        = topic.pathToZip.Replace("\\", "/");
                            topic.pathToZipDEFAULT = Path.Combine(locPath, "pub_in", newZipName);
                            topic.pathToZipDEFAULT = topic.pathToZip.Replace("\\", "/");
                        }
                        if (!string.IsNullOrEmpty(topic.vmpPath))
                        {
                            string oldVmpName = new FileInfo(topic.vmpPath).Name;
                            string newVmpName = "obj" + PathHelper.GenerateIntId(8) + ".vmp";
                            if (File.Exists(Path.Combine(tempPath, "projects", oldVmpName)))
                            {
                                if (File.Exists(Path.Combine(tempPath, "projects", newVmpName)))
                                {
                                    File.Delete(Path.Combine(tempPath, "projects", newVmpName));
                                }
                                File.Move(Path.Combine(tempPath, "projects", oldVmpName), Path.Combine(tempPath, "projects", newVmpName));
                            }
                            if (File.Exists(Path.Combine(tempPath, "projects", oldVmpName.Replace(".vmp", ".vmb"))))
                            {
                                if (File.Exists(Path.Combine(tempPath, "projects", newVmpName.Replace(".vmp", ".vmb"))))
                                {
                                    File.Delete(Path.Combine(tempPath, "projects", newVmpName.Replace(".vmp", ".vmb")));
                                }
                                File.Move(Path.Combine(tempPath, "projects", oldVmpName.Replace(".vmp", ".vmb")), Path.Combine(tempPath, "projects", newVmpName.Replace(".vmp", ".vmb")));
                            }
                            topic.vmpPath        = Path.Combine(locPath, "projects", newVmpName);
                            topic.vmpPath        = topic.vmpPath.Replace("\\", "/");
                            topic.vmpPathDEFAULT = Path.Combine(locPath, "projects", newVmpName);
                            topic.vmpPathDEFAULT = topic.vmpPath.Replace("\\", "/");
                        }

                        topic.isOpened = 0;

                        //change path to zip and vmp
                        File.WriteAllText(t.FullName, JsonConvert.SerializeObject(topic));
                        //topic.index = folderFiles.Length;
                        if (File.Exists(t.FullName.Replace(oldTopicName, newTopicName)))
                        {
                            File.Delete(t.FullName.Replace(oldTopicName, newTopicName));
                        }
                        Thread.Sleep(100);
                        File.Move(t.FullName, t.FullName.Replace(oldTopicName, newTopicName));
                    }

                    if (!checkIndex)
                    {
                        List <TopicModel> topicModels = new List <TopicModel>();

                        foreach (FileInfo t in folder.GetFiles())
                        {
                            TopicModel topic = JsonConvert.DeserializeObject <TopicModel>(File.ReadAllText(t.FullName));
                            topic.infoPath = t.FullName;
                            topicModels.Add(topic);
                        }

                        topicModels = topicModels.OrderBy(t => t.index).ToList();
                        for (int i = 0; i < topicModels.Count; i++)
                        {
                            if (topicModels[i].index != i)
                            {
                                topicModels[i].index = i;
                                File.WriteAllText(topicModels[i].infoPath, JsonConvert.SerializeObject(topicModels[i]));
                            }
                        }
                    }
                }
            }
        }
        public static void Export(string res, string file, ExportType exportType)
        {
            if (string.IsNullOrEmpty(res))
            {
                return;
            }

            string root = file.Replace(PathHelper.GetRepoPath(), "").Replace("\\", "/");

            string[] rootParts = root.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries);

            if (!file.Contains(PathHelper.GetRepoPath()))
            {
                file = Path.Combine(PathHelper.GetRepoPath(), file);
            }

            TempFolderCreate();

            List <PathContainer> files = new List <PathContainer>();

            if (exportType == ExportType.Topic)
            {
                files = GetFilesTopic(file, Path.Combine(rootParts[0], rootParts[1], rootParts[2])).ToList();
                string categoryInfo = Path.Combine(rootParts[0], rootParts[0] + ".info");
                files.Add(new PathContainer(Path.Combine(PathHelper.GetRepoPath(), categoryInfo), categoryInfo));
                string productInfo = Path.Combine(rootParts[0], rootParts[1], rootParts[1] + ".info");
                files.Add(new PathContainer(Path.Combine(PathHelper.GetRepoPath(), productInfo), productInfo));
                string scenarioInfo = Path.Combine(rootParts[0], rootParts[1], rootParts[2], rootParts[2] + ".info");
                files.Add(new PathContainer(Path.Combine(PathHelper.GetRepoPath(), scenarioInfo), scenarioInfo));
            }
            else if (exportType == ExportType.Scenario)
            {
                files = GetFilesScenario(file, Path.Combine(rootParts[0], rootParts[1])).ToList();
                string categoryInfo = Path.Combine(rootParts[0], rootParts[0] + ".info");
                files.Add(new PathContainer(Path.Combine(PathHelper.GetRepoPath(), categoryInfo), categoryInfo));
                string productInfo = Path.Combine(rootParts[0], rootParts[1], rootParts[1] + ".info");
                files.Add(new PathContainer(Path.Combine(PathHelper.GetRepoPath(), productInfo), productInfo));
            }
            else if (exportType == ExportType.Product)
            {
                files = GetFilesProduct(file, rootParts[0]).ToList();
                string categoryInfo = Path.Combine(rootParts[0], rootParts[0] + ".info");
                files.Add(new PathContainer(Path.Combine(PathHelper.GetRepoPath(), categoryInfo), categoryInfo));
            }
            else if (exportType == ExportType.Category)
            {
                files = GetFilesCategory(file).ToList();
            }
            else if (exportType == ExportType.All)
            {
                files = GetFilesRepository().ToList();
            }

            foreach (PathContainer f in files)
            {
                string tempName = new FileInfo(f.relative).Name;
                string dirName  = f.relative.Replace(tempName, "");
                Directory.CreateDirectory(Path.Combine(GetTempFolderPath(), dirName));
                if (File.Exists(f.source))
                {
                    File.Copy(f.source, Path.Combine(GetTempFolderPath(), f.relative), true);
                }
            }

            string zipPath = res + ".zip";

            if (!Directory.Exists(Path.GetDirectoryName(zipPath)))
            {
                Directory.CreateDirectory(Path.GetDirectoryName(zipPath));
            }

            try
            {
                if (File.Exists(zipPath))
                {
                    File.Delete(zipPath);
                }
            }
            catch (Exception ex)
            {
                _logger.LogError($"Error deleting existing folder export ZIP.", ex);
            }

            ZipFile.CreateFromDirectory(GetTempFolderPath(), zipPath);

            PathHelper.DeleteDirectory(GetTempFolderPath());
        }