using System.Collections.Generic;
using UnityEngine;

namespace AlterchaseSDK
{
    [CreateAssetMenu(fileName = "New Mod Package", menuName = "Alterchase SDK/Mod Package", order = 100)]
    public class ModPackage : ScriptableObject
    {
        [Header("Package Info")]
        [SerializeField] private AlterchaseBarcode packageID;
        [SerializeField] private string packageName;
        [TextArea(3, 5)]
        [SerializeField] private string description;
        [SerializeField] private string authorName;
        [SerializeField] private string version = "1.0.0";
        [Tooltip("Recommended size: 512x288 pixels (16:9 ratio) for mod.io compatibility")]
        [SerializeField] private Texture2D packageIcon;
        [SerializeField] private string[] tags;

        [Header("Package Contents")]
        [SerializeField] private List<LevelModAsset> levels = new List<LevelModAsset>();
        [SerializeField] private List<ModelModAsset> models = new List<ModelModAsset>();
        [SerializeField] private List<EnemyModAsset> enemies = new List<EnemyModAsset>();

        [Header("Build Settings")]
        [SerializeField] private string buildOutputPath = "Builds/Mods";
        [SerializeField] private BuildTarget buildTarget = BuildTarget.StandaloneWindows64;

        public AlterchaseBarcode PackageID => packageID;
        public string PackageName => packageName;
        public string Description => description;
        public string AuthorName => authorName;
        public string Version => version;
        public Texture2D PackageIcon => packageIcon;
        public string[] Tags => tags;
        public List<LevelModAsset> Levels => levels;
        public List<ModelModAsset> Models => models;
        public List<EnemyModAsset> Enemies => enemies;
        public string BuildOutputPath => buildOutputPath;
        public BuildTarget BuildTarget => buildTarget;

        public int GetTotalAssetCount()
        {
            return levels.Count + models.Count + enemies.Count;
        }

        public List<ModAsset> GetAllAssets()
        {
            List<ModAsset> allAssets = new List<ModAsset>();
            allAssets.AddRange(levels);
            allAssets.AddRange(models);
            allAssets.AddRange(enemies);
            return allAssets;
        }

        public bool ValidatePackage(out List<string> errors)
        {
            errors = new List<string>();

            if (string.IsNullOrEmpty(packageName))
            {
                errors.Add("Package name cannot be empty.");
            }

            if (string.IsNullOrEmpty(authorName))
            {
                errors.Add("Author name cannot be empty.");
            }

            if (GetTotalAssetCount() == 0)
            {
                errors.Add("Package must contain at least one asset (Level, Model, or Enemy).");
            }

            foreach (var level in levels)
            {
                if (level != null && !level.ValidateAsset(out string error))
                {
                    errors.Add($"Level '{level.AssetName}': {error}");
                }
            }

            foreach (var model in models)
            {
                if (model != null && !model.ValidateAsset(out string error))
                {
                    errors.Add($"Model '{model.AssetName}': {error}");
                }
            }

            foreach (var enemy in enemies)
            {
                if (enemy != null && !enemy.ValidateAsset(out string error))
                {
                    errors.Add($"Enemy '{enemy.AssetName}': {error}");
                }
            }

            return errors.Count == 0;
        }

        private void OnValidate()
        {
            if (!packageID.IsValid())
            {
                packageID = AlterchaseBarcode.GenerateBarcode();
            }
        }
    }

    public enum BuildTarget
    {
        StandaloneWindows64,
        StandaloneOSX,
        StandaloneLinux64,
        Android,
        iOS
    }
}
