using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Aliyun.Acs.Push.Model.V20160801;
using Aliyun.Acs.Push.Transform.V20160801;
using Aliyun.Acs.Core;
using Aliyun.Acs.Core.Exceptions;
using Aliyun.Acs.Core.Profile;
//using MySystem.Models;
using Library;

namespace MySystem
{
    public class AliyunPush
    {
        private string AccessKeyID = "LTAImYRe25JQ5nr8";
        private string AccessKeySecret = "znOWxVGLnKl8KHlPSIKruYC3C1HYIy";

        public void PushMessageToAndroid()
        {
            IClientProfile clientProfile = DefaultProfile.GetProfile("cn-hangzhou", AccessKeyID, AccessKeySecret);
            DefaultAcsClient client = new DefaultAcsClient(clientProfile);
            PushMessageToAndroidRequest request = new PushMessageToAndroidRequest();
            request.AppKey = 24566887;
            request.Target = "ALL";//推送目标: DEVICE:按设备推送 ALIAS : 按别名推送 ACCOUNT:按帐号推送  TAG:按标签推送; ALL: 广播推送
            request.TargetValue = "All";////根据Target来设定，如Target=DEVICE, 则对应的值为 设备id1,设备id2. 多个值使用逗号分隔.(帐号与设备一次最多100)
            request.Title = "android title";
            request.Body = "android body";
            try
            {
                PushMessageToAndroidResponse response = client.GetAcsResponse(request);
                Console.WriteLine("RequestId:" + response.RequestId);
                Console.WriteLine("ResponseId:" + response.MessageId);
                Console.ReadLine();
            }
            catch (ServerException e)
            {
                Console.WriteLine(e.ErrorCode);
                Console.WriteLine(e.ErrorMessage);
                Console.ReadLine();
            }
            catch (ClientException e)
            {
                Console.WriteLine(e.ErrorCode);
                Console.WriteLine(e.ErrorMessage);
                Console.ReadLine();
            }
        }

        public void PushMessageToiOS()
        {
            IClientProfile clientProfile = DefaultProfile.GetProfile("cn-hangzhou", AccessKeyID, AccessKeySecret);
            DefaultAcsClient client = new DefaultAcsClient(clientProfile);
            PushMessageToiOSRequest request = new PushMessageToiOSRequest();
            request.AppKey = 24566887;
            request.Target = "ALL";//推送目标: DEVICE:按设备推送 ALIAS : 按别名推送 ACCOUNT:按帐号推送  TAG:按标签推送; ALL: 广播推送
            request.TargetValue = "All";//根据Target来设定，如Target=DEVICE, 则对应的值为 设备id1,设备id2. 多个值使用逗号分隔.(帐号与设备一次最多100个)
            request.Title = "iOS Title";
            request.Body = "iOS Body";
            try
            {
                PushMessageToiOSResponse response = client.GetAcsResponse(request);
                Console.WriteLine("RequestId:" + response.RequestId);
                Console.WriteLine("ResponseId:" + response.MessageId);
                Console.ReadLine();
            }
            catch (ServerException e)
            {
                Console.WriteLine(e.ErrorCode);
                Console.WriteLine(e.ErrorMessage);
                Console.ReadLine();
            }
            catch (ClientException e)
            {
                Console.WriteLine(e.ErrorCode);
                Console.WriteLine(e.ErrorMessage);
                Console.ReadLine();
            }
        }

        public void PushNoticeToAndroid()
        {
            IClientProfile clientProfile = DefaultProfile.GetProfile("cn-hangzhou", AccessKeyID, AccessKeySecret);
            DefaultAcsClient client = new DefaultAcsClient(clientProfile);
            PushNoticeToAndroidRequest request = new PushNoticeToAndroidRequest();
            request.AppKey = 24566887;
            request.Target = "ALL";//推送目标: DEVICE:按设备推送 ALIAS : 按别名推送 ACCOUNT:按帐号推送  TAG:按标签推送; ALL: 广播推送
            request.TargetValue = "all";//根据Target来设定，如Target=DEVICE, 则对应的值为 设备id1,设备id2. 多个值使用逗号分隔.(帐号与设备一次最多100个)
            request.Title = "android notice title";
            request.Body = "android notice body";
            request.ExtParameters = "{\"Url\":\"http://www.yunmuit.com/\"}";
            try
            {
                PushNoticeToAndroidResponse response = client.GetAcsResponse(request);
                Console.WriteLine("RequestId:" + response.RequestId);
                Console.WriteLine("ResponseId:" + response.MessageId);
                Console.ReadLine();
            }
            catch (ServerException e)
            {
                Console.WriteLine(e.ErrorCode);
                Console.WriteLine(e.ErrorMessage);
                Console.ReadLine();
            }
            catch (ClientException e)
            {
                Console.WriteLine(e.ErrorCode);
                Console.WriteLine(e.ErrorMessage);
                Console.ReadLine();
            }
        }

        public void PushNoticeToiOS()
        {
            IClientProfile clientProfile = DefaultProfile.GetProfile("cn-hangzhou", AccessKeyID, AccessKeySecret);
            DefaultAcsClient client = new DefaultAcsClient(clientProfile);
            PushNoticeToiOSRequest request = new PushNoticeToiOSRequest();
            request.AppKey = 24566887;
            // iOS的通知是通过APNS中心来发送的，需要填写对应的环境信息. DEV:表示开发环境, PRODUCT: 表示生产环境
            request.ApnsEnv = "DEV";
            request.Target = "ALL";
            request.TargetValue = "ALL";
            request.Title = "test";
            request.Body = "testg";
            request.ExtParameters = "{\"Url\":\"http://www.yunmuit.com/\"}";
            try
            {
                PushNoticeToiOSResponse response = client.GetAcsResponse(request);
                Console.WriteLine("RequestId:" + response.RequestId);
                Console.WriteLine("ResponseId:" + response.MessageId);
                Console.ReadLine();
            }
            catch (ServerException e)
            {
                Console.WriteLine(e.ErrorCode);
                Console.WriteLine(e.ErrorMessage);
                Console.ReadLine();
            }
            catch (ClientException e)
            {
                Console.WriteLine(e.ErrorCode);
                Console.WriteLine(e.ErrorMessage);
                Console.ReadLine();
            }
        }

        public string Push(string Title, string Body, string Url, string PushType = "NOTICE", string DeviceType = "ALL", string DeviceList = "", bool Silent = false, String pushTime = "")
        {
            IClientProfile clientProfile = DefaultProfile.GetProfile("cn-hangzhou", AccessKeyID, AccessKeySecret);
            DefaultAcsClient client = new DefaultAcsClient(clientProfile);
            PushRequest request = new PushRequest();

            // 推送目标
            if (DeviceType == "ANDROID")
            {
                request.AppKey = 27532904;
            }
            else if (DeviceType == "iOS")
            {
                request.AppKey = 27536906;
            }
            if (string.IsNullOrEmpty(DeviceList))
            {
                //推送目标: DEVICE:按设备推送 ALIAS : 按别名推送 ACCOUNT:按帐号推送  TAG:按标签推送; ALL: 广播推送
                request.Target = "ALL";
                //根据Target来设定，如Target=DEVICE, 则对应的值为 设备id1,设备id2. 多个值使用逗号分隔.(帐号与设备有一次最多100个的限制)
                request.TargetValue = "All";
            }
            else
            {
                request.Target = "DEVICE";
                request.TargetValue = DeviceList;
            }
            //消息类型 MESSAGE NOTICE
            request.PushType = PushType;
            //设备类型 ANDROID iOS ALL.
            request.DeviceType = DeviceType;
            // 消息的标题
            request.Title = Title;
            // 消息的内容
            request.Body = Body;

            // 推送配置: iOS
            // iOS应用图标右上角角标
            //request.IOSBadge = 50;
            //开启静默通知
            request.IOSSilentNotification = Silent;
            // iOS通知声音
            if (Silent)
            {
                request.IOSMusic = ""; 
            }
            else
            {
                request.IOSMusic = "default";
            }
            //iOS10通知副标题的内容
            request.IOSSubtitle = "";
            //指定iOS10通知Category
            request.IOSNotificationCategory = "iOS10 Notification Category";
            //是否允许扩展iOS通知内容
            request.IOSMutableContent = true;
            //iOS的通知是通过APNs中心来发送的，需要填写对应的环境信息。"DEV" : 表示开发环境 "PRODUCT" : 表示生产环境
            request.IOSApnsEnv = "PRODUCT";
            //消息推送时设备不在线（既与移动推送的服务端的长连接通道不通），则这条推送会做为通知，通过苹果的APNs通道送达一次。注意：离线消息转通知仅适用于生产环境
            request.IOSRemind = true;
            //iOS消息转通知时使用的iOS通知内容，仅当iOSApnsEnv=PRODUCT && iOSRemind为true时有效
            request.IOSRemindBody = Body;
            //自定义的kv结构,开发者扩展用 针对iOS设备
            string PageId = Url;
            string Params = "";
            if (Url.Contains("?"))
            {
                Params = Url.Split("?")[1];
                PageId = Url.Split("?")[0];
            }
            request.IOSExtParameters = "{\"Url\":\"" + PageId + "\",\"Params\":\"" + Params + "\",\"SoundType\":\"0\"}";

            // 推送配置: Android
            // 通知的提醒方式 "VIBRATE" : 震动 "SOUND" : 声音 "BOTH" : 声音和震动 NONE : 静音
            if (Silent)
            {
                request.AndroidNotifyType = "NONE"; 
            }
            else
            {
                request.AndroidNotifyType = "SOUND";
            }
            //通知栏自定义样式0-100
            request.AndroidNotificationBarType = 3;
            //通知栏显示优先级
            request.AndroidNotificationBarPriority = 0;
            //点击通知后动作 "APPLICATION" : 打开应用 "ACTIVITY" : 打开AndroidActivity "URL" : 打开URL "NONE" : 无跳转
            request.AndroidOpenType = "APPLICATION";
            //Android收到推送后打开对应的url,仅当AndroidOpenType="URL"有效
            //request.AndroidOpenUrl = "http://www.baidu.com";
            //设定通知打开的activity，仅当AndroidOpenType="Activity"有效
            //request.AndroidActivity = "com.alibaba.push2.demo.XiaoMiPushActivity";

            request.AndroidRemind = true;
            request.AndroidPopupActivity = "com.yunmuapp.yunmuapp.activity.WaitActivity";
            request.AndroidPopupTitle = "客小爽";
            request.AndroidPopupBody = Body;
            request.AndroidNotificationChannel = "1";

            //Android通知音乐
            request.AndroidMusic = "default";
            //设置该参数后启动小米托管弹窗功能，此处指定通知点击后跳转的Activity（托管弹窗的前提条件：1. 继承小米辅助通道；2. storeOffline设为true)
            request.AndroidXiaoMiActivity = "com.yunmuapp.yunmuapp.activity.WaitActivity";
            //小米弹窗标题
            request.AndroidXiaoMiNotifyTitle = "客小爽";
            //小米弹窗内容
            request.AndroidXiaoMiNotifyBody = Body;
            // 设定android类型设备通知的扩展属性
            request.AndroidExtParameters = "{\"Url\":\"" + PageId + "\",\"Params\":\"" + Params + "\",\"SoundType\":\"0\"}";

            // 推送控制
            //String pushTime = DateTime.UtcNow.AddSeconds(3).ToString("yyyy-MM-ddTHH\\:mm\\:ssZ");
            if (!string.IsNullOrEmpty(pushTime))
            {
                TimeSpan ts = DateTime.Parse(pushTime) - DateTime.Now;
                request.PushTime = DateTime.UtcNow.Add(ts).ToString("yyyy-MM-ddTHH\\:mm\\:ssZ");//延迟3秒发送
            }
            String expireTime = DateTime.UtcNow.AddDays(1).ToString("yyyy-MM-ddTHH\\:mm\\:ssZ");
            request.ExpireTime = expireTime;//设置过期时间为2天
            request.StoreOffline = true;

            string result = "";
            try
            {
                PushResponse response = client.GetAcsResponse(request);
                Console.WriteLine("RequestId:" + response.RequestId);
                Console.WriteLine("ResponseId:" + response.MessageId);
                Console.ReadLine();
                result = "1|" + response.MessageId;
            }
            catch (ServerException e)
            {
                Console.WriteLine(e.ErrorCode);
                Console.WriteLine(e.ErrorMessage);
                Console.ReadLine();
                function.WriteLog(e.ErrorCode, "阿里云推送异常");
                function.WriteLog(e.ErrorMessage, "阿里云推送异常");
            }
            catch (ClientException e)
            {
                Console.WriteLine(e.ErrorCode);
                Console.WriteLine(e.ErrorMessage);
                Console.ReadLine();
                function.WriteLog(e.ErrorCode, "阿里云推送异常");
                function.WriteLog(e.ErrorMessage, "阿里云推送异常");
            }
            return result;
        }

        public void CancelPush(string msgid)
        {
            IClientProfile clientProfile = DefaultProfile.GetProfile("cn-hangzhou", AccessKeyID, AccessKeySecret);
            DefaultAcsClient client = new DefaultAcsClient(clientProfile);
            CancelPushRequest request = new CancelPushRequest();
            request.AppKey = 24566887;
            request.MessageId = msgid;
            try
            {
                CancelPushResponse response = client.GetAcsResponse(request);
                Console.WriteLine("RequestId:" + response.RequestId); 
                Console.ReadLine();
            }
            catch (ServerException e)
            {
                Console.WriteLine(e.ErrorCode);
                Console.WriteLine(e.ErrorMessage);
                Console.ReadLine();
            }
            catch (ClientException e)
            {
                Console.WriteLine(e.ErrorCode);
                Console.WriteLine(e.ErrorMessage);
                Console.ReadLine();
            }
        }
    }
}