using Infrastructure;
using System.Collections.Generic;
using System.Text.Json;
using ZR.Common.Model;

namespace ZR.Common
{
    public class WxNoticeHelper
    {
        //CorpID  企业ID 
        //AGENTID 应用的ID
        //Secret 应用的ID对应的密钥
        private static readonly string AGENTID = AppSettings.App(new string[] { "WxCorp", "AgentID" });
        private static readonly string CORPID = AppSettings.App(new string[] { "WxCorp", "CorpID" });
        private static readonly string CORPSECRET = AppSettings.App(new string[] { "WxCorp", "CorpSecret" });
        private static readonly string SEND_USER = AppSettings.App(new string[] { "WxCorp", "SendUser" });
        private static readonly string SendUrl = "https://qyapi.weixin.qq.com/cgi-bin/message/send";
        private static readonly string GetTokenUrl = "https://qyapi.weixin.qq.com/cgi-bin/gettoken";

        /// <summary>
        /// 消息类型
        /// </summary>
        public enum MsgType { markdown, text, textcard, interactive_taskcard }

        /// <summary>
        /// 发送消息公共模板方法
        /// </summary>
        /// <param name="toUser">微信微信好友id,默认@all发给所有关注该应用的用户</param>
        /// <param name="title">标题</param>
        /// <param name="content">内容</param>
        /// <param name="msgType">消息类型</param>
        /// <returns></returns>
        public static (int, string) SendMsg(string title, string content, string toUser = "", MsgType msgType = MsgType.text)
        {
            if (string.IsNullOrEmpty(toUser))
            {
                toUser = SEND_USER;
            }
            if (string.IsNullOrEmpty(title))
            {
                return (0, "title不能为空");
            }
            if (string.IsNullOrEmpty(CORPID))
            {
                System.Console.WriteLine("如需微信接收异常消息,请完成企业微信配置");
                return (0, "请完成企业微信通知配置");
            }
            WxTokenResult tokenResult = GetAccessToken();

            if (tokenResult == null || tokenResult.errcode != 0)
            {
                return (0, tokenResult?.errmsg);
            }

            Dictionary<string, object> dic = null;
            switch (msgType)
            {
                case MsgType.markdown:
                    dic = GetMarkdown(title, content, toUser);
                    break;
                case MsgType.text:
                    dic = GetText(title, content, toUser);
                    break;
                case MsgType.textcard:
                    break;
                case MsgType.interactive_taskcard:
                    break;
                default:
                    dic = GetText(title, content, toUser);
                    break;
            }
            string postData = JsonSerializer.Serialize(dic);
            string msgUrl = $"{SendUrl}?access_token={tokenResult.access_token}";

            //返回结果
            //{"errcode":0,"errmsg":"ok","invaliduser":""}
            string msgResult = HttpHelper.HttpPost(msgUrl, postData, "contentType/json");
            WxTokenResult getTokenResult = JsonSerializer.Deserialize<WxTokenResult>(msgResult);
            System.Console.WriteLine(msgResult);
            return (getTokenResult?.errcode == 0 ? 100 : 0, getTokenResult?.errmsg);
        }
        public static (int, string) SendMsg(string title, string content, string toUser)
        {
            return SendMsg(title, content, toUser, MsgType.markdown);
        }

        /// <summary>
        /// 获取访问token
        /// </summary>
        /// <returns>           
        /// {"errcode":0,"errmsg":"ok","access_token":"iCbcfE1OjfRhV0_io-CzqTNC0lnrudeW3oF5rhJKfmINaxLClLa1FoqAY_wEXtodYh_DTnrtAwZfzeb-NRXvwiOoqUTHx3i6QKLYcfBtF8y-xd5mvaeaf3e9mvTAPhmX0lkm1cLTwRLmoa1IwzgQ-QZEZcuIcntWdEMGseVYok3BwCGpC87bt6nNdgnekZdFVRp1uuaxoctDGlXpoQlQsA","expires_in":7200}
        /// </returns>
        private static WxTokenResult GetAccessToken()
        {
            string getTokenUrl = $"{GetTokenUrl}?corpid={CORPID}&corpsecret={CORPSECRET}";
            string getTokenResult = HttpHelper.HttpGet(getTokenUrl);
            System.Console.WriteLine(getTokenResult);
            WxTokenResult tokenResult = JsonSerializer.Deserialize<WxTokenResult>(getTokenResult);
            return tokenResult;
        }

        /// <summary>
        /// 发送text
        /// </summary>
        /// <param name="title"></param>
        /// <param name="content"></param>
        /// <param name="toUser"></param>
        /// <returns></returns>
        private static Dictionary<string, object> GetText(string title, string content, string toUser = "")
        {
            Dictionary<string, object> dic = new()
            {
                    { "msgtype", "text" },
                    { "touser", toUser },
                    { "agentid", AGENTID },
                    { "text", new Dictionary<string, string>
                    {
                        { "content",$"{title}\n\n{content}"
                    }
                }}
                };
            return dic;
        }

        /// <summary>
        /// 发送markdown
        /// </summary>
        /// <param name="title">要发送的标题</param>
        /// <param name="content">发送的内容</param>
        /// <param name="toUser">指定接收消息的成员,成员ID列表(多个接收者用‘|’分隔,最多支持1000个)。 特殊情况:指定为”@all”,则向该企业应用的全部成员发送</param>
        /// <returns></returns>
        private static Dictionary<string, object> GetMarkdown(string title, string content, string toUser = "")
        {
            Dictionary<string, object> dic = new()
            {
                { "touser", toUser },
                { "msgtype", "markdown" },
                { "agentid", AGENTID },
                { "enable_duplicate_check", 1 },
                {
                    "markdown",
                    new Dictionary<string, string>
                {
                    { "content", $"**{title}**\n\n{content}" }
                }
                }
            };
            return dic;
        }
    }
}