using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;

namespace SimplifyXR
{
    [CreateAssetMenu(fileName = "MenuMap",
        menuName = "SimpleAR Pro/Standard Toolbox Assets/Menu Map", order = 1)]
    public class MenuMap : ScriptableObject
    {
        public List<Category> map;


        public List<IMenuItem> GetMenuItemsFromCategories()
        {
            var items = new List<IMenuItem>();
            var paths = GetMenuPaths();

            map.ForEach(c =>
            {
                c.menuPath = GetPathForCategory(c,paths, c);
                items.Add(c);
                items = GetItemsRecursive(c, items, paths);
            });

            return items;
        }

        string GetPathForCategory(Category c, List<string> paths, Category top)
        {
            var path = "";
            paths?.ToList()?.ForEach(p =>
            {
                var containsCat = p.Contains(c.categoryName)
                && (p.Contains(top.categoryName)  && (p.Contains(top.menuPath)));

                if (containsCat)
                {
                    var trimEnd = p.IndexOf(c.categoryName);
                    path = p.Substring(0,trimEnd);
                }
            });
            return path;
        }

        List<IMenuItem> GetItemsRecursive(Category c,
            List<IMenuItem> items, 
            List<string> paths)
        {
            c.levelCategories.ForEach(subc =>
            {
                subc.menuPath = GetPathForCategory(subc, paths, c);
                items.Add(subc);
                items = GetItemsRecursive(subc, items, paths);
            });

            return items;
        }


        /// <summary>
        /// Recursively get all possible menu paths from the map
        /// </summary>
        /// <param name="category"></param>
        /// <param name="path"></param>
        /// <param name="previousPath"></param>
        /// <param name="paths"></param>
        /// <param name="startPath"></param>
        /// <returns></returns>
        public List<string> GetMenuPaths()
        {
            List<string> menuPaths = new List<string>();

            map.ForEach(category =>
            {
                menuPaths = GetPathsRecursive(
                    category,
                    category.categoryName,
                    category.categoryName,
                    menuPaths,
                    category.categoryName);                
            });

            return menuPaths;
        }     


        List<string> GetPathsRecursive(
            Category category, 
            string path,
            string previousPath,
            List<string> paths, 
            string startPath)
        {

            var initialPath = path;

            category.levelCategories.ForEach(c =>
            {
                var currentPath = path;
                path += "/" + c.categoryName;

                if (c.levelCategories == null || c.levelCategories.Count == 0)
                {
                    paths.Add(path);
                }
                else
                {
                    GetPathsRecursive(c, path, initialPath, paths, startPath);
                }
                path = currentPath;

            });

         return paths;
        }
    }
}

