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

    /**
     * Character information.
     * @since 2.1.0
     */
    public class Character
    {
        /**
         * Unique value to distinguish between character.
         * @since 2.1.0
         */
        public long MemberNumber { get; }

        /**
         * Used transfer Character.
         * @since 2.1.0
         */
        public string Token { get; }

        /**
         * Unique value to distinguish between Character.
         * @since 2.1.0
         */
        public long CharacterNumber { get; }

        /**
         * World id of Character.
         * @since 2.1.0
         */
        public string World { get; }

        /**
         * Alias name of Character.
         * @since 2.1.0
         */
        public string Nickname { get; }

        /**
         * Character's last login time.
         * @since 2.1.0
         */
        public long LastLoginTimeMillis { get; }

        /**
         * Additional information of Character.
         * @since 2.1.0
         */
        public List<Dictionary<string, object>> Extras { get; }

        internal long TargetCharacterNumber { get; }
        internal string TargetAccessToken { get; }

        /**
         * Dictionary deserialization.
         * @since 2.1.0
         */
        public Character(Dictionary<string, object> dictionary)
        {
            MemberNumber = Convert.ToInt64(dictionary["memberNumber"]);
            Token = dictionary["token"] as string;
            CharacterNumber = Convert.ToInt64(dictionary["characterNumber"]);
            World = dictionary["world"] as string;
            Nickname = dictionary["nickname"] as string;
            LastLoginTimeMillis = Convert.ToInt64(dictionary["lastLoginTimeMillis"]);
            List<Dictionary<string, object>> extras = new List<Dictionary<string, object>>();
            List<object> extrasObject = dictionary["extras"] as List<object>;
            foreach (object extraObject in extrasObject)
            {
                extras.Add(extraObject as Dictionary<string, object>);
            }
            Extras = extras;
            TargetCharacterNumber = Convert.ToInt64(dictionary["targetCharacterNumber"]);
            TargetAccessToken = dictionary["targetAccessToken"] as string;
        }

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

            dictionary.Add("memberNumber", MemberNumber);
            dictionary.Add("token", Token);
            dictionary.Add("characterNumber", CharacterNumber);
            dictionary.Add("world", World);
            dictionary.Add("nickname", Nickname);
            dictionary.Add("lastLoginTimeMillis", LastLoginTimeMillis);
            dictionary.Add("extras", Extras);
            dictionary.Add("targetCharacterNumber", TargetCharacterNumber);
            dictionary.Add("targetAccessToken", TargetAccessToken);


            return dictionary;
        }

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

            return Json.Serialize(dictionary);
        }

        public override string ToString()
        {
            string extraString = "";
            if (Extras != null)
            {
                extraString = Json.Serialize(Extras);
            }

            return "Character(MemberNumber='" + MemberNumber
                + "', Token='" + Token
                + "', CharacterNumber=" + CharacterNumber
                + "', World='" + World
                + "', Nickname='" + Nickname
                + "', LastLoginTimeMillis='" + LastLoginTimeMillis
                + "', Extras='" + extraString
                + "', TargetCharacterNumber='" + TargetCharacterNumber
                + "', TargetAccessToken='" + TargetAccessToken
                + ")";
        }
    }
}

