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

namespace Platform101XP.Editor.Settings.Repositories
{
    public class IOSSettingsRepository
    {
        private const string ASSET_NAME = "P101XPSettingsIOS.asset";
        private readonly IOSSettingsAsset asset;

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

        // Base.
        public bool SkinEnabled
        {
            get => asset.skinEnabled;
            set
            {
                if (asset.skinEnabled == value) return;
                asset.skinEnabled = value;
                Save();
            }
        }

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


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

        // Facebook.
        public bool FacebookEnabled
        {
            get => asset.facebookEnabled;
            set
            {
                if (asset.facebookEnabled == value) return;
                asset.facebookEnabled = value;
                Save();
            }
        }

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

        // Odnoklassniki
        public bool OkEnabled
        {
            get => asset.okEnabled;
            set
            {
                if (asset.okEnabled == value) return;
                asset.okEnabled = value;
                Save();
            }
        }

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

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

        // Vk.
        public bool VkEnabled
        {
            get => asset.vkEnabled;
            set
            {
                if (asset.vkEnabled == value) return;
                asset.vkEnabled = value;
                Save();
            }
        }

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

        // Billing.
        public int BillingTimeout
        {
            get => asset.billingTimeout;
            set
            {
                if (asset.billingTimeout == value) return;
                asset.billingTimeout = value;
                Save();
            }
        }

        public string[] BillingSku
        {
            get => asset.billingSku;
            set
            {
                if (StringUtility.IsEqualArrays(asset.billingSku, value)) return;
                asset.billingSku = value;
                Save();
            }
        }

        // Analytics.
        public string AnalyticsProjectId
        {
            get => asset.analyticsProjectId;
            set
            {
                if (asset.analyticsProjectId == value) return;
                asset.analyticsProjectId = value;
                Save();
            }
        }


        // Adjust.
        /*
        [Header("Adjust")]
        public bool enableAdjust = false;
        public bool enableAdjustTrack = true;
        public string adjustAppToken = "";
        public string adjustEventMap = "";
        */
        public bool EnableAdjust
        {
            get => asset.enableAdjust;
            set
            {
                if (asset.enableAdjust == value) return;
                asset.enableAdjust = value;
                Save();
            }
        }

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

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

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

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

        // Authorization Window
        public bool ScreenLockHorizontal
        {
            get => asset.screenLockHorizontal;
            set
            {
                if (asset.screenLockHorizontal == value) return;
                asset.screenLockHorizontal = value;
                Save();
            }
        }

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

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

        // Sentry
        public string SentryDSN
        {
            get => asset.sentryDSN;
            set
            {
                if (asset.sentryDSN == value) return;
                asset.sentryDSN = value;
                Save();
            }
        }

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