﻿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<string> 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 Access 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>
        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>
        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>
        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) =>
            {
                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();

                        string refreshToken = thing["refresh_token"].ToString();

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

        /// <summary>
        /// Authentication of a user on the DoW server with a refresh token
        /// </summary>
        ///<param name="refreshToken">Refresh token</param>
        public void AuthenticationWithRefreshToken(string refreshToken)
        {
            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", "refresh_token");
            form.AddField("client_id", _networkParameters.ClientId);
            form.AddField("client_secret", _networkParameters.ClientSecret);
            form.AddField("refresh_token", refreshToken);

            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
                {
                    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();

                        refreshToken = thing["refresh_token"].ToString();

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

        /// <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>
        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) =>
            {
                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);
                    }
                }
            });
        }

        /// <summary>
        /// Reset the password of a user
        /// </summary>
        /// <param name="userID">DoW user ID</param>
        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.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;
        }
    }
}
