﻿using System;
using System.Collections.Generic;
using MiniJSON;

namespace Stove.StoveSDK
{
    /**
     * View Request
     * @param URL View's url.
     * @param Sequence Unique value to distinguish between views.
     * @param Headers Http headers.
     * @param Cookies Http cookies.
     * @param ViewConfiguration View's UI configuration information.
     * @see ViewConfiguration
     * @since 2.0.0
     */
    public class ViewRequest
    {
        /**
         * View's url.
         * @since 2.0.0
         */
        public string URL { get; }

        /**
         * Unique value to distinguish between views.
         * @since 2.0.0
         */
        public int? Sequence { get; }

        /**
         * Http headers.
         * @since 2.0.0
         */
        public Dictionary<string, string> Headers { get; set; }

        /**
         * Http cookies.
         * @since 2.0.0
         */
        public Dictionary<string, string> Cookies { get; set; }

        /**
         * View's UI configuration information.
         * @see ViewConfiguration
         * @since 2.0.0
         */
        public ViewConfiguration ViewConfiguration { get; set; }

        public ViewRequest(string url, ViewConfiguration viewConfiguration)
        {
            URL = url;
            Sequence = null;
            Headers = new Dictionary<string, string>();
            Cookies = new Dictionary<string, string>();
            ViewConfiguration = viewConfiguration;
        }

        public ViewRequest(string url, int? sequence = null)
        {
            URL = url;
            Sequence = sequence;
            Headers = new Dictionary<string, string>();
            Cookies = new Dictionary<string, string>();
            ViewConfiguration = new ViewConfiguration();
        }

        /**
         * Dictionary deserialization.
         * @since 2.0.0
         */
        public ViewRequest(Dictionary<string, object> dictionary)
        {
            URL = dictionary["url"] as string;

            if (dictionary.ContainsKey("sequence"))
            {
                Sequence = Convert.ToInt32(dictionary["sequence"]);
            }

            Dictionary<string, string> headers = dictionary["headers"] as Dictionary<string, string>;
            if (headers != null)
            {
                Headers = headers;
            }
            else
            {
                Headers = new Dictionary<string, string>();
            }

            Dictionary<string, string> cookies = dictionary["cookies"] as Dictionary<string, string>;
            if (cookies != null)
            {
                Cookies = cookies;
            }
            else
            {
                Cookies = new Dictionary<string, string>();
            }

            Dictionary<string, object> viewConfiguration = dictionary["viewConfiguration"] as Dictionary<string, object>;
            if (viewConfiguration != null)
            {
                ViewConfiguration = new ViewConfiguration(viewConfiguration);
            }
            else
            {
                ViewConfiguration = new ViewConfiguration();
            }
        }

        /**
         * Dictionary serialization.
         * @since 2.0.0
         */
        public Dictionary<string, object> ToDictionary()
        {
            Dictionary<string, object> dictionary = new Dictionary<string, object>();
            dictionary.Add("url", URL);
            if(Sequence != null)
            {
                dictionary.Add("sequence", Sequence);
            }
            dictionary.Add("headers", Headers);
            dictionary.Add("cookies", Cookies);
            dictionary.Add("viewConfiguration", ViewConfiguration.ToDictionary());

            return dictionary;
        }

        /**
         * JSON serialization.
         * @since 2.0.0
         */
        public string ToJSONString()
        {
            Dictionary<string, object> dictionary = ToDictionary();

            return Json.Serialize(dictionary);
        }

        public override string ToString()
        {
            return "ViewRequest(Url='" + URL +
                "', Sequence=" + Sequence +
                ", Headers=" + Headers +
                ", Cookies=" + Cookies +
                ", ViewConfiguration=" + ViewConfiguration.ToString() +
                ")";
        }
    }
}
