using System.IO;
using UnityEditor;
using UnityEngine;
using Ashwild.Building;
namespace Ashwild.EditorTools
{
///
/// Editor-only factory that creates BuildableData assets for the Ashwild Database window.
/// Kept separate from the window so buildable authoring stays a single-purpose, testable helper —
/// mirrors RecipeAssetFactory for recipes and ItemAssetFactory for items.
///
public static class BuildableAssetFactory
{
#region Constants
private const string BuildablesFolder = "Assets/GAME/ScriptableObjects/Buildables";
#endregion
#region Buildable Asset
///
/// Creates a fresh BuildableData asset under the buildables folder with a unique name, seeding
/// its display name so the new asset is immediately coherent in the menu list. Returns the asset
/// for selection, or null if the folder cannot be made.
///
public static BuildableData CreateBuildable(string desiredName)
{
if (!EnsureFolder(BuildablesFolder)) return null;
string safeName = string.IsNullOrWhiteSpace(desiredName) ? "NewBuildable" : desiredName.Trim();
string assetPath = AssetDatabase.GenerateUniqueAssetPath($"{BuildablesFolder}/{safeName}.asset");
BuildableData buildable = ScriptableObject.CreateInstance();
AssetDatabase.CreateAsset(buildable, assetPath);
SerializedObject so = new SerializedObject(buildable);
so.FindProperty("displayName").stringValue = safeName;
so.ApplyModifiedPropertiesWithoutUndo();
EditorUtility.SetDirty(buildable);
AssetDatabase.SaveAssets();
return buildable;
}
#endregion
#region Internal Helpers
///
/// Ensures a project-relative asset folder exists, creating any missing segments. Returns
/// false (and logs) when the path cannot be created.
///
private static bool EnsureFolder(string folder)
{
if (AssetDatabase.IsValidFolder(folder)) return true;
string parent = Path.GetDirectoryName(folder).Replace('\\', '/');
string leaf = Path.GetFileName(folder);
if (!EnsureFolder(parent))
{
Debug.LogError($"[BuildableAssetFactory] Could not create folder '{folder}'.");
return false;
}
AssetDatabase.CreateFolder(parent, leaf);
return AssetDatabase.IsValidFolder(folder);
}
#endregion
}
}