﻿using UnityEngine;
using UnityEngine.UI;
using System.Collections.Generic;

using Stove.StoveSDK;
using MiniJSON;

#if UNITY_ANDROID
        #if MARKET_HUAWEI
        using Stove.StoveSDK.IAP.Huawei;

        #elif MARKET_ONESTORE
        using Stove.StoveSDK.IAP.OneStore;

        #else
        using Stove.StoveSDK.IAP.Google;

        #endif
#endif

public class IAPSample : MonoBehaviour
{
    void Start()
    {

    }

    void Update()
    {

    }

    public void ChangeCustomBillingGameUserId()
    {
        TextFieldOneDialog.Show((string userId) =>
        {
            if (userId != null)
            {
                IAP.SetCustomBillingGUID(userId);

                Debug.Log("------- [Stove-Sample] IAP.SetCustomBillingGUID : " + userId + " -------");
            }
        });
    }

    public void Initialize()
    {
        Debug.Log("------- [Stove-Sample] IAP.Initialize -------");

        IAP.Initialize((Result result) =>
        {
            Debug.Log("------- [Stove-Sample] IAP.Initialize : " + result + " -------");

            if (result.IsSuccessful)
            {
                SSTools.ShowMessage("IAP.Initialize Success", SSTools.Position.bottom, SSTools.Time.oneSecond);
            }
            else
            {
                SSTools.ShowMessage("IAP.Initialize Fail", SSTools.Position.bottom, SSTools.Time.oneSecond);
            }
        });
    }

    public void SetListener()
    {
        Debug.Log("------- [Stove-Sample] IAP.SetListener -------");

        IAP.SetListener((Result result, IAPProduct product, IAPPurchaseDetail purchaseDetail) =>
        {
            Debug.Log("------- [Stove-Sample] IAP.SetListener : " + result + " -------");
            Debug.Log("------- [Stove-Sample] IAP.SetListener : " + product);
            Debug.Log("------- [Stove-Sample] IAP.SetListener : " + purchaseDetail);

            if (result.IsSuccessful)
            {
                SSTools.ShowMessage("IAP.SetListener Success", SSTools.Position.bottom, SSTools.Time.oneSecond);
            }
            else
            {
                SSTools.ShowMessage("IAP.SetListener Fail", SSTools.Position.bottom, SSTools.Time.oneSecond);
            }
        });
    }

    public void FetchProducts()
    {
        Debug.Log("------- [Stove-Sample] IAP.FetchProducts -------");

        IAP.FetchProducts((Result result, List<IAPProduct> products) =>
        {
            Debug.Log("------- [Stove-Sample] IAP.FetchProducts : " + result + " -------");

            if (result.IsSuccessful)
            {
                FetchProductDialog.Show(products);

                SSTools.ShowMessage("IAP.FetchProducts Success", SSTools.Position.bottom, SSTools.Time.oneSecond);
            }
            else
            {
                SSTools.ShowMessage("IAP.FetchProducts Fail", SSTools.Position.bottom, SSTools.Time.oneSecond);
            }
        });
    }

    /*
    public void StartPurchase()
    {
        TextFieldOneDialog.Show((string product) =>
        {
            if (product != null)
            {
                Debug.Log("------- [Stove-Sample] IAP.StartPurchase -------");

                Dictionary<string, object> productDic = Json.Deserialize(product) as Dictionary<string, object>;
                IAPProduct iapProduct = new IAPProduct(productDic);
                IAP.StartPurchase(iapProduct, (Result result) =>
                {
                    Debug.Log("------- [Stove-Sample] IAP.StartPurchase : " + result + " -------");

                    if (result.IsSuccessful)
                    {
                        SSTools.ShowMessage("IAP.StartPurchase Success", SSTools.Position.bottom, SSTools.Time.oneSecond);
                    }
                    else
                    {
                        SSTools.ShowMessage("IAP.StartPurchase Fail", SSTools.Position.bottom, SSTools.Time.oneSecond);
                    }
                });
            }
        });
    }
    */

    public void StartPurchaseWithServiceId()
    {
        TextFieldThreeDialog.Show("product JSON String", "serviceOrderId", "optional JSON String", (string product, string serviceOrderId, string optional) =>
        {
            Debug.Log("------- [Stove-Sample] IAP.StartPurchaseWithServiceId -------");

            if(string.IsNullOrEmpty(product) && string.IsNullOrEmpty(serviceOrderId) && string.IsNullOrEmpty(optional))
            {
                return;
            }
            Dictionary<string, object> productDic = Json.Deserialize(product) as Dictionary<string, object>;
            IAPProduct iapProduct = new IAPProduct(productDic);

            IAPOptional iapOptional = null;
            if (!string.IsNullOrEmpty(optional))
            {
                Dictionary<string, object> optionalDic = Json.Deserialize(optional) as Dictionary<string, object>;
                iapOptional = new IAPOptional(optionalDic);
            }
            
            IAP.StartPurchase(iapProduct, serviceOrderId, iapOptional, (Result result) =>
            {
                Debug.Log("------- [Stove-Sample] IAP.StartPurchaseWithServiceId : " + result + " -------");

                if (result.IsSuccessful)
                {
                    SSTools.ShowMessage("IAP.StartPurchaseWithServiceId Success", SSTools.Position.bottom, SSTools.Time.oneSecond);
                }
                else
                {
                    SSTools.ShowMessage("IAP.StartPurchaseWithServiceId Fail", SSTools.Position.bottom, SSTools.Time.oneSecond);
                }
            });
        });
    }

    public void Flush()
    {
        IAP.Flush();

        Debug.Log("------- [Stove-Sample] IAP.Flush -------");
    }

    public void FetchVoidedPurchases()
    {
        Debug.Log("------- [Stove-Sample] IAP.FetchVoidedPurchases -------");

        IAP.FetchVoidedPurchases((Result result, List<Dictionary<string, object>> voidedPurchases) =>
        {
            Debug.Log("------- [Stove-Sample] IAP.FetchVoidedPurchases : " + result + " -------");
            foreach (Dictionary<string, object> voidedPurchase in voidedPurchases)
            {
                Debug.Log("------- [Stove-Sample] IAP.FetchVoidedPurchases : " + Json.Serialize(voidedPurchase) + " -------");
            }
            if (result.IsSuccessful)
            {
                SSTools.ShowMessage("IAP.FetchVoidedPurchases Success", SSTools.Position.bottom, SSTools.Time.oneSecond);
            }
            else
            {
                SSTools.ShowMessage("IAP.FetchVoidedPurchases Fail", SSTools.Position.bottom, SSTools.Time.oneSecond);
            }
        });
    }

    public void HandleVoidedPurchases()
    {
        Debug.Log("------- [Stove-Sample] IAP.HandleVoidedPurchases -------");

        IAP.HandleVoidedPurchases((Result result) =>
        {
            Debug.Log("------- [Stove-Sample] IAP.HandleVoidedPurchases : " + result + " -------");
            if (result.IsSuccessful)
            {
                /** 게임 진입 가능 **/
                SSTools.ShowMessage("IAP.HandleVoidedPurchases Success", SSTools.Position.bottom, SSTools.Time.oneSecond);
            }
            else if (result.IsCanceled)
            {
                SSTools.ShowMessage("IAP.HandleVoidedPurchases Fail", SSTools.Position.bottom, SSTools.Time.oneSecond);

                /** 고객센터 **/
                if (result.UserInfo != null && result.UserInfo.TryGetValue("userAction", out string userAction))
                {
                    if (!string.IsNullOrEmpty(userAction) && userAction.Equals("customerSupport"))
                    {
                        ViewUI.CustomerSupport((Result result, Dictionary<string, string> dictionary) =>
                        {
                            /** 게임 진입 불가 (→ 환불 결제 유도) **/
                            HandleVoidedPurchases();
                        });
                        return;
                    }
                }

                /** 게임 진입 불가 (→ 환불 결제 유도) **/
                HandleVoidedPurchases();
            }
            else
            {
                OperationUI.HandleResult(result, (Result operationResult) =>
                {
                    /** 공통 에러코드 처리 **/
                    // https://developers.onstove.com/mobile/handleResult.html#%E1%84%80%E1%85%A2%E1%84%87%E1%85%A1%E1%86%AF%E1%84%89%E1%85%A1%E1%84%8B%E1%85%A6%E1%84%89%E1%85%A5-%E1%84%8E%E1%85%AE%E1%84%92%E1%85%AE-%E1%84%83%E1%85%A9%E1%86%BC%E1%84%8C%E1%85%A1%E1%86%A8%E1%84%8B%E1%85%B3%E1%86%AF-%E1%84%89%E1%85%AE%E1%84%92%E1%85%A2%E1%86%BC%E1%84%92%E1%85%A2%E1%84%8B%E1%85%A3-%E1%84%92%E1%85%A1%E1%84%82%E1%85%B3%E1%86%AB-errorcodes
                    int errorCode = result.ErrorCode;
                    if (errorCode == 40303)
                    {
                        Auth.Logout();                        
                    }

                    /** TODO : 게임 초기 화면으로 전환 (→ 게임 초기 동선으로 이동) **/
                    
                });
            }
        });
    }

    public void Version()
    {
        SSTools.ShowMessage("IAP Version : " + IAP.GetVersion(), SSTools.Position.bottom, SSTools.Time.oneSecond);
    }
}
