#nullable enable

using System;
using System.Collections.Generic;

namespace UnityEngine.Purchasing
{
    /// <summary>
    /// Provides fake functionality for Apple specific APIs.
    ///
    /// Refresh receipt calls alternate between success and failure.
    /// </summary>
    class FakeAppleExtensions : IAppleExtensions
    {
        bool m_FailRefresh;

        public void RefreshAppReceipt(Action<string> successCallback, Action<string> errorCallback)
        {
            if (m_FailRefresh)
            {
                errorCallback("A fake error message");
            }
            else
            {
                successCallback("A fake refreshed receipt!");
            }

            m_FailRefresh = !m_FailRefresh;
        }

        [Obsolete("RefreshAppReceipt(Action<string> successCallback, Action errorCallback) is deprecated, please use RefreshAppReceipt(Action<string> successCallback, Action<string> errorCallback) instead.")]
        public void RefreshAppReceipt(Action<string> successCallback, Action errorCallback)
        {
            if (m_FailRefresh)
            {
                errorCallback();
            }
            else
            {
                successCallback("A fake refreshed receipt!");
            }

            m_FailRefresh = !m_FailRefresh;
        }

        [Obsolete("RestoreTransactions(Action<bool> callback) is deprecated, please use RestoreTransactions(Action<bool, string> callback) instead.")]
        public void RestoreTransactions(Action<bool>? callback)
        {
            callback?.Invoke(true);
        }

        public void RestoreTransactions(Action<bool, string?>? callback)
        {
            callback?.Invoke(true, null);
        }

        public void RegisterPurchaseDeferredListener(Action<Product> callback)
        {
        }

        public bool simulateAskToBuy
        {
            get;
            set;
        }

        public void FetchStorePromotionOrder(Action<List<Product>> successCallback, Action errorCallback)
        {
            errorCallback();
        }

        public void SetStorePromotionOrder(List<Product> products)
        {
        }

        public void FetchStorePromotionVisibility(Product product, Action<string, AppleStorePromotionVisibility> successCallback, Action errorCallback)
        {
            errorCallback();
        }

        public void SetStorePromotionVisibility(Product product, AppleStorePromotionVisibility visible)
        {
        }

        public void SetApplicationUsername(string applicationUsername)
        {
        }

        public string GetTransactionReceiptForProduct(Product product)
        {
            return "";
        }

        public void ContinuePromotionalPurchases()
        {
        }

        public Dictionary<string, string> GetIntroductoryPriceDictionary()
        {
            return new Dictionary<string, string>();
        }

        public Dictionary<string, string> GetProductDetails()
        {
            return new Dictionary<string, string>();
        }

        public void PresentCodeRedemptionSheet()
        {
        }
    }
}