using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using Edu.Cache.User;
using Edu.Cache.WeChat;
using Edu.Common.Plugin;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Senparc.Weixin.Work;
using Senparc.Weixin.Work.AdvancedAPIs;
using Senparc.Weixin.Work.AdvancedAPIs.OAuth2;
using Senparc.Weixin.Work.Containers;

namespace Edu.ThirdCore.QYWinXin
{
    /// <summary>
    /// 企业微信处理
    /// </summary>
    public class QYWeiXinHelper
    {
        #region 全局静态

        private static string WORK_KEY = string.Empty;

        #endregion

        #region 令牌

        public static string GetToken(int groupId,bool newToken=false) 
        {
            var config = WeChatReidsCache.GetWorkChatConfig(groupId);
            if (config != null) {
                var token = AccessTokenContainer.GetTokenAsync(config.WX_CorpId, config.Employee_Secret, newToken);
                return token.Result;
            }
            else 
            {
                return string.Empty;
            }
        }

        #endregion

        /// <summary>
        /// 解析用户信息
        /// </summary>
        /// <param name="groupId"></param>
        /// <param name="code"></param>
        /// <returns></returns>
        public (bool status, GetUserInfoResult result) GetLoginWorkUserInfo(int groupId,string code)
        {
            var token = GetToken(groupId);
            if (!string.IsNullOrEmpty(token))
            {
                var result = Senparc.Weixin.Work.AdvancedAPIs.OAuth2Api.GetUserId(token, code);
                return (true, result);
            }
            else 
            {
                return (false, null);
            }
        }

        /// <summary>
        /// 组装跳转地址
        /// </summary>
        /// <param name="groupId">集团编号</param>
        /// <param name="mark">唯一标识</param>
        /// <returns></returns>
        public string GetUserAuthorizationCodePath(int groupId, string mark)
        {
            var config = WeChatReidsCache.GetWorkChatConfig(groupId);
            var token = GetToken(groupId);
            if (!string.IsNullOrEmpty(token))
            {
                string redirect_uri = $"http://mobileapis.kookaku.com/api/QYWeChat/UserCodeCallBack";
                string state = mark;
                JObject cacheContent = new JObject();
                cacheContent.Add("group_id",groupId);
                UserReidsCache.Set(mark, cacheContent, 60);
                return Senparc.Weixin.Work.AdvancedAPIs.OAuth2Api.GetCode(config.WX_CorpId, redirect_uri, state, "1000004");
            }
            else
            {
                return string.Empty;
            }
        }

        /// <summary>
        /// 获取token
        /// </summary>
        /// <returns></returns>
        public static Senparc.Weixin.Work.Entities.AccessTokenResult GetToken(string corpId, string corpSecret)
        {
            return Senparc.Weixin.Work.CommonAPIs.CommonApi.GetToken(corpId, corpSecret);
        }

        /// <summary>
        /// 获取部门列表
        /// </summary>
        /// <param name="token"></param>
        /// <returns></returns>
        public static object GetDepartmentList(string token)
        {
            return Senparc.Weixin.Work.AdvancedAPIs.MailListApi.GetDepartmentList(token);
        }
    }
}