using System.IO;
using Platform101XP.Editor.Settings.Assets;
using Platform101XP.Editor.Settings.Utilities;

namespace Platform101XP.Editor.Settings.Repositories
{
    public class BaseSettingsRepository
    {
        private const string ASSET_NAME = "P101XPSettingsBase.asset";
        private readonly BaseSettingsAsset asset;

        public BaseSettingsRepository(string storageDirectory)
        {
            var assetPath = Path.Combine(storageDirectory, ASSET_NAME);
            asset = AssetUtility.CreateOrLoadAsset<BaseSettingsAsset>(assetPath);
        }

        // Base.
        public string ClientId
        {
            get => asset.clientId;
            set
            {
                if (asset.clientId == value) return;
                asset.clientId = value;
                Save();
            }
        }

        public string AppName
        {
            get => asset.appName;
            set
            {
                if (asset.appName == value) return;
                asset.appName = value;
                Save();
            }
        }

        public string AppConfigName
        {
            get => asset.appConfigName;
            set
            {
                if (asset.appConfigName == value) return;
                asset.appConfigName = value;
                Save();
            }
        }

        public bool DevMode
        {
            get => asset.devMode;
            set
            {
                if (asset.devMode == value) return;
                asset.devMode = value;
                Save();
            }
        }

        // Web Store.
        public string WebStoreProjectName
        {
            get => asset.webStoreProjectName;
            set
            {
                if (asset.webStoreProjectName == value) return;
                asset.webStoreProjectName  = value;
                Save();
            }
        }

        // Facebook.
        public string FacebookAppId
        {
            get => asset.facebookAppId;
            set
            {
                if (asset.facebookAppId == value) return;
                asset.facebookAppId = value;
                Save();
            }
        }

        public string FacebookInviteString
        {
            get => asset.facebookInviteString;
            set
            {
                if (asset.facebookInviteString == value) return;
                asset.facebookInviteString = value;
                Save();
            }
        }

        public string FacebookClientToken
        {
            get => asset.facebookClientToken;
            set
            {
                if (asset.facebookClientToken == value) return;
                asset.facebookClientToken = value;
                Save();
            }
        }

        // Auth.
        public bool AutoLoginEnabled
        {
            get => asset.autoLoginEnabled;
            set
            {
                if (asset.autoLoginEnabled == value) return;
                asset.autoLoginEnabled = value;
                Save();
            }
        }

        public bool GuestTimeoutEnabled
        {
            get => asset.guestTimeoutEnabled;
            set
            {
                if (asset.guestTimeoutEnabled == value) return;
                asset.guestTimeoutEnabled = value;
                Save();
            }
        }

        public bool GuestOnlyAuth
        {
            get => asset.guestOnlyAuth;
            set
            {
                if (asset.guestOnlyAuth == value) return;
                asset.guestOnlyAuth = value;
                Save();
            }
        }

        public bool GuestEnabled
        {
            get => asset.guestEnabled;
            set
            {
                if (asset.guestEnabled == value) return;
                asset.guestEnabled = value;
                Save();
            }
        }

        // Zendesk.
        public bool ZendeskEnabled
        {
            get => asset.zendeskEnabled;
            set
            {
                if (asset.zendeskEnabled == value) return;
                asset.zendeskEnabled = value;
                Save();
            }
        }
        
        public string WebSupportUrl
        {
            get => asset.webSupportUrl;
            set
            {
                if (asset.webSupportUrl == value) return;
                asset.webSupportUrl = value;
                Save();
            }
        }
        
        public string ZendeskGameId
        {
            get => asset.zendeskGameId;
            set
            {
                if (asset.zendeskGameId == value) return;
                asset.zendeskGameId = value;
                Save();
            }
        }

        public string ZendeskCategoryId
        {
            get => asset.zendeskCategoryId;
            set
            {
                if (asset.zendeskCategoryId == value) return;
                asset.zendeskCategoryId = value;
                Save();
            }
        }

        public string ZendeskAppId
        {
            get => asset.zendeskAppId;
            set
            {
                if (asset.zendeskAppId == value) return;
                asset.zendeskAppId = value;
                Save();
            }
        }

        public string ZendeskAuthClientId
        {
            get => asset.zendeskAuthClientId;
            set
            {
                if (asset.zendeskAuthClientId == value) return;
                asset.zendeskAuthClientId = value;
                Save();
            }
        }

        // Billing.
        public bool BillingTest
        {
            get => asset.billingTest;
            set
            {
                if (asset.billingTest == value) return;
                asset.billingTest = value;
                Save();
            }
        }

        // Analytics.
        public bool AppsflyerTrackEnabled
        {
            get => asset.appsflyerTrackEnabled;
            set
            {
                if (asset.appsflyerTrackEnabled == value) return;
                asset.appsflyerTrackEnabled = value;
                Save();
            }
        }

        public bool AppsflyerDebugLogEnabled
        {
            get => asset.appsflyerDebugLogEnabled;
            set
            {
                if (asset.appsflyerDebugLogEnabled == value) return;
                asset.appsflyerDebugLogEnabled = value;
                Save();
            }
        }

        public string AppsflyerDevKey
        {
            get => asset.appsflyerDevKey;
            set
            {
                if (asset.appsflyerDevKey == value) return;
                asset.appsflyerDevKey = value;
                Save();
            }
        }

        // App Review.
        public bool AppReviewEnabled
        {
            get => asset.appReviewEnabled;
            set
            {
                if (asset.appReviewEnabled == value) return;
                asset.appReviewEnabled = value;
                Save();
            }
        }

        public int AppReviewDaysSelay
        {
            get => asset.appReviewDaysSelay;
            set
            {
                if (asset.appReviewDaysSelay == value) return;
                asset.appReviewDaysSelay = value;
                Save();
            }
        }

        public int AppReviewSecondsDelay
        {
            get => asset.appReviewSecondsDelay;
            set
            {
                if (asset.appReviewSecondsDelay == value) return;
                asset.appReviewSecondsDelay = value;
                Save();
            }
        }

        // App Store.
        public string AppStoreLink
        {
            get => asset.appStoreLink;
            set
            {
                if (asset.appStoreLink == value) return;
                asset.appStoreLink = value;
                Save();
            }
        }

        public string AppStoreId
        {
            get => asset.appStoreId;
            set
            {
                if (asset.appStoreId == value) return;
                asset.appStoreId = value;
                Save();
            }
        }

        // EULA.
        public bool EulaShowEnabled
        {
            get => asset.eulaShowEnabled;
            set
            {
                if (asset.eulaShowEnabled == value) return;
                asset.eulaShowEnabled = value;
                Save();
            }
        }

        public string EulaDefaultUrl
        {
            get => asset.eulaDefaultUrl;
            set
            {
                if (asset.eulaDefaultUrl == value) return;
                asset.eulaDefaultUrl = value;
                Save();
            }
        }

        public bool EulaAutoAccept
        {
            get => asset.eulaAutoAccept;
            set
            {
                if (asset.eulaAutoAccept == value) return;
                asset.eulaAutoAccept = value;
                Save();
            }
        }

        // Device Token.
        public bool DeviceTokenEnabled
        {
            get => asset.deviceTokenEnabled;
            set
            {
                if (asset.deviceTokenEnabled == value) return;
                asset.deviceTokenEnabled = value;
                Save();
            }
        }

        // Web Dialogs.
        public bool WebUiEnabled
        {
            get => asset.webUiEnabled;
            set
            {
                if (asset.webUiEnabled == value) return;
                asset.webUiEnabled = value;
                Save();
            }
        }

        // Wed Dialogs.
        public string WebUiVersion
        {
            get => asset.webUiVersion;
            set
            {
                if (asset.webUiVersion == value) return;
                asset.webUiVersion = value;
                Save();
            }
        }

        private void Save()
        {
            AssetUtility.SaveAsset(asset);
        }
    }
}