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

namespace Platform101XP.Editor.Settings.Repositories
{
    public enum AppOpenAdOrientation : int
    {
        Portrait,
        Landscape
    }

    public enum BannerAdPositionVertical : int
    {
        Top,
        Middle,
        Bottom
    }

    public enum BannerAdPositionHorizontal : int
    {
        Left,
        Center,
        Right
    }

    public enum AndroidAdjustLogLevel : int
    {
        Verbose,
        Debug,
        Info,
        Warn,
        Error,
        Assert,
        Supress
    }

    public enum BannerAdSize : int
    {
        Banner,
        Large,
        Rectangle,
        Smart
    }

    public enum TagForChildDirectedTreatment : int
    {
        Unspecified,
        True,
        False
    }

    public enum TagForUnderAgeOfConsent : int
    {
        Unspecified,
        True,
        False
    }


    public enum MaxAdContentRating : int
    {
        Unspecified,
        G,
        PG,
        T,
        MA
    }

    public enum AdmobDebugGeography : int
    {
        Disabled,
        EEA,
        NotEEA
    }

    public static class AndroidSettingsEnumExtension
    {
        public static string ToText(this AndroidAdjustLogLevel logLevel)
        {
            switch (logLevel)
            {
                case AndroidAdjustLogLevel.Verbose:
                    return "VERBOSE";
                case AndroidAdjustLogLevel.Debug:
                    return "DEBUG";
                case AndroidAdjustLogLevel.Info:
                    return "INFO";
                case AndroidAdjustLogLevel.Warn:
                    return "WARN";
                case AndroidAdjustLogLevel.Error:
                    return "ERROR";
                case AndroidAdjustLogLevel.Assert:
                    return "ASSERT";
                case AndroidAdjustLogLevel.Supress:
                    return "SUPRESS";
                default:
                    throw new ArgumentOutOfRangeException();
            }
        }

        public static string ToText(this AdmobDebugGeography value)
        {
            switch (value)
            {
                case AdmobDebugGeography.Disabled:
                    return "disabled";
                case AdmobDebugGeography.EEA:
                    return "eea";
                case AdmobDebugGeography.NotEEA:
                    return "not_eea";
                default:
                    throw new ArgumentOutOfRangeException();
            }
        }

        public static string ToText(this MaxAdContentRating value)
        {
            switch (value)
            {
                case MaxAdContentRating.Unspecified:
                    return "unspecified";
                case MaxAdContentRating.G:
                    return "G";
                case MaxAdContentRating.PG:
                    return "PG";
                case MaxAdContentRating.T:
                    return "T";
                case MaxAdContentRating.MA:
                    return "MA";
                default:
                    throw new ArgumentOutOfRangeException();
            }
        }

        public static string ToText(this TagForChildDirectedTreatment value)
        {
            switch (value)
            {
                case TagForChildDirectedTreatment.Unspecified:
                    return "unspecified";
                case TagForChildDirectedTreatment.True:
                    return "true";
                case TagForChildDirectedTreatment.False:
                    return "false";
                default:
                    throw new ArgumentOutOfRangeException();
            }
        }

        public static string ToText(this TagForUnderAgeOfConsent value)
        {
            switch (value)
            {
                case TagForUnderAgeOfConsent.Unspecified:
                    return "unspecified";
                case TagForUnderAgeOfConsent.True:
                    return "true";
                case TagForUnderAgeOfConsent.False:
                    return "false";
                default:
                    throw new ArgumentOutOfRangeException();
            }
        }

        public static string ToText(this BannerAdSize value)
        {
            switch (value)
            {
                case BannerAdSize.Banner:
                    return "banner";
                case BannerAdSize.Large:
                    return "large";
                case BannerAdSize.Rectangle:
                    return "rectangle";
                case BannerAdSize.Smart:
                    return "smart";
                default:
                    throw new ArgumentOutOfRangeException();
            }
        }

        public static string ToText(this BannerAdPositionHorizontal value)
        {
            switch (value)
            {
                case BannerAdPositionHorizontal.Left:
                    return "left";
                case BannerAdPositionHorizontal.Center:
                    return "center";
                case BannerAdPositionHorizontal.Right:
                    return "right";
                default:
                    throw new ArgumentOutOfRangeException();
            }
        }

        public static string ToText(this BannerAdPositionVertical value)
        {
            switch (value)
            {
                case BannerAdPositionVertical.Top:
                    return "top";
                case BannerAdPositionVertical.Middle:
                    return "middle";
                case BannerAdPositionVertical.Bottom:
                    return "bottom";
                default:
                    throw new ArgumentOutOfRangeException();
            }
        }

        public static string ToText(this AppOpenAdOrientation value)
        {
            switch (value)
            {
                case AppOpenAdOrientation.Portrait:
                    return "portrait";
                case AppOpenAdOrientation.Landscape:
                    return "landscape";
                default:
                    throw new ArgumentOutOfRangeException();
            }
        }
    }

    public class AndroidSettingsRepository
    {
        private const string ASSET_NAME = "P101XPSettingsAndroid.asset";
        public readonly AndroidSettingsAsset asset;

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

        public string AppSkinName
        {
            get => asset.appSkinName;
            set
            {
                if (asset.appSkinName == value) return;
                asset.appSkinName = 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();
            }
        }

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

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

        // Google.
        public bool GpEnabled
        {
            get => asset.gpEnabled;
            set
            {
                if (asset.gpEnabled == value) return;
                asset.gpEnabled = value;
                Save();
            }
        }

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

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

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

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

        // Yandex
        public string YandexClientId
        {
            get => asset.yandexClientId;
            set
            {
                if (asset.yandexClientId == value) return;
                asset.yandexClientId = value;
                Save();
            }
        }

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

        public string VkClientId
        {
            get
            {
                if (!string.IsNullOrEmpty(asset.vkClientId)) return asset.vkClientId;
                return asset.vkAppId >= 0 ? asset.vkAppId.ToString() : string.Empty;
            }
            set
            {
                if (asset.vkClientId == value) return;
                asset.vkClientId = value;
                Save();
            }
        }

        public string VkClientSecret
        {
            get => asset.vkClientSecret;
            set
            {
                if (asset.vkClientSecret == value) return;
                asset.vkClientSecret = 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();
            }
        }

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

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

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

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

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

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

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

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

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

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

        // Adjust.
        public bool EnableAdjust
        {
            get => asset.enableAdjust;
            set
            {
                if (asset.enableAdjust == value) return;
                asset.enableAdjust = 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();
            }
        }

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

        public AndroidAdjustLogLevel AdjustLogLevel
        {
            get => (AndroidAdjustLogLevel)asset.adjustLogLevel;
            set
            {
                if (asset.adjustLogLevel == (int)value) return;
                asset.adjustLogLevel = (int)value;
                Save();
            }
        }



        // Notification.
        public string NotificationTitle
        {
            get => asset.notificationTitle;
            set
            {
                if (asset.notificationTitle == value) return;
                asset.notificationTitle = value;
                Save();
            }
        }

        // Firebase DynamicLink Invite.
        public string AppLink
        {
            get => asset.appLink;
            set
            {
                if (asset.appLink == value) return;
                asset.appLink = value;
                Save();
            }
        }

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

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

        // Wed Dialogs.
        public bool WebScreenRotationDisabled
        {
            get => asset.webScreenRotationDisabled;
            set
            {
                if (asset.webScreenRotationDisabled == value) return;
                asset.webScreenRotationDisabled = value;
                Save();
            }
        }

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

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

        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();
            }
        }

        // Unity 2019.
        public bool Unity2019EnableR8
        {
            get => asset.unity2019EnableR8;
            set
            {
                if (asset.unity2019EnableR8 == value) return;
                asset.unity2019EnableR8 = value;
                Save();
            }
        }

        // MARK: - Advertising
        public bool AdAdmobEnabled
        {
            get => asset.ad_admob_enabled;
            set
            {
                if (asset.ad_admob_enabled == value) return;
                asset.ad_admob_enabled = value;
                Save();
            }
        }

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

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

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

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

        public AppOpenAdOrientation AdAppopenAdOrientation
        {
            get => (AppOpenAdOrientation)asset.ad_appopen_ad_orientation;
            set
            {
                if (asset.ad_appopen_ad_orientation == (int)value) return;
                asset.ad_appopen_ad_orientation = (int)value;
                Save();
            }
        }

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

        public BannerAdPositionVertical AdBannerAdPositionVertical
        {
            get => (BannerAdPositionVertical)asset.ad_banner_ad_position_vertical;
            set
            {
                if (asset.ad_banner_ad_position_vertical == (int)value) return;
                asset.ad_banner_ad_position_vertical = (int)value;
                Save();
            }
        }

        public BannerAdPositionHorizontal AdBannerAdPositionHorizontal
        {
            get => (BannerAdPositionHorizontal)asset.ad_banner_ad_position_horizontal;
            set
            {
                if (asset.ad_banner_ad_position_horizontal == (int)value) return;
                asset.ad_banner_ad_position_horizontal = (int)value;
                Save();
            }
        }

        public BannerAdSize AdBannerAdSize
        {
            get => (BannerAdSize)asset.ad_banner_ad_size;
            set
            {
                if (asset.ad_banner_ad_size == (int)value) return;
                asset.ad_banner_ad_size = (int)value;
                Save();
            }
        }

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

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

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

        public TagForChildDirectedTreatment AdTagForChildDirectedTreatment
        {
            get => (TagForChildDirectedTreatment)asset.ad_tag_for_child_directed_treatment;
            set
            {
                if (asset.ad_tag_for_child_directed_treatment == (int)value) return;
                asset.ad_tag_for_child_directed_treatment = (int)value;
                Save();
            }
        }

        public TagForUnderAgeOfConsent AdTagForUnderAgeOfConsent
        {
            get => (TagForUnderAgeOfConsent)asset.ad_tag_for_under_age_of_consent;
            set
            {
                if (asset.ad_tag_for_under_age_of_consent == (int)value) return;
                asset.ad_tag_for_under_age_of_consent = (int)value;
                Save();
            }
        }

        public MaxAdContentRating AdMaxAdContentRating
        {
            get => (MaxAdContentRating)asset.ad_max_ad_content_rating;
            set
            {
                if (asset.ad_max_ad_content_rating == (int)value) return;
                asset.ad_max_ad_content_rating = (int)value;
                Save();
            }
        }

        public AdmobDebugGeography AdAdmobDebugGeography
        {
            get => (AdmobDebugGeography)asset.ad_admob_debug_geography;
            set
            {
                if (asset.ad_admob_debug_geography == (int)value) return;
                asset.ad_admob_debug_geography = (int)value;
                Save();
            }
        }

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

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

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

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

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