﻿namespace Stove.StoveSDK
{
    using System;
    using System.Collections.Generic;
    using UnityEngine;

    /**
     * View provided by the Stove.
     */
    public class View
    {
        /**
         * View's domain
         * @since 2.0.0
         */
        public const string Domain = "com.stove.view";

        /**
         * Fetch popup's viewRequests.
         * @param action Fetch result.
         * @see Result
         * @see ViewRequest
         * @since 2.0.0
         */
        public static void FetchPopup(Action<Result, List<ViewRequest>> action)
        {
            Debug.Log("View.FetchPopup");
            string identifier = StoveSDK.Instance.AddAction(payload =>
            {
                Result result = new Result(payload["result"] as Dictionary<string, object>);

                List<ViewRequest> viewRequests = new List<ViewRequest>();

                if (payload.ContainsKey("viewRequests"))
                {
                    List<object> viewRequestsObject = payload["viewRequests"] as List<object>;
    
                    foreach (object viewRequestObject in viewRequestsObject)
                    {
                        ViewRequest viewRequest = new ViewRequest(viewRequestObject as Dictionary<string, object>);
                        viewRequests.Add(viewRequest);
                    }
                }
                
                Debug.Log("View.FetchPopup Result : " + result);
                Debug.Log("View.FetchPopup ViewRequests : " + viewRequests);

                action.Invoke(result, viewRequests);
            });
            ViewInterface.FetchPopup(identifier);
        }

        /**
         * Fetch popup's viewRequests.
         * @param location Popup's location. If location isn't set, an automatic popup is shown.
         * @param action Fetch result.
         * @see Result
         * @see ViewRequest
         * @since 2.0.0
         */
        public static void FetchPopup(int location, Action<Result, List<ViewRequest>> action)
        {
            Debug.Log("View.FetchPopup");
            string identifier = StoveSDK.Instance.AddAction(payload =>
            {
                Result result = new Result(payload["result"] as Dictionary<string, object>);

                List<ViewRequest> viewRequests = new List<ViewRequest>();

                if (payload.ContainsKey("viewRequests"))
                {
                    List<object> viewRequestsObject = payload["viewRequests"] as List<object>;
    
                    foreach (object viewRequestObject in viewRequestsObject)
                    {
                        ViewRequest viewRequest = new ViewRequest(viewRequestObject as Dictionary<string, object>);
                        viewRequests.Add(viewRequest);
                    }
                }
                
                Debug.Log("View.FetchPopup Result : " + result);
                Debug.Log("View.FetchPopup ViewRequests : " + viewRequests);

                action.Invoke(result, viewRequests);
            });
            ViewInterface.FetchPopup(location, identifier);
        }

        /**
         * Fetch news-popup's viewRequests.
         * @param action Fetch result.
         * @see Result
         * @see ViewRequest
         * @since 2.1.0
         */
        public static void FetchNews(Action<Result, List<ViewRequest>> action)
        {
            Debug.Log("View.FetchNews");
            string identifier = StoveSDK.Instance.AddAction(payload =>
            {
                Result result = new Result(payload["result"] as Dictionary<string, object>);

                List<ViewRequest> viewRequests = new List<ViewRequest>();

                if (payload.ContainsKey("viewRequests"))
                {
                    List<object> viewRequestsObject = payload["viewRequests"] as List<object>;

                    foreach (object viewRequestObject in viewRequestsObject)
                    {
                        ViewRequest viewRequest = new ViewRequest(viewRequestObject as Dictionary<string, object>);
                        viewRequests.Add(viewRequest);
                    }
                }

                Debug.Log("View.FetchNews Result : " + result);
                Debug.Log("View.FetchNews ViewRequests : " + viewRequests);

                action.Invoke(result, viewRequests);
            });
            ViewInterface.FetchNews(identifier);
        }

        /**
         * Use the coupon as the received coupon code.
         * @param code Coupon code.
         * @param action Coupon use result.
         * @see Result
         * @since 2.0.0
         */
        public static void UseCoupon(string code, Action<Result> action)
        {
            Debug.Log("View.UseCoupon");
            string identifier = StoveSDK.Instance.AddAction(payload =>
            {
                Result result = new Result(payload["result"] as Dictionary<string, object>);

                Debug.Log("View.UseCoupon Result : " + result);

                action.Invoke(result);
            });
            ViewInterface.UseCoupon(code, identifier);
        }

        /**
         * Open the external url.
         * @param redirectUrl External url.
         * @param action Open result.
         * @see Result
         * @since 2.8.3
         */
        public static void OpenExternalUrl(string redirectUrl, Action<Result> action)
        {
            Debug.Log("View.OpenExternalUrl");
            string identifier = StoveSDK.Instance.AddAction(payload =>
            {
                Result result = new Result(payload["result"] as Dictionary<string, object>);

                Debug.Log("View.OpenExternalUrl Result : " + result);
            });
            ViewInterface.OpenExternalUrl(redirectUrl, identifier);
        }

        /**
        * View Version
        * @since 2.3.0
        */
        public static string GetVersion()
        {
            Debug.Log("GetVersion");

            string version = ViewInterface.GetVersion();

            Debug.Log("GetVersion return : " + version);

            return version;
        }
    }
}
