/*--------------------------------------------------------------------------
* CustomMenu.cs
 *Auth:deepleo
* Date:2013.12.31
* Email:2586662969@qq.com
 * Website:http://www.weixinsdk.net
*--------------------------------------------------------------------------*/

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Http;
using Codeplex.Data;
using System.Xml;

namespace LYFZ.Weixin.SDK
{
    /// <summary>
    /// "自定义菜单”
    /// http://mp.weixin.qq.com/wiki/index.php?title=%E8%87%AA%E5%AE%9A%E4%B9%89%E8%8F%9C%E5%8D%95%E5%88%9B%E5%BB%BA%E6%8E%A5%E5%8F%A3
    /// 注意:自定义菜单事件推送接口见:AcceptMessageAPI
    /// 创建自定义菜单后,由于微信客户端缓存,需要24小时微信客户端才会展现出来,测试时可以尝试取消关注公众账号后再次关注,则可以看到创建后的效果。
    /// 自定义菜单种类如下:
    /// 1、click:点击推事件
    /// 2、view:跳转URL
    /// 3、scancode_push:扫码推事件
    /// 4、scancode_waitmsg:扫码推事件且弹出“消息接收中”提示框
    /// 5、pic_sysphoto:弹出系统拍照发图
    /// 6、pic_photo_or_album:弹出拍照或者相册发图
    /// 7、pic_weixin:弹出微信相册发图器
    /// 8、location_select:弹出地理位置选择器
    /// </summary>
    public class CustomMenuAPI
    {
        public static T parse<T>(string jsonString)
        {
            using (var ms = new System.IO.MemoryStream(System.Text.Encoding.UTF8.GetBytes(jsonString)))
            {
                return (T)new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(T)).ReadObject(ms);
            }
        }
        /// <summary>
        /// 获取要创建的菜单数据字符串
        /// </summary>
        /// <param name="menu_buttons"></param>
        /// <returns></returns>
        public static string GetMenuDataString(List<MenuModel> menu_buttons)
        {
            string menuModelString = "";
            for (int i = 0; i < 3; i++)
            {
                if (i < menu_buttons.Count)
                {
                    MenuModel button = menu_buttons[i];
                    menuModelString += button.ToString() + ",";
                }
                else
                {
                    break;
                }
            }
            string dataString = "{\"button\":[" + menuModelString.Trim(',') + "]}";
            return dataString;
        }
        /// <summary>
        /// 获取要创建的菜单数据XML
        /// </summary>
        /// <param name="menu_buttons"></param>
        /// <returns></returns>
        public static string GetMenuDataXML(List<MenuModel> menu_buttons)
        {
            string menuModelString = "";
            if (menu_buttons.Count > 0)
            {
                for (int i = 0; i < 3; i++)
                {
                    if (i < menu_buttons.Count)
                    {
                        MenuModel button = menu_buttons[i];
                        menuModelString += button.ToXml();
                    }
                    else
                    {
                        break;
                    }
                }
                return "<menu>" + menuModelString + "</menu>";
            }
            return "";
        }
        /// <summary>
        /// 测试用
        /// </summary>
        /// <returns></returns>
        public static string GetTempXmlString()
        {
            return "<menu>"                                                          
                   +" <button>                                                       "
	              +"      <name>工具箱</name>                                        "
	              +"      <sub_button>                                               "
		          +"          <type>view</type>                                      "
		          +"          <name>百度搜索</name>                                  "
		          +"          <url>http://www.baidu.com/</url>                       "
	              +"      </sub_button>                                              "
	              +"      <sub_button>                                               "
		          +"          <type>view</type>                                      "
		          +"          <name>QQ视频</name>                                    "
		          +"          <url>http://v.qq.com/</url>                            "
	              +"      </sub_button>                                              "
	              +"      <sub_button>                                               "
		          +"          <type>view</type>                                      "
		          +"          <name>手机APP</name>                                   "
		          +"          <url>http://yifox.oicp.net/WebMobile/Main.aspx/</url>  "
	              +"      </sub_button>                                              "
	              +"      <sub_button>                                               "
		          +"          <type>scancode_waitmsg</type>                          "
		          +"          <name>扫码带提示</name>                                "
		          +"          <key>rselfmenu_0_0</key>                               "
	              +"      </sub_button>                                              "
	              +"      <sub_button>                                               "
		          +"          <type>scancode_push</type>                             "
		          +"          <name>扫码推事件</name>                                "
		          +"          <key>rselfmenu_0_1</key>                                "
	              +"      </sub_button>                                              "
                  +"  </button>                                                      "
                  +"  <button>                                                       "
	              +"      <name>业务查询</name>                                      "
	              +"      <sub_button>                                               "
		          +"          <type>click</type>                                     "
		          +"          <name>订单查询</name>                                  "
		          +"          <key>Order_Query</key>                                 "
	              +"      </sub_button>                                              "
                  +"                                                                 "
	              +"      <sub_button>                                               "
		          +"          <type>click</type>                                     "
		          +"          <name>流程查询</name>                                  "
		          +"          <key>Process_Query</key>                               "
	              +"      </sub_button>                                              "
	              +"      <sub_button>                                               "
		          +"          <type>click</type>                                     "
		          +"          <name>会员查询</name>                                  "
		          +"          <key>Member_Query</key>                                "
	              +"      </sub_button>                                              "
                  +"  </button>                                                      "
                  +"  <button>                                                       "
	              +"      <type>click</type>                                         "
	              +"      <name>帮助</name>                                          "
	              +"      <key>BTN_HELP</key>                                        "
                  +"  </button>                                                      "
                  +" </menu>";                                                      
        }

        /// <summary>
        /// 获取菜单对象集合
        /// </summary>
        /// <param name="xml"></param>
        /// <returns></returns>
        public static List<MenuModel> GetMenuModelList(System.Xml.XmlDocument xml)
        {
            //xml = new XmlDocument();
           // xml.LoadXml(GetTempXmlString());测试用
            List<MenuModel> menu_buttons = new List<MenuModel>();
            XmlNode xmlNode = xml.SelectSingleNode("menu");
            XmlNodeList nodeList = xmlNode.SelectNodes("button");
            foreach (XmlNode node in nodeList)
            {
                MenuModel menu_button = getMenuModel(node);
                menu_buttons.Add(menu_button);
            }
            return menu_buttons;
        }

        static MenuModel getMenuModel(XmlNode node)
        {
            MenuModel menu_button = new MenuModel();
            try
            {
                if (node.SelectSingleNode("name") != null)
                {
                    menu_button.Name = node.SelectSingleNode("name").InnerText;
                }
                if (node.SelectSingleNode("type") != null)
                {
                    menu_button.Type = (WXMenuType)Enum.Parse(typeof(WXMenuType), node.SelectSingleNode("type").InnerText);
                }
                if (node.SelectSingleNode("key") != null)
                {
                    menu_button.Key = node.SelectSingleNode("key").InnerText;
                }
                if (node.SelectSingleNode("url") != null)
                {
                    menu_button.Url = System.Web.HttpUtility.UrlDecode(node.SelectSingleNode("url").InnerText.Replace("&amp;","&"));
                }
                if (node.SelectSingleNode("media_id") != null)
                {
                    menu_button.Media_id = node.SelectSingleNode("media_id").InnerText;
                }
                XmlNodeList sub_nodeList = node.SelectNodes("sub_button");
                if (sub_nodeList != null && sub_nodeList.Count > 0)
                {
                    List<MenuModel> subMenuModelList = new List<MenuModel>();
                    foreach (XmlNode subNode in sub_nodeList)
                    {
                        subMenuModelList.Add(getMenuModel(subNode));
                    }
                    menu_button.Sub_buttons = subMenuModelList;
                }

            }
            catch { }
            return menu_button;
        }
        //回调验证证书问题
        public static bool CheckValidationResult(object sender, System.Security.Cryptography.X509Certificates.X509Certificate certificate, System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors errors)
        {
            // 总是接受    
            return true;
        }
        public static void SetServicePointManagerSecurityProtocol(string url)
        {
            System.Net.ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(CheckValidationResult);
            if (url.ToLower().StartsWith("https"))
            {
                System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls;
            }
            else
            {
                System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Ssl3;
            }
        }
        /// <summary>
        /// 自定义菜单创建接口 直接返回字符串信息
        /// </summary>
        public static string CreateMenu(string access_token, string content)
        {
            SetServicePointManagerSecurityProtocol("https:");
            var client = new HttpClient();
            var result = client.PostAsync(string.Format("https://api.weixin.qq.com/cgi-bin/menu/create?access_token={0}", access_token), new StringContent(content)).Result;
            return result.Content.ReadAsStringAsync().Result;
        }
        /// <summary>
        /// 自定义菜单创建接口
        /// </summary>
        /// <param name="token"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        public static bool Create(string access_token, string content)
        {
            SetServicePointManagerSecurityProtocol("https:");
            var client = new HttpClient();
            var result = client.PostAsync(string.Format("https://api.weixin.qq.com/cgi-bin/menu/create?access_token={0}", access_token), new StringContent(content)).Result;
            return DynamicJson.Parse(result.Content.ReadAsStringAsync().Result).errcode == 0;
        }
        /// <summary>
        /// 自定义菜单查询接口 直接返回字符串信息
        /// </summary>
        public static string GetMenu(string access_token)
        {
            SetServicePointManagerSecurityProtocol("https:");
            var client = new HttpClient();
            var result = client.GetAsync(string.Format("https://api.weixin.qq.com/cgi-bin/menu/get?access_token={0}", access_token)).Result;
           // if (!result.IsSuccessStatusCode) return "自定义菜单查询接口请求失败...";
            return result.Content.ReadAsStringAsync().Result;
        }
        /// <summary>
        /// 自定义菜单查询接口
        /// </summary>
        /// <param name="token"></param>
        /// <returns></returns>
        public static dynamic Query(string access_token)
        {
            SetServicePointManagerSecurityProtocol("https:");
            var client = new HttpClient();
            var result = client.GetAsync(string.Format("https://api.weixin.qq.com/cgi-bin/menu/get?access_token={0}", access_token)).Result;
            if (!result.IsSuccessStatusCode) return null;
            return DynamicJson.Parse(result.Content.ReadAsStringAsync().Result);
        }

        /// <summary>
        /// 自定义菜单删除接口
        /// </summary>
        /// <param name="token"></param>
        /// <returns></returns>
        public static bool Delete(string access_token)
        {
            SetServicePointManagerSecurityProtocol("https:");
            var client = new HttpClient();
            var result = client.GetAsync(string.Format("https://api.weixin.qq.com/cgi-bin/menu/delete?access_token={0}", access_token)).Result;
            if (!result.IsSuccessStatusCode) return false;
            return DynamicJson.Parse(result.Content.ReadAsStringAsync().Result).errmsg == "ok";
        }
        /// <summary>
        /// 自定义菜单删除接口
        /// </summary>
        /// <param name="token"></param>
        /// <returns></returns>
        public static string DeleteMenu(string access_token)
        {
            SetServicePointManagerSecurityProtocol("https:");
            var client = new HttpClient();
            var result = client.GetAsync(string.Format("https://api.weixin.qq.com/cgi-bin/menu/delete?access_token={0}", access_token)).Result;
            if (!result.IsSuccessStatusCode) return "自定义菜单删除求失败...";
            return result.Content.ReadAsStringAsync().Result;
        }
    }
}