#if UNITY_EDITOR
using System;
using UnityEngine;

namespace ConjureOS.MetadataWindow
{
    [Serializable]
    public class ConjureArcadeMetadata : ScriptableObject
    {
        // Save location
        public const string MetadataAssetPath = "Assets/ConjureOS/Scripts/MetadataWindow/ConjureArcadeMetadata.asset";

        // Properties Validation
        public const int GameTitleLimit = 100;
        public const int DescriptionLimit = 250;
        public const int DevelopersNameLimit = 100;
        public const int MaxSelectedGenres = 3;
        public const float MaxThumbnailFileSize = 1024; // In Kb
        public const float MaxGameplayImageFileSize = 1024; // In Kb
        public static readonly float[] RequiredThumbnailAR = { 16f, 9f }; // Aspect Ratio
        public static readonly float[] RequiredGameplayImageAR = { 1f, 1f }; // Aspect Ratio
        public static readonly string[] GenreOptions =
        {
            "Platformer", "Shooter", "Fighting", "Beat 'em up", "Stealth", "Survival",
            "Rhythm", "Horror", "Metroidvania", "Puzzle", "RPG", "Roguelike",
            "Simulation", "Strategy", "Action", "Adventure", "RTS", "MOBA",
            "Battle Royale", "Racing", "Sports", "Board", "Idle", "Trivia",
            "Art", "Educational", "Sandbox", "Open World", "Other"
        };

        // Editable settings
        [SerializeField, HideInInspector]
        [Tooltip("The title of the game. Can't exceed 100 characters.")]
        private string gameTitle;
        public string GameTitle => gameTitle;

        [SerializeField, HideInInspector]
        [Tooltip("Current version of the game. Must follow the format 'x.x.x' where x are either numbers or letters.")]
        private string version;
        public string Version => version;

        [SerializeField, HideInInspector]
        [TextArea]
        [Tooltip("Small description of the game. Can't exceed 250 characters.")]
        private string description;
        public string Description => description;

        [SerializeField, HideInInspector]
        [Tooltip("The minimum required number of players to play the game.")]
        private int minNumPlayer = 1;
        public int MinNumPlayer => minNumPlayer;

        [SerializeField, HideInInspector]
        [Tooltip("The maximum required number of players to play the game.")]
        private int maxNumPlayer = 1;
        public int MaxNumPlayer => maxNumPlayer;

        [SerializeField, HideInInspector]
        [Tooltip("Indicates if the game uses a leaderboard.")]
        private bool useLeaderboard;
        public bool UseLeaderboard => useLeaderboard;

        [SerializeField, HideInInspector]
        [Tooltip("Thumbnail image of the game. Displayed in the game selection screen. The image format must be 16:9, and its size can't exceed 1 MB.")]
        private Texture2D thumbnail;
        public Texture2D Thumbnail => thumbnail;

        [SerializeField, HideInInspector]
        [Tooltip("An image that shows what the game looks like. The image format must be 1:1, and its size can't exceed 1 MB.")]
        private Texture2D gameplayImage;
        public Texture2D GameplayImage => gameplayImage;

        [SerializeField, HideInInspector]
        [Tooltip("The names of the game developers.")]
        private string[] developers;
        public string[] Developers => developers;

        [SerializeField, HideInInspector]
        [Tooltip("Genres associated with the game.")]
        private GameGenre[] genres;
        public GameGenre[] Genres => genres;

        
        // Uneditable settings
        [SerializeField, HideInInspector]
        private string id;
        public string Id => id;

        [SerializeField, HideInInspector]
        private DateTime releaseDate;
        public DateTime ReleaseDate => releaseDate;

        [SerializeField, HideInInspector]
        private DateTime lastGameUpdate;
        public DateTime LastGameUpdate => lastGameUpdate;

        /// <summary>
        /// Updates all uneditable settings 
        /// </summary>
        public void UpdateUneditableData()
        {
            // Generate GUID
            if (string.IsNullOrEmpty(id))
            {
                id = Guid.NewGuid().ToString();
            }

            // Generate dates
            if (releaseDate == DateTime.MinValue)
            {
                releaseDate = DateTime.Now;
            }

            lastGameUpdate = DateTime.Now;
        }
    }
}
#endif