using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace LYFZ.WXLibrary
{
    /// <summary>
    /// 公众号授权处理
    /// </summary>
    public class AuthorizedAPPIDHandle
    {
        public AuthorizedAPPIDHandle()
        {

        }
        public AuthorizedAPPIDHandle(string authorization_info_json, string jmgdomain, string companyName, int authorizeStatus, DateTime refreshTokenTime)
        {
            this.SetAuthorizedInfo(authorization_info_json, jmgdomain, companyName, authorizeStatus, refreshTokenTime);
        }
        public void SetAuthorizedInfo(string authorization_info_json, string jmgdomain, string companyName, int authorizeStatus, DateTime refreshTokenTime)
        {
            this._JMGDomainName = jmgdomain;
            this._CompanyName = companyName;
            this._authorization_info = authorization_info_json;
            this._AuthorizeStatus = authorizeStatus;
            var authorizationObj = LYFZ.Weixin.SDK.BasicAPI.JsonToDynamic(authorization_info_json);
            this._authorizer_appid = authorizationObj.authorization_info.authorizer_appid;
            this._authorizer_access_token = authorizationObj.authorization_info.authorizer_access_token;
            this._expires_in = Convert.ToInt32(authorizationObj.authorization_info.expires_in);
            this._authorizer_refresh_token = authorizationObj.authorization_info.authorizer_refresh_token;
            this._RefreshTokenTime = refreshTokenTime;
            //var func_infos = authorizationObj.authorization_info.func_info;
           // string funcscope_categoryID1 = func_infos[0].funcscope_category.id.ToString();
           // string funcscope_categoryID2 = func_infos[1].funcscope_category.id.ToString();
           // string funcscope_categoryID3 = func_infos[2].funcscope_category.id.ToString();
        }
        /// <summary>
        /// 刷新授权公众号令牌时的事件委托
        /// </summary>
        /// <param name="e"></param>
        public delegate void EventEventAuthorizerRefreshTokenHandler(EventAuthorizerRefreshToken e);

        string _JMGDomainName = "";
        /// <summary>
        /// 授权公众号绑定的加密锁域名
        /// </summary>
        public string JMGDomainName
        {
            get { return _JMGDomainName; }
            set { _JMGDomainName = value; }
        }
        string _CompanyName = "";
        /// <summary>
        /// 授权公众号绑定的企业名称
        /// </summary>
        public string CompanyName
        {
            get { return _CompanyName; }
            set { _CompanyName = value; }
        }
        string _authorizer_appid = "";
        /// <summary>
        /// 授权公众号AppID
        /// </summary>
        public string Authorizer_appid
        {
            get { return _authorizer_appid; }
            set { _authorizer_appid = value; }
        }
        string _authorization_info = "";
        /// <summary>
        ///  授权信息(json)
        /// </summary>
        public string Authorization_info
        {
            get { return _authorization_info; }
            set { _authorization_info = value; }
        }
        int _AuthorizeStatus = 0;
        /// <summary>
        /// 授权状态
        /// </summary>
        public int AuthorizeStatus
        {
            get { return _AuthorizeStatus; }
            set { _AuthorizeStatus = value; }
        }
        /// <summary>
        /// 刷新授权公众号的令牌时的事件
        /// </summary>
        public event EventEventAuthorizerRefreshTokenHandler EventEvent_AuthorizerRefreshToken;
        string _authorizer_access_token = "";
        /// <summary>
        /// 授权令牌
        /// </summary>
        public string Authorizer_access_token
        {
            get {
                //如果为空,或者过期,需要重新获取
                if (string.IsNullOrEmpty(_authorizer_access_token) || HasExpired())
                {
                    //获取
                    LYFZ.WXLibrary.CommonHandleClass.WriteLog("开始请求获取新的有效Authorizer_access_token令牌", "-2");
                    _authorizer_access_token = GetAuthorizer_AccessToken(OpenPlatformConfig.OpenAppID, OpenPlatformConfig.Component_Access_Token, Authorizer_appid, Authorizer_refresh_token);

                }

                return _authorizer_access_token; }
            set { _authorizer_access_token = value; }
        }
        int _expires_in = 7200;
        /// <summary>
        /// 令牌有效时长
        /// </summary>
        public int Expires_in
        {
            get { return _expires_in; }
            set { _expires_in = value; }
        }

        DateTime _RefreshTokenTime = DateTime.MinValue;
        /// <summary>
        /// 获取(刷新)令牌时的时间
        /// </summary>
        public DateTime RefreshTokenTime
        {
            get { return _RefreshTokenTime; }
            set { _RefreshTokenTime = value; }
        }

        string _authorizer_refresh_token = "";
        /// <summary>
        /// 刷新Authorizer_access_token 过期令牌时要用的刷新令牌
        /// </summary>
        public string Authorizer_refresh_token
        {
            get { return _authorizer_refresh_token; }
            set { _authorizer_refresh_token = value; }
        }

        /// <summary>
        /// 清除Authorizer_access_token
        /// </summary>
        public void ClearAccessToken()
        {
            _authorizer_access_token = "";
        }
        /// <summary>
        /// 获取授权公众号的令牌
        /// </summary>
        /// <param name="appId"></param>
        /// <param name="appSecret"></param>
        /// <returns></returns>
        private string GetAuthorizer_AccessToken(string appId, string component_access_token, string authorizer_appid, string authorizer_refresh_token)
        {

            try
            {
                Dictionary<string, string> dic = new Dictionary<string, string>
                     {
                         {"component_appid",appId},
                         {"authorizer_appid",authorizer_appid},
                         {"authorizer_refresh_token",authorizer_refresh_token}
                      };
                string json = (new System.Web.Script.Serialization.JavaScriptSerializer()).Serialize(dic);

                //获取access_token
                string retmsg = "";
                var retObj = LYFZ.Weixin.SDK.BasicAPI.GetAuthorizer_Refresh_Token(component_access_token, json, out retmsg);
                LYFZ.WXLibrary.CommonHandleClass.WriteLog("请求获取新的授权公众号的令牌返回信息:" + retmsg, "-2");
                if (retObj != null)
                {
                    string retAuthorizer_AccessToken = retObj.authorizer_access_token.Trim();
                    if (retAuthorizer_AccessToken.Trim().Length > 0)
                    {
                        _RefreshTokenTime = DateTime.Now;
                        Expires_in = Convert.ToInt32(retObj.expires_in);
                        _authorizer_refresh_token = retObj.authorizer_refresh_token.Trim();
                        if (EventEvent_AuthorizerRefreshToken != null)
                        {
                            EventEvent_AuthorizerRefreshToken(new EventAuthorizerRefreshToken(appId, retAuthorizer_AccessToken, Expires_in, _authorizer_refresh_token, _RefreshTokenTime));
                        }
                        return retAuthorizer_AccessToken;
                    }
                    else
                    {
                        _RefreshTokenTime = DateTime.MinValue;
                    }
                }
                else
                {
                    _RefreshTokenTime = DateTime.MinValue;
                    LYFZ.WXLibrary.CommonHandleClass.WriteLog("获取授权Appid:" + authorizer_appid + "的Access_Token令牌时出错:" + retmsg, "-2");
                }
            }
            catch (Exception ex)
            {
                _RefreshTokenTime = DateTime.MinValue;
                LYFZ.WXLibrary.CommonHandleClass.WriteLog("获取授权Appid:" + authorizer_appid + "的Access_Token令牌时出错(Exception):" + ex.Message, "-2");
            }


            return "";

        }
        /// <summary>
        /// 判断Access_token是否过期
        /// </summary>
        /// <returns>bool</returns>
        private  bool HasExpired()
        {
            if (_RefreshTokenTime != null)
            {
                //过期时间,允许有一定的误差,五分钟。获取时间消耗
                if (DateTime.Now > _RefreshTokenTime.AddSeconds(Expires_in).AddSeconds(-300))
                {
                    return true;
                }
            }
            return false;
        }


        AccountBasicInfo _Authorizer_AccountBasicInfo = new AccountBasicInfo();
        /// <summary>
        /// 当前授权公众号的帐号基本信息
        /// </summary>
        public AccountBasicInfo Authorizer_AccountBasicInfo
        {
            get { return _Authorizer_AccountBasicInfo; }
            set { _Authorizer_AccountBasicInfo = value; }
        }
        int _AccountBasicInfo_expires_in = 7200;
        /// <summary>
        /// 帐号基本信息有效时长
        /// </summary>
        public int AccountBasicInfo_expires_in
        {
            get { return _AccountBasicInfo_expires_in; }
            set { _AccountBasicInfo_expires_in = value; }
        }

        DateTime _RefreshAccountBasicInfoTime = DateTime.Now.AddDays(-2);
        /// <summary>
        /// 获取(刷新)帐号基本信息时的时间
        /// </summary>
        public DateTime RefreshAccountBasicInfoTime
        {
            get { return _RefreshAccountBasicInfoTime; }
            set { _RefreshAccountBasicInfoTime = value; }
        }
    }
    public class EventAuthorizerRefreshToken : EventArgs
    {
        public EventAuthorizerRefreshToken(string appid, string authorizer_access_token, int expires_in, string authorizer_refresh_token,DateTime refreshTokenTime)
        {
            this._appid = appid;
            this._authorizer_access_token = authorizer_access_token;
            this._authorizer_refresh_token = authorizer_refresh_token;
            this._expires_in = expires_in;
            this._RefreshTokenTime = refreshTokenTime;
        }
        string _appid = "";

        public string Appid
        {
            get { return _appid; }
            set { _appid = value; }
        }
        string _authorizer_access_token = "";

        public string Authorizer_access_token
        {
            get { return _authorizer_access_token; }
            set { _authorizer_access_token = value; }
        }
        int _expires_in = 0;

        public int Expires_in
        {
            get { return _expires_in; }
            set { _expires_in = value; }
        }
        string _authorizer_refresh_token = "";

        public string Authorizer_refresh_token
        {
            get { return _authorizer_refresh_token; }
            set { _authorizer_refresh_token = value; }
        }
        bool isRefreshSuccess = false;
        /// <summary>
        /// 是否刷新成功
        /// </summary>
        public bool IsRefreshSuccess
        {
            get { return isRefreshSuccess; }
            set { isRefreshSuccess = value; }
        }
        DateTime _RefreshTokenTime = DateTime.MinValue;
        /// <summary>
        /// 
        /// </summary>
        public DateTime RefreshTokenTime
        {
            get { return _RefreshTokenTime; }
            set { _RefreshTokenTime = value; }
        }
    }
    /// <summary>
    /// 帐号基本信息
    /// </summary>
    public class AccountBasicInfo
    {
        public AccountBasicInfo(string jsonData = "")
        {

        }


        string _nick_name = "";
        /// <summary>
        /// 授权方昵称
        /// </summary>
        public string Nick_name
        {
            get { return _nick_name; }
            set { _nick_name = value; }
        }
        string _head_img = "";
        /// <summary>
        /// 授权方头像
        /// </summary>
        public string Head_img
        {
            get { return _head_img; }
            set { _head_img = value; }
        }
        int _service_type_info = 0;
        /// <summary>
        /// 授权方公众号类型,0代表订阅号,1代表由历史老帐号升级后的订阅号,2代表服务号
        /// </summary>
        public int Service_type_info
        {
            get { return _service_type_info; }
            set { _service_type_info = value; }
        }
        int _verify_type_inf = -1;
        /// <summary>
        /// 授权方认证类型,
        /// -1代表未认证,
        /// 0代表微信认证,
        /// 1代表新浪微博认证,
        /// 2代表腾讯微博认证,
        /// 3代表已资质认证通过但还未通过名称认证,
        /// 4代表已资质认证通过、还未通过名称认证,但通过了新浪微博认证,
        /// 5代表已资质认证通过、还未通过名称认证,但通过了腾讯微博认证
        /// </summary>
        public int Verify_type_inf
        {
            get { return _verify_type_inf; }
            set { _verify_type_inf = value; }
        }
        string _user_name = "";
        /// <summary>
        /// 授权方公众号的原始ID
        /// </summary>
        public string User_name
        {
            get { return _user_name; }
            set { _user_name = value; }
        }

        string _alias = "";
        /// <summary>
        /// 授权方公众号所设置的微信号,可能为空
        /// </summary>
        public string Alias
        {
            get { return _alias; }
            set { _alias = value; }
        }
        //以下信息暂不使用
        //string _business_info=
        // 用以了解以下功能的开通状况(0代表未开通,1代表已开通):
        // open_store:是否开通微信门店功能
        // open_scan:是否开通微信扫商品功能
        // open_pay:是否开通微信支付功能
        // open_card:是否开通微信卡券功能
        // open_shake:是否开通微信摇一摇功能
        // qrcode_url	 二维码图片的URL,开发者最好自行也进行保存
        //authorization_info	授权信息
        //appid	授权方appid
        //func_info	公众号授权给开发者的权限集列表,ID为1到15时分别代表:
        //消息管理权限
        //用户管理权限
        //帐号服务权限
        //网页服务权限
        //微信小店权限
        //微信多客服权限
        //群发与通知权限
        //微信卡券权限
        //微信扫一扫权限
        //微信连WIFI权限
        //素材管理权限
        //微信摇周边权限
        //微信门店权限
        //微信支付权限
        //自定义菜单权限

    }
}