using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using Edu.Common.Plugin;
using Edu.ThirdCore.QYWinXin.Model;
using Edu.Common;
using Senparc.Weixin.MP.CommonAPIs;
using Senparc.Weixin.MP.Entities;
using Senparc.Weixin.MP.AdvancedAPIs.Media;
using Senparc.Weixin.MP.AdvancedAPIs;
using Senparc.Weixin.Entities;
using Senparc.Weixin.MP.AdvancedAPIs.GroupMessage;
using Senparc.Weixin.MP;
using Senparc.Weixin.MP.AdvancedAPIs.UserTag;

namespace Edu.ThirdCore.GZHWeChat
{
    /// <summary>
    /// 公众号处理
    /// </summary>
    public class GZHWeChatHelper
    {

        /// <summary>
        /// 获取token
        /// </summary>
        /// <returns></returns>
        public static AccessTokenResult GetGZHToken(string appid, string secret)
        {
            return CommonApi.GetToken(appid, secret);
        }

        /// <summary>
        /// 新增其他类型永久素材(图片(image)、语音(voice)和缩略图(thumb))
        /// </summary>
        /// <param name="accessTokenOrAppId">AccessToken或AppId(推荐使用AppId,需要先注册)</param>
        /// <param name="file">上传文件的绝对路径</param>
        /// <returns></returns>
        public static UploadForeverMediaResult UploadForeverMedia(string accessTokenOrAppId, string file)
        {
            return MediaApi.UploadForeverMedia(accessTokenOrAppId, file);
        }

        /// <summary>
        /// 新增永久视频素材
        /// </summary>
        /// <param name="accessTokenOrAppId">AccessToken或AppId(推荐使用AppId,需要先注册)</param>
        /// <param name="type">媒体文件类型,分别有图片(image)、语音(voice)、视频(video)和缩略图(thumb)</param>
        /// <param name="title">素材的标题</param>
        /// <param name="introduction">素材的描述</param>
        /// <param name="file">上传文件的绝对路径</param>
        /// <returns></returns>
        public static UploadForeverMediaResult UploadForeverVideo(string accessTokenOrAppId, string file, string title, string introduction, string type)
        {
            return MediaApi.UploadForeverVideo(accessTokenOrAppId, file, title, introduction, type);
        }

        /// <summary>
        /// 获取永久视频素材
        /// </summary>
        /// <param name="accessTokenOrAppId"></param>
        /// <param name="mediaId">要获取的素材的media_id</param>
        /// <returns></returns>
        public static GetForeverMediaVideoResultJson GetForeverVideo(string accessTokenOrAppId, string mediaId)
        {
            return MediaApi.GetForeverVideo(accessTokenOrAppId, mediaId);
        }

        /// <summary>
        /// 删除永久素材
        /// </summary>
        /// <param name="accessTokenOrAppId">AccessToken或AppId(推荐使用AppId,需要先注册)</param>
        /// <param name="mediaId"></param>
        /// <returns></returns>
        public static WxJsonResult DeleteForeverMedia(string accessTokenOrAppId, string mediaId)
        {
            return MediaApi.DeleteForeverMedia(accessTokenOrAppId, mediaId);
        }

        /// <summary>
        /// 上传图文消息内的图片获取URL
        /// </summary>
        /// <param name="accessTokenOrAppId">AccessToken或AppId(推荐使用AppId,需要先注册)</param>
        /// <param name="file">上传文件的绝对路径</param>
        /// <returns></returns>
        public static UploadImgResult UploadImg(string accessTokenOrAppId, string file)
        {
            return MediaApi.UploadImg(accessTokenOrAppId, file);
        }

        /// <summary>
        /// 新增永久图文素材
        /// </summary>
        /// <param name="accessTokenOrAppId">Token</param>
        /// <param name="news">图文消息组</param>        
        /// <returns></returns>
        public static UploadForeverMediaResult UploadNews(string accessTokenOrAppId, params NewsModel[] news)
        {
            return MediaApi.UploadNews(accessTokenOrAppId, Senparc.Weixin.Config.TIME_OUT, news);
        }

        /// <summary>
        /// 修改永久图文素材
        /// </summary>
        /// <param name="accessTokenOrAppId">AccessToken或AppId(推荐使用AppId,需要先注册)</param>
        /// <param name="mediaId">要修改的图文消息的id</param>
        /// <param name="index">要更新的文章在图文消息中的位置(多图文消息时,此字段才有意义),第一篇为0</param>
        /// <param name="news">图文素材</param>
        /// <returns></returns>
        public static WxJsonResult UpdateForeverNews(string accessTokenOrAppId, string mediaId, int? index, NewsModel news)
        {
            return MediaApi.UpdateForeverNews(accessTokenOrAppId, mediaId, index, news);
        }

        /// <summary>
        /// 获取视频群发用的MediaId
        /// </summary>
        /// <param name="accessTokenOrAppId">AccessToken或AppId(推荐使用AppId,需要先注册)</param>
        /// <param name="mediaId"></param>
        /// <param name="title"></param>
        /// <param name="description"></param>
        /// <param name="timeOut"></param>
        /// <returns></returns>
        public static VideoMediaIdResult GetVideoMediaIdResult(string accessTokenOrAppId, string mediaId, string title, string description)
        {
            return GroupMessageApi.GetVideoMediaIdResult(accessTokenOrAppId, mediaId, title, description);
        }


        /// <summary>
        /// 根据[标签]进行群发【订阅号与服务号认证后均可用】
        /// 
        /// 请注意:
        /// 1、该接口暂时仅提供给已微信认证的服务号
        /// 2、虽然开发者使用高级群发接口的每日调用限制为100次,但是用户每月只能接收4条,请小心测试
        /// 3、无论在公众平台网站上,还是使用接口群发,用户每月只能接收4条群发消息,多于4条的群发将对该用户发送失败。
        /// 4、群发视频时需要先调用GetVideoMediaIdResult接口获取专用的MediaId然后进行群发
        /// 
        /// </summary>
        /// <param name="accessTokenOrAppId">AccessToken或AppId(推荐使用AppId,需要先注册)</param>
        /// <param name="tagId">群发到的标签的tag_id,若is_to_all值为true,可不填写tag_id</param>
        /// <param name="value">群发媒体文件时传入mediaId,群发文本消息时传入content,群发卡券时传入cardId</param>
        /// <param name="type"></param>
        /// <param name="isToAll">用于设定是否向全部用户发送,值为true或false,选择true该消息群发给所有用户,选择false可根据group_id发送给指定群组的用户</param>
        /// <param name="sendIgnoreReprint">待群发的文章被判定为转载时,是否继续群发</param>
        /// <param name="clientmsgid">开发者侧群发msgid,长度限制64字节,如不填,则后台默认以群发范围和群发内容的摘要值做为clientmsgid</param>
        /// <returns></returns>
        public static SendResult SendGroupMessageByTagId(string accessTokenOrAppId, string tagId, string value, GroupMessageType type, bool isToAll = false, bool sendIgnoreReprint = false, string clientmsgid = null)
        {
            return GroupMessageApi.SendGroupMessageByTagId(accessTokenOrAppId, tagId, value, type, isToAll, sendIgnoreReprint, clientmsgid);
        }

        /// <summary>
        /// 预览接口【订阅号与服务号认证后均可用】
        /// 注意:openId与wxName两者任选其一,同时传入以wxName优先
        /// </summary>
        /// <param name="accessTokenOrAppId">AccessToken或AppId(推荐使用AppId,需要先注册)</param>
        /// <param name="value">群发媒体消息时为media_id,群发文本信息为content</param>
        /// <param name="type"></param>
        /// <param name="openId">接收消息用户对应该公众号的openid</param>
        /// <param name="wxName">接收消息用户的微信号</param>
        /// <returns></returns>
        public static SendResult SendGroupMessagePreview(string accessTokenOrAppId, GroupMessageType type, string value, string openId, string wxName = null)
        {
            return GroupMessageApi.SendGroupMessagePreview(accessTokenOrAppId, type, value, openId, wxName);
        }

        /// <summary>
        /// 群发图片 (预览)
        /// </summary>
        /// <param name="accessTokenOrAppId"></param>
        /// <param name="wxName"></param>
        /// <param name="media_ids"></param>
        /// <param name="recommend"></param>
        /// <returns></returns>
        public static SendResult SendImageMessagePreview(string accessTokenOrAppId, string wxName, string media_id, string recommend)
        {
            string url = "https://api.weixin.qq.com/cgi-bin/message/mass/preview?access_token=" + accessTokenOrAppId;

            var SendDate = new
            {
                towxname = wxName,
                image = new {
                    media_id
                },
                msgtype = "image"
            };

            var Rmsg = HttpHelper.HttpPost(url, JsonHelper.Serialize(SendDate), "");
            if (!string.IsNullOrEmpty(Rmsg))
            {
                var rmodel = JsonHelper.DeserializeObject<SendResult>(Rmsg);
                return rmodel;
            }
            return null;
        }

        /// <summary>
        /// 群发图片正式
        /// </summary>
        /// <param name="accessTokenOrAppId"></param>
        /// <param name="wxName"></param>
        /// <param name="media_ids"></param>
        /// <param name="recommend"></param>
        /// <returns></returns>
        public static SendResult SendImageMessageByTagId(string accessTokenOrAppId, string tagId, List<string> media_ids, string recommend, bool isToAll = false)
        {
            string url = "https://api.weixin.qq.com/cgi-bin/message/mass/sendall?access_token=" + accessTokenOrAppId;

            var SendDate = new
            {
                filter = new {
                    is_to_all = isToAll,
                    tag_id = tagId
                },
                images = new
                {
                    media_ids,
                    recommend,
                    need_open_comment = 1,
                    only_fans_can_comment = 0
                },
                msgtype = "image"
            };

            var Rmsg = HttpHelper.HttpPost(url, JsonHelper.Serialize(SendDate), "");
            if (!string.IsNullOrEmpty(Rmsg))
            {
                var rmodel = JsonHelper.DeserializeObject<SendResult>(Rmsg);
                return rmodel;
            }
            return null;
        }


        /// <summary>
        /// 上传本地文件至企业微信
        /// </summary>
        /// <param name="accessTokenOrAppKey"></param>
        /// <param name="filepath"></param>
        /// <param name="type"></param>
        /// <returns></returns>
        public static string UploadMultimedia(string accessTokenOrAppKey, string filepath, UploadMediaFileType type)
        {
            string result = "";
            string wxurl = "https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=" + accessTokenOrAppKey + "&type=" + type.ToString();
            WebClient myWebClient = new WebClient
            {
                Credentials = CredentialCache.DefaultCredentials,
            };
            try
            {
                byte[] responseArray = myWebClient.UploadFile(wxurl, "POST", filepath);
                result = Encoding.Default.GetString(responseArray, 0, responseArray.Length);
                return result;
            }
            catch (Exception ex)
            {
                result = "Error:" + ex.Message;
            }
            finally
            {
                myWebClient.Dispose();
            }
            return result;
        }


        /// <summary>
        /// 获取公众号已创建的标签
        /// </summary>
        /// <param name="accessTokenOrAppId">AccessToken或AppId(推荐使用AppId,需要先注册)</param>
        /// <returns></returns>
        public static TagJson GetUserTagList(string accessTokenOrAppId)
        {
            return UserTagApi.Get(accessTokenOrAppId);
        }
    }
}