﻿using UnityEngine;
using UnityEngine.Rendering;

namespace BlackBox
{
    
    public partial class BlackBoxConfigAsset : ScriptableObject
    {
        [SerializeField, HideInInspector]
        private bool enableLogs_ = true;
        
        [SerializeField, HideInInspector]
        private ConfigOption config_option_ = ConfigOption.Local;
        
        [SerializeField, HideInInspector]
        private bool enableCrashReporter_ = true;
        
        [SerializeField, HideInInspector]
        private bool enableBasicProfiling_ = true;
        
        [SerializeField, HideInInspector]
        private bool storeHardwareInformation_ = true;
        
        [SerializeField, HideInInspector]
        private bool autoInitialize_ = true;
        
        public static string DEFAULT_URL = "https://blackbox.accelbyte.io";
        
        [SerializeField, HideInInspector]
        private Platform platform_ = Platform.Default;
        
        [SerializeField]
        private bool overrideGraphicsApi_ = false;

        // Hide if overrideGraphicsApi_ is false
        [SerializeField]
        private GraphicsApi graphicsApi_;
        
        // Hide if overrideGraphicsApi_ is false
        /// <summary>
        /// Right now the BlackBox core only supports Direct3D11 & Direct3D12.
        /// Anything other than the options above will result to using the NULL_IMPL in the BlackBox Core.
        /// </summary>
        [SerializeField]
        private GraphicsDeviceType graphicsDeviceType_;

        public bool EnableLogs
        {
            get { return enableLogs_; }
            set
            {
                enableLogs_ = value;
            }
        }
        public ConfigOption ConfigOption
        {
            get { return config_option_; }
            set
            {
                config_option_ = value;
            }
        }
        
        public bool EnableCrashReporter
        {
            get { return enableCrashReporter_; }
            set { enableCrashReporter_ = value; }
        }
        
        public bool EnableBasicProfiling
        {
            get { return enableBasicProfiling_; }
            set
            {
                enableBasicProfiling_ = value;
            }
        }
        
        public bool StoreHardwareInformation
        {
            get { return storeHardwareInformation_; }
            set
            {
                storeHardwareInformation_ = value;
            }
        }

        public bool AutoInitialize
        {
            get { return autoInitialize_; }
            set
            {
                autoInitialize_ = value;
            }
        }
        
        public Platform Platform
        {
            get { return platform_; }
            set
            {
                platform_ = value;
            }
        }

        public static BlackBoxConfigAsset LoadBlackBoxConfigAsset()
        {
            BlackBoxConfigAsset instance = Resources.Load<BlackBoxConfigAsset>("BlackBox/BlackBoxConfigAsset");
            if (instance == null)
            {
                instance = CreateInstance<BlackBoxConfigAsset>();
                CreateInstanceAsset(instance);
                instance.Save();
            }

            return instance;
        }
        
        public int GraphicsApi
        {
            get
            {
                if (overrideGraphicsApi_)
                    return (int)graphicsApi_;
                
                return SystemInfo.graphicsDeviceID;
            }
        }

        public int GraphicsDeviceType
        {
            get
            {
                if (overrideGraphicsApi_)
                    return (int)graphicsDeviceType_;
                
                return (int)SystemInfo.graphicsDeviceType;
            }
        }
    }
}