﻿using System;
using System.IO;
using JLGames.RocketDriver.CSharp.Utils;
#if UNITY_EDITOR
using UnityEditor;
#endif

namespace JLGames.RocketDriver.Actions.Utils
{
    public static class UnityPathUtil
    {
        /// <summary>
        /// Format to Unity path format
        /// 格式化为Unit路径格式
        /// </summary>
        /// <param name="path"></param>
        /// <returns></returns>
        public static string Format2UnityPath(string path)
        {
            return PathUtil.Format2LinuxPath(path);
        }


        /// <summary>
        /// Combine paths and convert to Unity path format
        /// 合并路径并转为Unity路径格式
        /// </summary>
        /// <param name="basePath"></param>
        /// <param name="path"></param>
        /// <param name="paths"></param>
        /// <returns></returns>
        public static string CombineUnityPath(string basePath, string path, params string[] paths)
        {
            return PathUtil.CombineLinuxPath(basePath, path, paths);
        }

        /// <summary>
        /// Convert Unity path to absolute path
        /// 转换Unity路径为绝对路径
        /// </summary>
        /// <param name="unityPath"></param>
        /// <param name="isFile"></param>
        /// <returns></returns>
        public static string UnityPath2AbsPath(string unityPath, bool isFile)
        {
            FileSystemInfo info;
            if (isFile)
                info = new FileInfo(unityPath);
            else
                info = new DirectoryInfo(unityPath);
            return info.Exists ? info.FullName : unityPath;
        }

        /// <summary>
        /// Compare two paths, often used for path ordering
        /// 比较两条路径，常用于路径排序
        /// Comparison condition: levels > folder > characters
        /// 比较条件：层级数 > 目录 > 字符
        /// </summary>
        /// <param name="path1"></param>
        /// <param name="path2"></param>
        /// <returns></returns>
        public static int ComparePath(string path1, string path2)
        {
#if UNITY_EDITOR
            var count1 = PathUtil.GetPathLevel(path1);
            var count2 = PathUtil.GetPathLevel(path2);
            if (count1 != count2)
                return count1 < count2 ? -1 : 1;
            var isFolder1 = AssetDatabase.IsValidFolder(path1);
            var isFolder2 = AssetDatabase.IsValidFolder(path2);
            if (isFolder1 == isFolder2)
                return string.Compare(path1, path2, StringComparison.OrdinalIgnoreCase);
            else
                return isFolder1 ? -1 : 1;
#else
            return PathUtil.ComparePath(path1, path2);
#endif
        }
    }
}