﻿using AsmodeeDigital.Common.Plugin.Domain.CrossPromo;
using AsmodeeDigital.Common.Plugin.Domain.Data;
using AsmodeeDigital.Common.Plugin.Domain.Players;
using AsmodeeDigital.Common.Plugin.Manager.Event;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace AsmodeeDigital.Common.Plugin.Network
{
    public class RestAPI
    {
        #region Events
        public event Action ConnectionSuccessEvent;

        public event Action<User> EmailFoundEvent;

        public event Action EmailNotFoundEvent;

        public event Action<User> LoginFoundEvent;

        public event Action LoginNotFoundEvent;

        public event Action AuthenticationSuccessEvent;

        public event Action<string> AuthenticationErrorEvent;

        public event Action<User> AccountCreatedEvent;

        public event Action<string> AccountCreationErrorEvent;

        public event Action<Product> ReceivingProductEvent;

        public event Action<GroupProduct> ReceivingGroupProductEvent;

        public event Action LostPasswordEmailSentEvent;

        public event Action<string> LostPasswordErrorEvent;
        #endregion

        /// <summary>
        /// Connection parameters to DoW server
        /// </summary>
        private DoWNetworkParameters _networkParameters;

        /// <summary>
        /// OAuth2 Acess token
        /// </summary>
        private string _accessToken;

        private string baseUrl = "https://api.playreal.live";

        public RestAPI(DoWNetworkParameters networkParameters)
        {
            _networkParameters = networkParameters;
        }

        /// <summary>
        /// Connection to the DoW Server. Must be called first to obtain the access token
        /// </summary>
        /// <param name="connectionSuccess">Delegate to execute when the connection is established</param>
        public void Connect()
        {
            string hostName = baseUrl + "/main/v2/oauth/token";

            WWWForm form = new WWWForm();
            form.AddField("Host", hostName);
            form.AddField("Cache-Control", "no-cache");
            form.AddField("Content-Type", "application/x-www-form-urlencoded");
            form.AddField("grant_type", "client_credentials");
            form.AddField("client_id", _networkParameters.ClientId);
            form.AddField("client_secret", _networkParameters.ClientSecret);
            form.AddField("scope", "public");

            HTTP.Request someRequest = new HTTP.Request("post", hostName, form);
            someRequest.Send((request) =>
            {
                bool result = false;
                Hashtable thing = (Hashtable)JSON.JsonDecode(request.response.Text, ref result);
                if (!result)
                {
                    Debug.LogWarning("Could not parse JSON response!");
                    return;
                }
                else
                {
                    _accessToken = thing["access_token"].ToString();

                    if (ConnectionSuccessEvent != null)
                        EventManager.Instance.QueueEvent(ConnectionSuccessEvent);
                }
            });
        }

        /// <summary>
        /// Search a DoW user by his email. More informations here : https://apidoc.daysofwonder.com/#api-user-SearchByEmail
        /// </summary>
        /// <param name="email">Email to search</param>
        /// <param name="emailFound">Delegate to execcute when the email is found</param>
        /// <param name="emailNotFound">Delegate to execcute when the email is not found</param>
        public void SearchByEmail(string email)
        {
            string url = baseUrl + "/main/v1/users?";
            url += "email=" + Uri.EscapeDataString(email);

            HTTP.Request someRequest = new HTTP.Request("get", url);

            someRequest.AddHeader("Authorization", "bearer " + _accessToken);

            someRequest.Send((request) =>
            {
                bool result = false;
                Hashtable thing = (Hashtable)JSON.JsonDecode(request.response.Text, ref result);

                if (!result)
                {
                    Debug.LogWarning("Could not parse JSON response!");
                    return;
                }
                else
                {
                    ArrayList usersList = (ArrayList)(((Hashtable)thing["data"])["users"]);

                    if (usersList.Count > 0)
                    {
                        Hashtable userVar = (Hashtable)usersList[0];
                        User user = GetUser(userVar);

                        if (EmailFoundEvent != null)
                            EventManager.Instance.QueueEvent<User>(EmailFoundEvent, user);
                    }
                    else
                    {
                        if (EmailNotFoundEvent != null)
                            EventManager.Instance.QueueEvent(EmailNotFoundEvent);
                    }
                }
            });
        }

        /// <summary>
        /// Search a DoW User by his login. More informations here : https://apidoc.daysofwonder.com/#api-user-UserSignup
        /// </summary>
        /// <param name="login">Login to search</param>
        /// <param name="useWildcardAtTheEnd">Add a wildcard at the end of the login</param>
        /// <param name="loginFound">Delegate to execute when a login is found</param>
        /// <param name="loginNotFound">Delegate to execute when the login is not found</param>
        public void SearchByLogin(string login, bool useWildcardAtTheEnd)
        {
            string url = baseUrl + "/main/v1/users?";
            url += "login=" + Uri.EscapeDataString(login);
            if (useWildcardAtTheEnd)
                url += Uri.EscapeDataString("%");

            HTTP.Request someRequest = new HTTP.Request("get", url);

            someRequest.AddHeader("Authorization", "bearer " + _accessToken);

            someRequest.Send((request) =>
            {
                bool result = false;
                Hashtable thing = (Hashtable)JSON.JsonDecode(request.response.Text, ref result);

                if (!result)
                {
                    Debug.LogWarning("Could not parse JSON response!");
                    return;
                }
                else
                {
                    ArrayList usersList = (ArrayList)(((Hashtable)thing["data"])["users"]);

                    if (usersList.Count > 0)
                    {
                        Hashtable userVar = (Hashtable)usersList[0];
                        User user = GetUser(userVar);

                        if (LoginFoundEvent != null)
                            EventManager.Instance.QueueEvent<User>(LoginFoundEvent, user);
                    }
                    else
                    {
                        if (LoginNotFoundEvent != null)
                            EventManager.Instance.QueueEvent(LoginNotFoundEvent);
                    }
                }
            });
        }

        /// <summary>
        /// Authentication of a user on the DoW server
        /// </summary>
        /// <param name="login">Login of the user</param>
        /// <param name="password">Password of the user</param>
        /// <param name="authenticationSuccess">Delegate to execute when the authentication is successfull</param>
        /// <param name="authenticationError">Delegate to execute when the authenticatin is on error</param>
        public void Authentication(string login, string password)
        {
            string hostName = baseUrl + "/main/v2/oauth/token";

            WWWForm form = new WWWForm();
            form.AddField("Host", hostName);
            form.AddField("Cache-Control", "no-cache");
            form.AddField("Content-Type", "application/x-www-form-urlencoded");
            form.AddField("grant_type", "password");
            form.AddField("client_id", _networkParameters.ClientId);
            form.AddField("client_secret", _networkParameters.ClientSecret);
            form.AddField("username", login);
            form.AddField("password", password);

            HTTP.Request someRequest = new HTTP.Request("post", hostName, form);
            someRequest.Send((request) =>
            {
                // parse some JSON, for example:
                bool result = false;
                Hashtable thing = (Hashtable)JSON.JsonDecode(request.response.Text, ref result);
                if (!result)
                {
                    Debug.LogWarning("Could not parse JSON response!");
                    return;
                }
                else
                {
                    if (thing.ContainsKey("error_description"))
                    {
                        string errorDescription = thing["error_description"].ToString();

                        if (AuthenticationErrorEvent != null)
                            EventManager.Instance.QueueEvent<string>(AuthenticationErrorEvent, errorDescription);
                    }
                    else
                    {
                        _accessToken = thing["access_token"].ToString();

                        if (AuthenticationSuccessEvent != null)
                            EventManager.Instance.QueueEvent(AuthenticationSuccessEvent);
                    }
                }
            });
        }

        /// <summary>
        /// Create a DoW user account
        /// </summary>
        /// <param name="login">Login of the user</param>
        /// <param name="password">Password of the user</param>
        /// <param name="email">Email of the user</param>
        /// <param name="subscribeNewsletter">Subscribe or not to the DoW newsletter</param>
        /// <param name="createAccountSuccess">Delegate to execute when the account is created</param>
        /// <param name="createAccountError">Delegate to execute when there is an error during the account creation</param>
        public void CreateAccount(string login, string password, string email, bool subscribeNewsletter)
        {
            string hostName = baseUrl + "/main/v1/user";

            Hashtable parameters = new Hashtable();
            parameters.Add("client_id", _networkParameters.ClientId);
            parameters.Add("client_secret", _networkParameters.ClientSecret);
            parameters.Add("login", login);
            parameters.Add("password", password);
            parameters.Add("email", email);
            parameters.Add("newsletter", subscribeNewsletter);

            HTTP.Request someRequest = new HTTP.Request("post", hostName, parameters);

            someRequest.AddHeader("Authorization", "bearer " + _accessToken);

            someRequest.Send((request) =>
            {
                // parse some JSON, for example:
                bool result = false;
                Hashtable thing = (Hashtable)JSON.JsonDecode(request.response.Text, ref result);
                if (!result)
                {
                    Debug.LogWarning("Could not parse JSON response!");
                    return;
                }
                else
                {
                    if (thing.ContainsKey("error_description"))
                    {
                        string errorDescription = thing["error_description"].ToString();

                        if (AccountCreationErrorEvent != null)
                            EventManager.Instance.QueueEvent<string>(AccountCreationErrorEvent, errorDescription);
                    }
                    else
                    {
                        Hashtable hashtable = (Hashtable)thing["data"];

                        User user = GetUser(hashtable);

                        if (AccountCreatedEvent != null)
                            EventManager.Instance.QueueEvent<User>(AccountCreatedEvent, user);
                    }
                }
            });
        }

        public void ResetPassword(int userID)
        {
            string url = String.Format(baseUrl + "/main/v1/user/{0}/password", userID);

            HTTP.Request someRequest = new HTTP.Request("delete", url);

            someRequest.AddHeader("Authorization", "bearer " + _accessToken);

            someRequest.Send((request) =>
            {
                bool result = false;
                Hashtable thing = (Hashtable)JSON.JsonDecode(request.response.Text, ref result);

                if (!result)
                {
                    Debug.LogWarning("Could not parse JSON response!");
                    return;
                }
                else
                {
                    if (thing.ContainsKey("error_description"))
                    {
                        string errorDescription = thing["error_description"].ToString();

                        if (LostPasswordErrorEvent != null)
                            EventManager.Instance.QueueEvent<string>(LostPasswordErrorEvent, errorDescription);
                    }
                    else
                    {
                        if (LostPasswordEmailSentEvent != null)
                            EventManager.Instance.QueueEvent(LostPasswordEmailSentEvent);
                    }
                }
            });
        }

        private Product GetSmallWorld3x1()
        {
            Product smallWorld = new Product();

            smallWorld.Name = "Small World 2";
            smallWorld.Description = "Dans Small World, les joueurs luttent pour conquérir les régions d'un monde où il n'y a pas de place pour tous !\r\n\r\nConçu par Philippe Keyaerts dans la droite ligne du jeu Vinci™, primé à plusieurs reprises, Small World plongera les joueurs dans un monde habité par des nains, des mages, des amazones, des géants, des orcs et même des humains.Ces peuples luttent sans merci en envoyant leurs troupes à la conquête de nouvelles régions: les civilisations les plus faibles seront impitoyablement chassées du monde de Small World !";

            smallWorld.Tile = new Tile();
            smallWorld.Tile.ImageUrl = "http://www.payoff.fr/client/160619_DOW/sw_banner2_en.jpg";
            smallWorld.Tile.Width = 3;
            smallWorld.Tile.Height = 1;

            smallWorld.IconUrl = "http://www.payoff.fr/client/160619_DOW/sw_title_amazon.jpg";

            smallWorld.Videos.Add(new VideoDesc("http://www.payoff.fr/client/160619_DOW/movie.mp4"));

            smallWorld.Images.Add(new ImageDesc("http://www.payoff.fr/client/160619_DOW/sw_title_dwarf.jpg"));
            smallWorld.Images.Add(new ImageDesc("http://www.payoff.fr/client/160619_DOW/sw_title_ghoul.jpg"));
            smallWorld.Images.Add(new ImageDesc("http://www.payoff.fr/client/160619_DOW/sw_title_skeleton.jpg"));
            smallWorld.Images.Add(new ImageDesc("http://www.payoff.fr/client/160619_DOW/sw_title_triton.jpg"));
            smallWorld.Images.Add(new ImageDesc("http://www.payoff.fr/client/160619_DOW/sw_title_wizard.jpg"));

            smallWorld.ShopDigitalUrl = "https://play.google.com/store/apps/details?id=com.daysofwonder.tt.android&hl=fr";
            smallWorld.ShopPhysicalUrl = "https://www.amazon.fr/Asmodée-AVE02-Stratégie-Aventuriers-Europe/dp/B000NJL2GO/ref=sr_1_1?ie=UTF8&qid=1466265016&sr=8-1&keywords=ticket+to+ride";


            return smallWorld;
        }

        private Product GetGangOfFour1x2()
        {
            Product gangOfFour = new Product();

            gangOfFour.Name = "Gang of four";
            gangOfFour.Description = "Gang of Four™, un superbe jeu de cartes qui mêle ruse, stratégie et pouvoir. Originaire de Hong Kong, il est le plus populaire des jeux de cartes à nous parvenir d'Asie depuis des décennies.";

            gangOfFour.Tile = new Tile();
            gangOfFour.Tile.ImageUrl = "http://www.payoff.fr/client/160619_DOW/gf2_backcard.jpg";
            gangOfFour.Tile.Width = 1;
            gangOfFour.Tile.Height = 2;

            gangOfFour.Videos.Add(new VideoDesc("http://www.payoff.fr/client/160619_DOW/movie.mp4"));

            gangOfFour.IconUrl = "http://www.payoff.fr/client/160619_DOW/gf2_logo_3lines.jpg";
            gangOfFour.Images.Add(new ImageDesc("http://www.payoff.fr/client/160619_DOW/gf2_dragon_card.jpg"));
            gangOfFour.Images.Add(new ImageDesc("http://www.payoff.fr/client/160619_DOW/gf-splash.jpg"));
            gangOfFour.Images.Add(new ImageDesc("http://www.payoff.fr/client/160619_DOW/gf2_online_logo.jpg"));

            gangOfFour.ShopDigitalUrl = "https://play.google.com/store/apps/details?id=com.daysofwonder.tt.android&hl=fr";
            gangOfFour.ShopPhysicalUrl = "https://www.amazon.fr/Asmodée-AVE02-Stratégie-Aventuriers-Europe/dp/B000NJL2GO/ref=sr_1_1?ie=UTF8&qid=1466265016&sr=8-1&keywords=ticket+to+ride";


            return gangOfFour;
        }




        private Product GetTicketToRide1x1()
        {
            Product ticketToRide = new Product();

            ticketToRide.Name = "Ticket to ride";
            ticketToRide.Description = "Votre objectif est d'obtenir le plus de points possibles, en:<margin-left=3em>\r\n\r\n\u2022<indent=3em>Prenant possession d'une route;</indent>\r\n\r\n\u2022<indent=3em> Reliant les deux villes d'une même carte Destination en votre possession par un réseau continu de trains à votre couleur;</indent>\r\n\r\n\u2022<indent=3em>Ou en établissant le réseau ferroviaire continu le plus long.</indent>\r\n\u2022<indent=3em>Des points sont perdus chaque fois que les deux villes d'une carte Destination en votre possession ne sont pas reliées lorsque le jeu s'arrête.</indent></margin>\r\n\r\n<b>Tour de Jeu</b>\r\n\r\nDans les Aventuriers du Rail, à chaque tour de jeu, une seule des 3 actions suivantes peut être choisie : \r\n\r\n\u2022<indent=3em>Piocher deux nouvelles cartes Wagons ;</indent>\r\n\u2022<indent=3em>Prendre possession d'une route en y posant des trains;</indent>\r\n\u2022<indent=3em> ou piocher de nouvelles cartes Destination.";


            //ticketToRide.Description = "mes éléments :<margin-left=3em>\r\n\u2022<indent=3em> 1er élément</indent>\r\n\u2022<indent=3em>2ème élément <sprite=2></indent>\r\n</margin>\r\nContinuons ce texte";


            //"Les Aventuriers du Rail vous invite à bord d'une aventure ferroviaire dans laquelle vous collectionez des wagons pour prendre le contrôle de chemins de fer reliant les différentes villes des Etats-Unis d'Amérique.\r\nPlus longues seront vos routes, plus grand sera le nombre de points gagnés.\r\nDes points supplémentaires seront attribués à ceux qui auront su connecter les villes lointaines désignées par leurs cartes Destination, ainsi qu'au(x) joueur(s) au réseau ferroviaire le plus long.";

            ticketToRide.Tile = new Tile();
            ticketToRide.Tile.ImageUrl = "http://www.payoff.fr/client/160619_DOW/T2R-FACE-box-2015-en.jpg";
            ticketToRide.Tile.Width = 1;
            ticketToRide.Tile.Height = 1;

            ticketToRide.IconUrl = "http://www.payoff.fr/client/160619_DOW/T2R-FACE-box-2015-en.jpg";

            //https://r2---sn-4gxx-25gz.googlevideo.com/videoplayback?initcwndbps=530000&upn=ZHqTDPAa1Oc&id=o-AKRlZZwPMAQGIjPaQVf8kDR1l6ZevSYmBGlFtWwX1ynw&lmt=1455597462267843&ip=88.190.214.209&key=yt6&fexp=9405964%2C9414671%2C9416126%2C9416778%2C9416891%2C9419451%2C9422596%2C9423194%2C9425363%2C9428398%2C9428656%2C9431012%2C9432683%2C9433096%2C9433221%2C9433946%2C9434338%2C9435526%2C9435666%2C9435876%2C9437066%2C9437552%2C9438570%2C9439089&sparams=cnr%2Cdur%2Cid%2Cinitcwndbps%2Cip%2Cipbits%2Citag%2Clmt%2Cmime%2Cmm%2Cmn%2Cms%2Cmv%2Cpl%2Cratebypass%2Crequiressl%2Csource%2Cupn%2Cusequic%2Cexpire&pl=23&sver=3&expire=1465952034&dur=75.046&usequic=no&ratebypass=yes&itag=22&cnr=14&signature=C95F26269F5D1BE5EB79459D1A89C6A03E4755A0.7366A9A1303A35E60E2ECE55DC09ACF162F10F82&ipbits=0&mv=m&mt=1465929948&ms=au&source=youtube&mime=video%2Fmp4&requiressl=yes&mn=sn-4gxx-25gz&mm=31

            //ticketToRide.Videos.Add(new VideoDesc("https://r8---sn-4gxx-25ge.googlevideo.com/videoplayback?usequic=no&ipbits=0&ratebypass=yes&initcwndbps=625000&expire=1465924058&upn=iiopRCs09kU&mime=video%2Fmp4&sparams=aol%2Ccnr%2Cdur%2Cid%2Cinitcwndbps%2Cip%2Cipbits%2Citag%2Clmt%2Cmime%2Cmm%2Cmn%2Cms%2Cmv%2Cpl%2Cratebypass%2Crequiressl%2Csource%2Cupn%2Cusequic%2Cexpire&id=o-AFiFmDeDUYZpo18PGUCMvV38GJaaDZ2r6BnAZIDzcrS3&sver=3&dur=89.814&source=youtube&aol=yes&requiressl=yes&cnr=14&itag=22&lmt=1451381246776488&ms=au&mt=1465902333&fexp=9405970%2C9413139%2C9416126%2C9416891%2C9419451%2C9422342%2C9422596%2C9428398%2C9429134%2C9431012%2C9432057%2C9433096%2C9433221%2C9433946%2C9434529%2C9434605%2C9434954%2C9435187%2C9435526%2C9435876%2C9436224%2C9436607%2C9437066%2C9437324%2C9437552%2C9438256%2C9438337%2C9438380&mv=m&pl=23&signature=D9B22D7CCEDDF8991CE7F417CE3A7B161502B87A.0C6FB04D64281D037E515975A3D0B586CBD859C1&key=yt6&ip=88.190.214.209&mm=31&mn=sn-4gxx-25ge"));
            //ticketToRide.Videos.Add(new VideoDesc("https://r2---sn-4gxx-25gl.googlevideo.com/videoplayback?sparams=dur%2Cid%2Cinitcwndbps%2Cip%2Cipbits%2Citag%2Clmt%2Cmime%2Cmm%2Cmn%2Cms%2Cmv%2Cpl%2Cratebypass%2Crequiressl%2Csource%2Cupn%2Cusequic%2Cexpire&itag=43&signature=AA59FCA7C5D48CE511D5D45903E26F32A8CB1CA9.6A701440448A8279D29EB8BD50DE0428C4A30739&ratebypass=yes&mime=video%2Fwebm&pl=23&expire=1465952300&source=youtube&key=yt6&sver=3&upn=JvX1GU3DaaY&requiressl=yes&lmt=1320748669972841&fexp=9406993%2C9408207%2C9413140%2C9416126%2C9416891%2C9419451%2C9422596%2C9423194%2C9428398%2C9431012%2C9432650%2C9433096%2C9433223%2C9433777%2C9433946%2C9435526%2C9435876%2C9435917%2C9436878%2C9437066%2C9437077%2C9437403%2C9437553%2C9437668%2C9437673%2C9438245%2C9438378%2C9438929%2C9439079&usequic=no&ip=88.190.214.209&ms=au&mt=1465930266&dur=0.000&mv=m&id=o-AG_F8wDNTsKorJ2fcw6Sig7hlwP21T0dX8CPQW-ulp9S&mm=31&ipbits=0&mn=sn-4gxx-25gl&initcwndbps=528750"));

            ticketToRide.Videos.Add(new VideoDesc("http://www.payoff.fr/client/160619_DOW/movie.mp4"));

            ticketToRide.Images.Add(new ImageDesc("http://www.payoff.fr/client/160619_DOW/ts_full_us_screenshot.jpg"));
            ticketToRide.Images.Add(new ImageDesc("http://www.payoff.fr/client/160619_DOW/ts_full_eu_screenshot.jpg"));
            ticketToRide.Images.Add(new ImageDesc("http://www.payoff.fr/client/160619_DOW/ts_full_sw_screenshot.jpg"));
            ticketToRide.Images.Add(new ImageDesc("http://www.payoff.fr/client/160619_DOW/ts_full_main_screenshot_en.jpg"));
            ticketToRide.Images.Add(new ImageDesc("http://www.payoff.fr/client/160619_DOW/trip1.2station-EN.jpg"));
            ticketToRide.Images.Add(new ImageDesc("http://www.payoff.fr/client/160619_DOW/trip1.2onlineGame-EN.jpg"));
            ticketToRide.Images.Add(new ImageDesc("http://www.payoff.fr/client/160619_DOW/trip1.2gameSelection-EN.jpg"));

            ticketToRide.Awards.Add(new Award("https://cdn1.daysofwonder.com/tickettoride/fr/img/tt_award1.jpg"));
            ticketToRide.Awards.Add(new Award("https://cdn1.daysofwonder.com/tickettoride/fr/img/tt_award2.jpg"));
            ticketToRide.Awards.Add(new Award("https://cdn1.daysofwonder.com/tickettoride/fr/img/tt_award3.jpg"));
            ticketToRide.Awards.Add(new Award("https://cdn0.daysofwonder.com/tickettoride/fr/img/tt_award4.jpg"));

            ticketToRide.ShopDigitalUrl = "https://play.google.com/store/apps/details?id=com.daysofwonder.tt.android&hl=fr";
            ticketToRide.ShopPhysicalUrl = "https://www.amazon.fr/Asmodée-AVE02-Stratégie-Aventuriers-Europe/dp/B000NJL2GO/ref=sr_1_1?ie=UTF8&qid=1466265016&sr=8-1&keywords=ticket+to+ride";

            return ticketToRide;
        }

        private Product GetFiveTribes1x1()
        {
            Product fiveTribes = new Product();

            fiveTribes.Name = "Five tribes";
            fiveTribes.Description = "Après des journées de voyage au cœur du pays des mille et une nuits, votre caravane arrive enfin au fabuleux sultanat de Naqala.\r\n\r\nLes rumeurs étaient vraies : le vieux sultan est mort...\r\n\r\nLes oracles prédisent la venue d'un étranger qui saurait gagner les faveurs des Cinq Tribus pour prendre sa place.\r\n\r\nAllez - vous accomplir la prophétie? Invoquez les anciens Djinns, faites appel aux différentes tribus au moment opportun, et le trône sera à vous !";

            fiveTribes.Tile = new Tile();
            fiveTribes.Tile.ImageUrl = "http://www.payoff.fr/client/160619_DOW/FIVE-TRIBES-box-front.jpg";
            fiveTribes.Tile.Width = 1;
            fiveTribes.Tile.Height = 1;

            fiveTribes.IconUrl = "http://www.payoff.fr/client/160619_DOW/FIVE-TRIBES-box-front.jpg";

            fiveTribes.Videos.Add(new VideoDesc("http://www.payoff.fr/client/160619_DOW/movie.mp4"));

            fiveTribes.Images.Add(new ImageDesc("http://www.payoff.fr/client/160619_DOW/FIVE-TRIBES-boards.jpg"));
            fiveTribes.Images.Add(new ImageDesc("http://www.payoff.fr/client/160619_DOW/FIVE-TRIBES-djinn-illus1.jpg"));
            fiveTribes.Images.Add(new ImageDesc("http://www.payoff.fr/client/160619_DOW/FIVE-TRIBES-djinn-illus2.jpg"));
            fiveTribes.Images.Add(new ImageDesc("http://www.payoff.fr/client/160619_DOW/FIVE-TRIBES-djinn-illus3.jpg"));
            fiveTribes.Images.Add(new ImageDesc("http://www.payoff.fr/client/160619_DOW/FIVE-TRIBES-djinn.jpg"));
            fiveTribes.Images.Add(new ImageDesc("http://www.payoff.fr/client/160619_DOW/FIVE-TRIBES-market-cards-2015.jpg"));

            fiveTribes.ShopDigitalUrl = "https://play.google.com/store/apps/details?id=com.daysofwonder.tt.android&hl=fr";
            fiveTribes.ShopPhysicalUrl = "https://www.amazon.fr/Asmodée-AVE02-Stratégie-Aventuriers-Europe/dp/B000NJL2GO/ref=sr_1_1?ie=UTF8&qid=1466265016&sr=8-1&keywords=ticket+to+ride";

            return fiveTribes;
        }

        private Product GetQuadropolis1x1()
        {
            Product quadroPolis = new Product();

            quadroPolis.Name = "Quadropolis";
            quadroPolis.Description = "Après une dure journée de travail, vous prenez quelques minutes pour admirer la ville à travers les baies vitrées de votre bureau… À cette heure, la plupart de vos administrés rentrent chez eux, dans les hautes tours qui vous font face. D’autres se promènent dans les parcs et jardins de la ville avec leurs enfants, et certains font leurs courses dans le nouveau centre commercial que vous avez ouvert il y a quelques semaines. Au loin, près du port, vous distinguez la fumée qui s’élève des cheminées des usines du quartier industriel. La ville ne dort jamais…";

            quadroPolis.Tile = new Tile();
            quadroPolis.Tile.ImageUrl = "http://www.payoff.fr/client/160619_DOW/qp_topbox.jpg";
            quadroPolis.Tile.Width = 1;
            quadroPolis.Tile.Height = 1;

            quadroPolis.Videos.Add(new VideoDesc("http://www.payoff.fr/client/160619_DOW/movie.mp4"));

            quadroPolis.IconUrl = "http://www.payoff.fr/client/160619_DOW/qp_topbox.jpg";

            quadroPolis.Images.Add(new ImageDesc("http://www.payoff.fr/client/160619_DOW/qp_topbox.jpg"));
            quadroPolis.Images.Add(new ImageDesc("http://www.payoff.fr/client/160619_DOW/qp_blue_architect1_rgb.jpg"));
            quadroPolis.Images.Add(new ImageDesc("http://www.payoff.fr/client/160619_DOW/qp_green_architect2_rgb.jpg"));
            quadroPolis.Images.Add(new ImageDesc("http://www.payoff.fr/client/160619_DOW/qp_red_architect3_rgb.jpg"));
            quadroPolis.Images.Add(new ImageDesc("http://www.payoff.fr/client/160619_DOW/qp_yellow_architect4_rgb.jpg"));
            quadroPolis.Images.Add(new ImageDesc("http://www.payoff.fr/client/160619_DOW/qp_game_elements_rgb.jpg"));
            quadroPolis.Images.Add(new ImageDesc("http://www.payoff.fr/client/160619_DOW/qp_setup_rgb.jpg"));

            quadroPolis.ShopDigitalUrl = "https://play.google.com/store/apps/details?id=com.daysofwonder.tt.android&hl=fr";
            quadroPolis.ShopPhysicalUrl = "https://www.amazon.fr/Asmodée-AVE02-Stratégie-Aventuriers-Europe/dp/B000NJL2GO/ref=sr_1_1?ie=UTF8&qid=1466265016&sr=8-1&keywords=ticket+to+ride";

            return quadroPolis;
        }

        private Product GetQuadropolis2x2()
        {
            Product quadroPolis = GetQuadropolis1x1();
            quadroPolis.Tile.Width = 2;
            quadroPolis.Tile.Height = 2;

            return quadroPolis;
        }

        public void BannerRequest()
        {
            Product smallWorld = GetSmallWorld3x1();

            if (ReceivingProductEvent != null)
                EventManager.Instance.QueueEvent<Product>(ReceivingProductEvent, smallWorld);
        }

        public void MoreGameRequest(MoreGamesFilters moreGamesFilters)
        {
            GroupProduct groupProduct = new GroupProduct();

            switch (moreGamesFilters)
            {
                case MoreGamesFilters.New:
                    groupProduct.Products.Add(GetSmallWorld3x1());
                    groupProduct.Products.Add(GetTicketToRide1x1());
                    groupProduct.Products.Add(GetFiveTribes1x1());
                    groupProduct.Products.Add(GetQuadropolis1x1());

                    groupProduct.Products.Add(GetGangOfFour1x2());

                    groupProduct.Products.Add(GetTicketToRide1x1());
                    groupProduct.Products.Add(GetFiveTribes1x1());
                    groupProduct.Products.Add(GetQuadropolis1x1());
                    groupProduct.Products.Add(GetFiveTribes1x1());

                    break;
                case MoreGamesFilters.Gamer:

                    groupProduct.Products.Add(GetQuadropolis1x1());
                    groupProduct.Products.Add(GetTicketToRide1x1());
                    groupProduct.Products.Add(GetQuadropolis2x2());
                    groupProduct.Products.Add(GetSmallWorld3x1());
                    groupProduct.Products.Add(GetGangOfFour1x2());
                    groupProduct.Products.Add(GetFiveTribes1x1());

                    break;
                case MoreGamesFilters.Family:
                    groupProduct.Products.Add(GetGangOfFour1x2());
                    groupProduct.Products.Add(GetGangOfFour1x2());
                    groupProduct.Products.Add(GetGangOfFour1x2());


                    break;
                case MoreGamesFilters.Board:

                    groupProduct.Products.Add(GetTicketToRide1x1());
                    groupProduct.Products.Add(GetGangOfFour1x2());
                    groupProduct.Products.Add(GetFiveTribes1x1());
                    groupProduct.Products.Add(GetQuadropolis1x1());
                    groupProduct.Products.Add(GetTicketToRide1x1());
                    groupProduct.Products.Add(GetGangOfFour1x2());
                    groupProduct.Products.Add(GetFiveTribes1x1());
                    groupProduct.Products.Add(GetQuadropolis1x1());

                    break;
                default:
                    break;
            }

            if (ReceivingGroupProductEvent != null)
                EventManager.Instance.QueueEvent<GroupProduct>(ReceivingGroupProductEvent, groupProduct);
        }

        public void InterstitialRequest()
        {
            GroupProduct groupProduct = new GroupProduct();

            groupProduct.Products.Add(GetSmallWorld3x1());
            groupProduct.Products.Add(GetTicketToRide1x1());
            groupProduct.Products.Add(GetFiveTribes1x1());
            groupProduct.Products.Add(GetQuadropolis1x1());

            if (ReceivingGroupProductEvent != null)
                EventManager.Instance.QueueEvent<GroupProduct>(ReceivingGroupProductEvent, groupProduct);
        }

        /// <summary>
        /// Get a user in a formatted hashtable
        /// </summary>
        /// <param name="hashtable"></param>
        /// <returns></returns>
        private User GetUser(Hashtable hashtable)
        {
            User user = ScriptableObject.CreateInstance<User>();

            user.DoWID = int.Parse(hashtable["user_id"].ToString());
            user.Login = (string)hashtable["login_name"];

            return user;
        }
    }
}
