﻿using System;
using System.Collections.Generic;
using System.IO;
using JLGames.RocketDriver.Actions.Utils;
using JLGames.RocketDriver.CSharp.Utils;
using UnityEditor;
using UnityEngine;

namespace JLGames.RocketDriver.Editor.Infra
{
    [Serializable]
    public class ExportPackageItem
    {
        public string Name;
        public bool Interactive = false;
        public bool Recurse = true;
        public bool IncludeDependencies = false;
        public bool IncludeLibraryAssets = false;
        public List<string> AssetPaths = new List<string>();
        public string ExportDir = "../Export";
        public string PackageName;
        public string PackageVersion;

        public ExportPackageOptions PackageOptions
        {
            get
            {
                var rs = ExportPackageOptions.Default;
                if (Interactive) rs = rs | ExportPackageOptions.Interactive;
                if (Recurse) rs = rs | ExportPackageOptions.Recurse;
                if (IncludeDependencies) rs = rs | ExportPackageOptions.IncludeDependencies;
                if (IncludeLibraryAssets) rs = rs | ExportPackageOptions.IncludeLibraryAssets;
                return rs;
            }
        }

        public string FileName
        {
            get
            {
                if (string.IsNullOrEmpty(PackageVersion))
                    return $"{PackageName}.unitypackage";
                else
                    return $"{PackageName} - {PackageVersion}.unitypackage";
            }
        }

        public string PackageExprotDir => PathUtil.IsAbsPath(ExportDir) ? ExportDir : UnityPathUtil.CombineUnityPath(Application.dataPath, ExportDir);

        public string PackageFilePath
        {
            get
            {
                var filePath = UnityPathUtil.CombineUnityPath(PackageExprotDir, FileName);
                return UnityPathUtil.Format2UnityPath(Path.GetFullPath(filePath));
            }
        }

        public void SetOptions(ExportPackageOptions options)
        {
            Interactive = (options & ExportPackageOptions.Interactive) > 0;
            Recurse = (options & ExportPackageOptions.Recurse) > 0;
            IncludeDependencies = (options & ExportPackageOptions.IncludeDependencies) > 0;
            IncludeLibraryAssets = (options & ExportPackageOptions.IncludeLibraryAssets) > 0;
        }

        public void SetAssetPaths(IEnumerable<string> assetPaths)
        {
            AssetPaths.Clear();
            AssetPaths.AddRange(assetPaths);
        }

        public void SortAssetPaths()
        {
            AssetPaths.Sort(UnityPathUtil.ComparePath);
        }
    }
}