using System;
using System.Collections.Generic;
using System.Text;
using Games.Events;
using Module.Log;
using UnityEngine;

public class SdkIosYuCheng : SdkIosBase
{
    private const string _serverListUri = "http://rk.jjbb.yoseleather.com/YcApi/server/cid/2-10004";
    private const string _loginUri = "http://rk.jjbb.yoseleather.com/YcApi/login/cid/2-10004";

    private const string _paymentUri = "http://rk.jjbb.yoseleather.com/YcApi/createOrder/cid/2-10004";

    // 兑换码超链接
    private const string _redemptionUri = "http://rk.jjbb.yoseleather.com/Gift/receiveGiftPackage";
    private const string _noticeUri = "http://rk.jjbb.yoseleather.com/YcApi/notice/cid/2-10004";
    private SdkUser _user;
    
    public override string sdkAccount
    {
        get { return _user == null ? string.Empty : _user.id; }
    }
    
    public override string platformId
    {
        get { return "2-10004"; }
    }
    
    protected override string redemptionUri
    {
        get { return _redemptionUri; }
    }

    protected override string noticeUri
    {
        get { return _noticeUri; }
    }

    public override bool IsLogin()
    {
        return _user != null;
    }

    public override void GetServerList()
    {
        var data = new Dictionary<string, string>();
        data["mem_id"] = _user.id;
        data["user_token"] = _user.token;
        Debug.Log(string.Format("MemId = {0}, Token = {1}", _user.id, _user.token));
        var jsonDownloader = new DownloadJsonFile(_serverListUri, 10f, data)
        {
            onDownloadComplete = OnGetServerListComplete
        };
        jsonDownloader.Start();
    }

    private void OnGetServerListComplete(DownloadJsonFile action)
    {
        var result = ParseServerList(action);
        EventDispatcher.GetInstance().Dispatch(EventId.ServerListCallback, result);
    }

    public override void LoginPhp(int serverId)
    {
        var data = new Dictionary<string, string>();
        data["mem_id"] = _user.id;
        data["user_token"] = _user.token;
        data["server_id"] = serverId.ToString();
        data["recom_server_id"] = defaultServer.ToString();
        Debug.Log(string.Format("Login Php: mem_id = {0}, user_token = {1}, serverId = {2}, reconmServer = {3}",
            _user.id, _user.token, serverId, defaultServer));
        var jsonDownloader = new DownloadJsonFile(_loginUri, 10f, data)
        {
            onDownloadComplete = OnPhpLoginComplete
        };
        jsonDownloader.Start();
    }

    private void OnPhpLoginComplete(DownloadJsonFile action)
    {
        LoginPhpWithToken(action, _user.token);
    }

    public override void Payment(int goodsId)
    {
        var playerData = GameManager.gameManager.PlayerDataPool;
        var data = new Dictionary<string, string>();
        data["serverId"] = LoginData.accountData.serverId.ToString();
        data["userRoleId"] = playerData.MainPlayerBaseAttr.Guid.ToString();
        data["goodsId"] = goodsId.ToString();
        data["mServerId"] = SdkControl.instance.currentServerData.m_id.ToString();
        data["level"] = playerData.MainPlayerBaseAttr.Level.ToString();
        var jsonDownloader = new DownloadJsonFile(_paymentUri, 10f, data)
        {
            onDownloadComplete = OnPaymentPhpComplete
        };
        jsonDownloader.Start();
    }

    public override void SubmitData(RoleDataSubmit submitType)
    {
        base.SubmitData(submitType);
        var roleData = GetRoleInfoDict(submitType);

        var builder = new StringBuilder();
        builder.Append(roleData["Event"]);
        builder.Append(',');
        builder.Append(roleData["ServerId"]);
        builder.Append(',');
        builder.Append(roleData["ServerName"]);
        builder.Append(',');
        builder.Append(roleData["Id"]);
        builder.Append(',');
        builder.Append(roleData["Name"]);
        builder.Append(',');

        builder.Append(roleData["Level"]);
        builder.Append(',');
        builder.Append(roleData["Vip"]);
        builder.Append(',');
        builder.Append(roleData["Balance"]);
        builder.Append(',');
        builder.Append(roleData["CreateTime"]);
        builder.Append(',');
        builder.Append(roleData["OnlineTime"]);

        SubmitRoleNative(builder.ToString());
    }

    private void OnPaymentPhpComplete(DownloadJsonFile action)
    {
        Dictionary<string, string> payData = null;
        if (!string.IsNullOrEmpty(action.error))
            Debug.LogError(action.error);
        else
            try
            {
                var json = action.jsonData;
                var msg = json["msg"].ToString();
                if (msg != "success")
                {
                    Debug.LogError(string.Format("OnPaymentPhpComplete Error: " + msg));
                }
                else
                {
                    payData = new Dictionary<string, string>();
                    var data = json["data"];
                    payData["OrderId"] = data["cp_order_id"].ToString();
                    payData["Price"] = data["product_price"].ToString();
                    // payData["Count"] = data["product_count"].ToString();
                    payData["Id"] = data["product_id"].ToString();
                    payData["Name"] = data["product_name"].ToString();
                    payData["Desc"] = data["product_desc"].ToString();
                    payData["Ext"] = data["ext"].ToString();
                }
            }
            catch (Exception e)
            {
                Debug.LogError(e);
                payData = null;
            }

        if (payData != null)
        {
            var roleData = GetRoleInfoDict(RoleDataSubmit.Other);
            var builder = new StringBuilder();
            builder.Append(payData["OrderId"]);
            builder.Append(',');
            builder.Append(roleData["ServerId"]);
            builder.Append(',');
            builder.Append(roleData["ServerName"]);
            builder.Append(',');
            builder.Append(payData["Id"]);
            builder.Append(',');
            builder.Append(payData["Name"]);
            builder.Append(',');

            builder.Append(payData["Desc"]);
            builder.Append(',');
            builder.Append(payData["Ext"]);
            builder.Append(',');
            builder.Append(payData["Price"]);
            builder.Append(',');
            builder.Append(roleData["RoleId"]);
            builder.Append(',');
            builder.Append(roleData["RoleName"]);
            builder.Append(',');

            builder.Append("灵玉");

            PaymentNative(builder.ToString());
        }
    }

    public override bool LoginComplete(string args)
    {
        var result = IsSuccess(args);
        if (result)
        {
            var argList = args.Split(',');
            if (argList.Length > 2)
            {
                _user = new SdkUser(argList[1].Trim(), argList[2].Trim());
            }
            else
            {
                result = false;
                LogModule.ErrorLog("Login success but with no enough args: " + args);
            }
        }
        else
        {
            LogModule.ErrorLog("Login failed: " + args);
        }

        return result;
    }

    public override bool LogOutComplete(string args)
    {
        bool result;
        if (_user == null)
        {
            LogModule.ErrorLog("Logout before login!");
            result = false;
        }
        else
        {
            result = IsSuccess(args);
            LogModule.ErrorLog("LogOut failed: " + args);
        }

        if (result)
            _user = null;
        return result;
    }

    public override bool PaymentComplete(string data)
    {
        var result = IsSuccess(data);
        return result;
    }

    private class SdkUser
    {
        public readonly string token;
        public readonly string id;

        public SdkUser(string id, string token)
        {
            this.id = id;
            this.token = token;
        }
    }
}