﻿namespace Stove.StoveSDK
{

    using System.Collections.Generic;
    using System.IO;
    using UnityEditor;
    using UnityEngine;

    public class StoveSettings : ScriptableObject
    {
        public const string AssetName = "StoveSettings";
        public const string Path = "Sample/Editor/Resources";
        public const string AssetExtension = ".asset";

        public delegate void OnChangeCallback();

        private static List<OnChangeCallback> onChangeCallbacks = new List<OnChangeCallback>();

        [SerializeField]
        private string zone = "live";

        [SerializeField]
        private bool googleEnabled = false;
        [SerializeField]
        private string googleWebClientId = "";
        [SerializeField]
        private string googleWebClientSecret = "";
        [SerializeField]
        private string googleiOSClientId = "";
        [SerializeField]
        private string googleiOSUrlScheme = "";

        [SerializeField]
        private bool facebookEnabled = false;
        [SerializeField]
        private string facebookAppId = "";
        [SerializeField]
        private string facebookClientToken = "";

        [SerializeField]
        private bool naverEnabled = false;
        [SerializeField]
        private string naverClientId = "";
        [SerializeField]
        private string naverClientSecret = "";
        [SerializeField]
        private string naverClientName = "";
        [SerializeField]
        private string naverUrlScheme = "";

        [SerializeField]
        private bool lineEnabled = false;
        [SerializeField]
        private string lineChannelId = "";

        [SerializeField]
        private bool steamEnabled = false;

        [SerializeField]
        private bool foregroundNotificatoinEnabled = false;

        [SerializeField]
        private bool headsUpNotificationEnabled = false;

        [SerializeField]
        private bool customChannelEnabled = false;
        [SerializeField]
        private string pushChannelName = null;
        [SerializeField]
        private string pushChannelDescription = null;
        [SerializeField]
        private string pushSmallIcon = null;

        [SerializeField]
        private string iOSBuildType = "";

        [SerializeField]
        private bool sanctionType = false;

        [SerializeField]
        private bool enableGUID = false;

        // 2.9.0 StoveSetting vn 추가
        [SerializeField]
        private bool enableVTCO = false;

        [SerializeField]
        private bool googlePlayGamesEnabled = false;
        [SerializeField]
        private string googlePlayGamesProjectId = "";

        [SerializeField]
        private bool buildAppBundle = false;
        
        [SerializeField]
        private bool supportPC = false;

        [SerializeField]
        private string androidMarket = "";

        [SerializeField]
        private bool marketHuaweiEnabled = false;
        [SerializeField]
        private string huaweiAppId = "";

        [SerializeField]
        private string oneStoreBuildType = "";

        private static StoveSettings instance;

        public static StoveSettings Instance
        {
            get
            {
                instance = NullableInstance;
                if (instance == null)
                {
                    // If not found, autocreate the asset object.
                    instance = CreateInstance<StoveSettings>();
                }
                return instance;
            }
        }

        public static StoveSettings NullableInstance
        {
            get
            {
                if (instance == null)
                {
                    instance = Resources.Load(AssetName) as StoveSettings;
                }
                return instance;
            }
        }

        public static void RegisterChangeEventCallback(OnChangeCallback callback)
        {
            onChangeCallbacks.Add(callback);
        }

        private static void SettingsChanged()
        {
            onChangeCallbacks.ForEach(callback => callback());
        }

        public static string Zone
        {
            get
            {
                return Instance.zone;
            }

            set
            {
                if (Instance.zone != value)
                {
                    Instance.zone = value;
                    SettingsChanged();
                }
            }
        }

        public static bool FacebookEnabled
        {
            get
            {
                return Instance.facebookEnabled;
            }

            set
            {
                if (Instance.facebookEnabled != value)
                {
                    Instance.facebookEnabled = value;
                    SettingsChanged();
                }
            }
        }

        public static string FacebookAppId
        {
            get
            {
                return Instance.facebookAppId;
            }

            set
            {
                if (Instance.facebookAppId != value)
                {
                    Instance.facebookAppId = value;
                    SettingsChanged();
                }
            }
        }
        
        public static string FacebookClientToken
        {
            get
            {
                return Instance.facebookClientToken;
            }

            set
            {
                if (Instance.facebookClientToken != value)
                {
                    Instance.facebookClientToken = value;
                    SettingsChanged();
                }
            }
        }

        public static string GoogleWebClientId
        {
            get
            {
                return Instance.googleWebClientId;
            }

            set
            {
                if (Instance.googleWebClientId != value)
                {
                    Instance.googleWebClientId = value;
                    SettingsChanged();
                }
            }
        }

        public static string GoogleWebClientSecret
        {
            get
            {
                return Instance.googleWebClientSecret;
            }

            set
            {
                if (Instance.googleWebClientSecret != value)
                {
                    Instance.googleWebClientSecret = value;
                    SettingsChanged();
                }
            }
        }

        public static string GoogleIosClientId
        {
            get
            {
                return Instance.googleiOSClientId;
            }

            set
            {
                if (Instance.googleiOSClientId != value)
                {
                    Instance.googleiOSClientId = value;
                    SettingsChanged();
                }
            }
        }

        public static string GoogleIosUrlScheme
        {
            get
            {
                return Instance.googleiOSUrlScheme;
            }

            set
            {
                if (Instance.googleiOSUrlScheme != value)
                {
                    Instance.googleiOSUrlScheme = value;
                    SettingsChanged();
                }
            }
        }

        public static bool GoogleEnabled
        {
            get
            {
                return Instance.googleEnabled;
            }

            set
            {
                if (Instance.googleEnabled != value)
                {
                    Instance.googleEnabled = value;
                    SettingsChanged();
                }
            }
        }

        public static string NaverClientId
        {
            get
            {
                return Instance.naverClientId;
            }

            set
            {
                if (Instance.naverClientId != value)
                {
                    Instance.naverClientId = value;
                    SettingsChanged();
                }
            }
        }

        public static string NaverClientSecret
        {
            get
            {
                return Instance.naverClientSecret;
            }

            set
            {
                if (Instance.naverClientSecret != value)
                {
                    Instance.naverClientSecret = value;
                    SettingsChanged();
                }
            }
        }

        public static string NaverClientName
        {
            get
            {
                return Instance.naverClientName;
            }

            set
            {
                if (Instance.naverClientName != value)
                {
                    Instance.naverClientName = value;
                    SettingsChanged();
                }
            }
        }

        public static string NaverUrlScheme
        {
            get
            {
                return Instance.naverUrlScheme;
            }

            set
            {
                if (Instance.naverUrlScheme != value)
                {
                    Instance.naverUrlScheme = value;
                    SettingsChanged();
                }
            }
        }

        public static bool NaverEnabled
        {
            get
            {
                return Instance.naverEnabled;
            }

            set
            {
                if (Instance.naverEnabled != value)
                {
                    Instance.naverEnabled = value;
                    SettingsChanged();
                }
            }
        }

        public static bool LineEnabled
        {
            get
            {
                return Instance.lineEnabled;
            }

            set
            {
                if (Instance.lineEnabled != value)
                {
                    Instance.lineEnabled = value;
                    SettingsChanged();
                }
            }
        }

        public static string LineChannelId
        {
            get
            {
                return Instance.lineChannelId;
            }

            set
            {
                if (Instance.lineChannelId != value)
                {
                    Instance.lineChannelId = value;
                    SettingsChanged();
                }
            }
        }

        public static bool SteamEnabled
        {
            get
            {
                return Instance.steamEnabled;
            }

            set
            {
                if (Instance.steamEnabled != value)
                {
                    Instance.steamEnabled = value;
                    SettingsChanged();
                }
            }
        }

        public static bool ForegroundNotificatoinEnabled
        {
            get
            {
                return Instance.foregroundNotificatoinEnabled;
            }

            set
            {
                if (Instance.foregroundNotificatoinEnabled != value)
                {
                    Instance.foregroundNotificatoinEnabled = value;
                    SettingsChanged();
                }
            }
        }

        public static bool HeadsUpNotificationEnabled
        {
            get
            {
                return Instance.headsUpNotificationEnabled;
            }

            set
            {
                if (Instance.headsUpNotificationEnabled != value)
                {
                    Instance.headsUpNotificationEnabled = value;
                    SettingsChanged();
                }
            }
        }

        public static bool CustomChannelEnabled
        {
            get
            {
                return Instance.customChannelEnabled;
            }

            set
            {
                if (Instance.customChannelEnabled != value)
                {
                    Instance.customChannelEnabled = value;
                    SettingsChanged();
                }
            }
        }

        public static string PushChannelName
        {
            get
            {
                return Instance.pushChannelName;
            }

            set
            {
                if (Instance.pushChannelName != value)
                {
                    Instance.pushChannelName = value;
                    SettingsChanged();
                }
            }
        }

        public static string PushSmallIcon
        {
            get
            {
                return Instance.pushSmallIcon;
            }

            set
            {
                if (Instance.pushSmallIcon != value)
                {
                    Instance.pushSmallIcon = value;
                    SettingsChanged();
                }
            }
        }

        public static string PushChannelDescription
        {
            get
            {
                return Instance.pushChannelDescription;
            }

            set
            {
                if (Instance.pushChannelDescription != value)
                {
                    Instance.pushChannelDescription = value;
                    SettingsChanged();
                }
            }
        }

        public static string IOSBuildType
        {
            get
            {
                return Instance.iOSBuildType;
            }

            set
            {
                if (Instance.iOSBuildType != value)
                {
                    Instance.iOSBuildType = value;
                    SettingsChanged();
                }
            }
        }

        public static bool SanctionType
        {
            get
            {
                return Instance.sanctionType;
            }

            set
            {
                if (Instance.sanctionType != value)
                {
                    Instance.sanctionType = value;
                    SettingsChanged();
                }
            }
        }

        public static bool EnableGUID
        {
            get
            {
                return Instance.enableGUID;
            }

            set
            {
                if (Instance.enableGUID != value)
                {
                    Instance.enableGUID = value;
                    SettingsChanged();
                }
            }
        }

        // 2.9.0 StoveSetting vn 추가
        public static bool EnableVTCO
        {
            get
            {
                return Instance.enableVTCO;
            }

            set
            {
                if (Instance.enableVTCO != value)
                {
                    Instance.enableVTCO = value;
                    SettingsChanged();
                }
            }
        }

        public static string GooglePlayGamesProjectId
        {
            get
            {
                return Instance.googlePlayGamesProjectId;
            }

            set
            {
                if (Instance.googlePlayGamesProjectId != value)
                {
                    Instance.googlePlayGamesProjectId = value;
                    SettingsChanged();
                }
            }
        }

        public static bool GooglePlayGamesEnabled
        {
            get
            {
                return Instance.googlePlayGamesEnabled;
            }

            set
            {
                if (Instance.googlePlayGamesEnabled != value)
                {
                    Instance.googlePlayGamesEnabled = value;
                    SettingsChanged();
                }
            }
        }

        public static bool BuildAppBundle
        {
            get
            {
                return Instance.buildAppBundle;
            }

            set
            {
                if (Instance.buildAppBundle != value)
                {
                    Instance.buildAppBundle = value;
                    SettingsChanged();
                }
            }
        }
        
        public static bool SupportPC
        {
            get
            {
                return Instance.supportPC;
            }

            set
            {
                if (Instance.supportPC != value)
                {
                    Instance.supportPC = value;
                    SettingsChanged();
                }
            }
        }

        public static string AndroidMarket
        {
            get
            {
                return Instance.androidMarket;
            }

            set
            {
                if (Instance.androidMarket != value)
                {
                    Instance.androidMarket = value;
                    SettingsChanged();
                }
            }
        }

        public static string HuaweiAppId
        {
            get
            {
                return Instance.huaweiAppId;
            }

            set
            {
                if (Instance.huaweiAppId != value)
                {
                    Instance.huaweiAppId = value;
                    SettingsChanged();
                }
            }
        }

        public static bool MarketHuaweiEnabled
        {
            get
            {
                return Instance.marketHuaweiEnabled;
            }

            set
            {
                if (Instance.marketHuaweiEnabled != value)
                {
                    Instance.marketHuaweiEnabled = value;
                    SettingsChanged();
                }
            }
        }

        public static string ONEstoreBuildType
        {
            get
            {
                return Instance.oneStoreBuildType;
            }

            set
            {
                if (Instance.oneStoreBuildType != value)
                {
                    Instance.oneStoreBuildType = value;
                    SettingsChanged();
                }
            }
        }
    }
}
