﻿using AsmodeeDigital.Common.Plugin.Domain.CrossPromo;
using AsmodeeDigital.Common.Plugin.Domain.Data;
using AsmodeeDigital.Common.Plugin.Manager.Event;
using System;
using System.Collections;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
using UnityEngine;

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

        public event Action<DataUser> EmailFoundEvent;

        public event Action EmailNotFoundEvent;

        public event Action<DataUser> LoginFoundEvent;

        public event Action LoginNotFoundEvent;

        public event Action<AuthenticationTokens> AuthenticationSuccessEvent;

        public event Action<string> AuthenticationErrorEvent;

        public event Action<DataUser> 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;

        public event Action<string> ErrorEvent;
        #endregion

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

        /// <summary>
        /// OAuth2 access token and refresh token
        /// </summary>
        private AuthenticationTokens _authenticationTokens;

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

        /// <summary>
        /// Check the Pin Public Key
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="certificate"></param>
        /// <param name="chain"></param>
        /// <param name="sslPolicyErrors"></param>
        /// <returns></returns>
        public bool PinPublicKey(object sender, X509Certificate certificate, X509Chain chain,
                            SslPolicyErrors sslPolicyErrors)
        {
            if (null == certificate)
                return false;

            //Warn : If there is an error with GetPublicKeyString it's because the target in unity is Web.
            //       Please set the target to PC, iOS or Android
            String pk = certificate.GetPublicKeyString();

            if (pk.Equals(_networkParameters.RestAPIPinPublicKey))
                return true;

            return false;
        }

        /// <summary>
        /// Create HTTP User-Agent for REST Requests
        /// </summary>
        /// <returns></returns>
        private string GetUserAgent()
        {
            return String.Format("{0}/{1} {2}/ Unity/{3}", Application.productName, Application.version, Application.platform, Application.unityVersion);
        }

        private void RequestCall(string accessToken, string url, WWWForm wwwForm, Hashtable parameters, string httpMethod, Action<string> dataResponse, Action<DataError> error = null)
        {
            HTTP.Request someRequest = null;

            if (wwwForm != null)
                someRequest = new HTTP.Request(httpMethod, url, wwwForm);
            else if (parameters != null)
                someRequest = new HTTP.Request(httpMethod, url, parameters);
            else
                someRequest = new HTTP.Request(httpMethod, url);

            someRequest.ValidateServerCertificate = PinPublicKey;

            if (!string.IsNullOrEmpty(accessToken))
                someRequest.AddHeader("Authorization", "bearer " + accessToken);

            someRequest.AddHeader("User-Agent", GetUserAgent());

            someRequest.Send((request) =>
            {
                DataError dataError = JsonUtility.FromJson<DataError>(request.response.Text);

                if (dataError != null && !String.IsNullOrEmpty(dataError.error_description))
                {
                    if (error == null && ErrorEvent != null)
                        EventManager.Instance.QueueEvent<string>(ErrorEvent, dataError.error_description);
                    else if (error != null)
                        error(dataError);
                }
                else
                {
                    dataResponse(request.response.Text);
                }
            });
        }

        private void RequestCall(string accessToken, string url, WWWForm wwwForm, Hashtable parameters, string httpMethod, Action<Data> dataResponse, Action<DataError> error = null)
        {
            RequestCall(accessToken, url, wwwForm, parameters, httpMethod,
                (string response) =>
                {
                    DataContainer dataContainer = JsonUtility.FromJson<DataContainer>(response);

                    dataResponse(dataContainer.data);
                }
                , error);
        }

        /// <summary>
        /// Connection to the DoW Server. Must be called first to obtain the access token
        /// </summary>
        public void Connect()
        {
            string url = String.Format("https://{0}/main/v2/oauth/token", _networkParameters.RestAPIHostName);

            WWWForm form = new WWWForm();
            form.AddField("Host", url);
            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");

            RequestCall(string.Empty, url, form, null, "post",
            (string responseText) =>
            {
                _authenticationTokens = JsonUtility.FromJson<AuthenticationTokens>(responseText);

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

        /// <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 accessToken, string email)
        {
            string url = String.Format("https://{0}/main/v1/users?email={1}", _networkParameters.RestAPIHostName, Uri.EscapeDataString(email));

            RequestCall(accessToken, url, null, null, "get", (Data data) =>
            {
                if (data.users.Length > 0)
                {
                    DataUser user = data.users[0];

                    if (EmailFoundEvent != null)
                        EventManager.Instance.QueueEvent<DataUser>(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 accessToken, string login, bool useWildcardAtTheEnd)
        {
            string url = String.Format("https://{0}/main/v1/users?login={1}{2}", _networkParameters.RestAPIHostName, Uri.EscapeDataString(login), useWildcardAtTheEnd ? Uri.EscapeDataString("%") : "");

            RequestCall(accessToken, url, null, null, "get",
            (Data data) =>
            {
                if (data.users.Length > 0)
                {
                    DataUser user = data.users[0];

                    if (LoginFoundEvent != null)
                        EventManager.Instance.QueueEvent<DataUser>(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 url = String.Format("https://{0}/main/v2/oauth/token", _networkParameters.RestAPIHostName);

            WWWForm form = new WWWForm();
            form.AddField("Host", url);
            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);

            RequestCall(string.Empty, url, form, null, "post",
            (string responseText) =>
            {
                _authenticationTokens = JsonUtility.FromJson<AuthenticationTokens>(responseText);

                if (AuthenticationSuccessEvent != null)
                    EventManager.Instance.QueueEvent(AuthenticationSuccessEvent, _authenticationTokens);
            },
            (DataError dataError) =>
            {
                if (AuthenticationErrorEvent != null)
                    EventManager.Instance.QueueEvent<string>(AuthenticationErrorEvent, dataError.error_description);
            });
        }

        /// <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 url = String.Format("https://{0}/main/v2/oauth/token", _networkParameters.RestAPIHostName);

            WWWForm form = new WWWForm();
            form.AddField("Host", url);
            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);

            RequestCall(string.Empty, url, form, null, "post",
            (string responseText) =>
            {
                _authenticationTokens = JsonUtility.FromJson<AuthenticationTokens>(responseText);

                if (AuthenticationSuccessEvent != null)
                    EventManager.Instance.QueueEvent(AuthenticationSuccessEvent, _authenticationTokens);
            },
            (DataError dataError) =>
            {
                if (AuthenticationErrorEvent != null)
                    EventManager.Instance.QueueEvent<string>(AuthenticationErrorEvent, dataError.error_description);
            });
        }

        /// <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 accessToken, string login, string password, string email, bool subscribeNewsletter)
        {
            string url = String.Format("https://{0}/main/v1/user", _networkParameters.RestAPIHostName);

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

            RequestCall(accessToken, url, null, parameters, "post",
            (Data data) =>
            {
                DataUser user = new DataUser(data.user_id, data.login_name);

                if (AccountCreatedEvent != null)
                    EventManager.Instance.QueueEvent<DataUser>(AccountCreatedEvent, user);
            },
            (DataError dataError) =>
            {
                if (AccountCreationErrorEvent != null)
                    EventManager.Instance.QueueEvent<string>(AccountCreationErrorEvent, dataError.error_description);
            });
        }

        /// <summary>
        /// Reset the password of a user
        /// </summary>
        /// <param name="userID">DoW user ID</param>
        public void ResetPassword(string accessToken, int userID)
        {
            string url = String.Format("https://{0}/main/v1/user/{1}/password", _networkParameters.RestAPIHostName, userID);

            RequestCall(accessToken, url, null, null, "delete",
            (Data data) =>
            {
                if (LostPasswordEmailSentEvent != null)
                    EventManager.Instance.QueueEvent(LostPasswordEmailSentEvent);
            },
            (DataError dataError) =>
            {
                if (LostPasswordErrorEvent != null)
                    EventManager.Instance.QueueEvent<string>(LostPasswordErrorEvent, dataError.error_description);
            });
        }
        /*
        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(string accessToken)
        {
            string url = String.Format("https://{0}/main/v2/showcase/banner/{1}/{2}/", _networkParameters.RestAPIHostName, "steam", "en");

            RequestCall(accessToken, url, null, null, "get",
            (Data data) =>
            {
                if (ReceivingProductEvent != null)
                    EventManager.Instance.QueueEvent<Product>(ReceivingProductEvent, data.product);
            });
        }

        public void MoreGameRequest(string accessToken, MoreGamesFilters moreGamesFilters)
        {
            string url = String.Format("https://{0}/main/v2/showcase/games/{1}/{2}/", _networkParameters.RestAPIHostName, "steam", "en");

            RequestCall(accessToken, url, null, null, "get",
            (Data data) =>
            {
                GroupProduct groupProduct = new GroupProduct();
                groupProduct.products = data.products;

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

        //public void MoreGameRequestold(string accessToken, 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(string accessToken)
        {
            string url = String.Format("https://{0}/main/v2/showcase/interstitial/{1}/{2}/", _networkParameters.RestAPIHostName, "amazonstore", "fr");

            RequestCall(accessToken, url, null, null, "get",
            (Data data) =>
            {
                GroupProduct groupProduct = new GroupProduct();
                groupProduct.products = data.products;

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

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