package com.younike.common.utils.push;

import cn.jpush.api.push.model.Message;
import cn.jpush.api.push.model.Options;
import cn.jpush.api.push.model.Platform;
import cn.jpush.api.push.model.PushPayload;
import cn.jpush.api.push.model.audience.Audience;
import cn.jpush.api.push.model.audience.AudienceTarget;
import cn.jpush.api.push.model.notification.AndroidNotification;
import cn.jpush.api.push.model.notification.IosAlert;
import cn.jpush.api.push.model.notification.IosNotification;
import cn.jpush.api.push.model.notification.Notification;

import java.util.Collection;
import java.util.Map;


/**
 * 极光推送
 * 2021-7-22 Another
 */
public class PushUtils {


	/**
	 * 推送通知：平台是 安卓、ios，指定 单个别名 的客户端
	 * @param alias 推送目标 别名
	 * @param title 通知标题
	 * @param alert 通知内容
	 * @param extras 附加字段（传 type 和 id，用于前端点击通知跳转app对应页面）
	 * @return
	 */
	public static PushPayload buildPushObject_androidAndIos_alias_alertWithTitle_extras(String alias, String title, String alert, Map<String, String> extras) {
		// 设置 ios 的通知标题和内容
		IosAlert iosAlert = IosAlert.newBuilder().setTitleAndBody(title, null, alert).build();

		return PushPayload.newBuilder()
				.setPlatform(Platform.android_ios())    // 设置 安卓、ios平台
				.setAudience(Audience.alias(alias))    // 设置 别名
				.setNotification(Notification.newBuilder()
						.addPlatformNotification(AndroidNotification    // 设置 安卓
								.newBuilder()
								.setTitle(title)
								.setAlert(alert)
								.addExtras(extras)
								.build())
						.addPlatformNotification(IosNotification    // 设置 ios
								.newBuilder()
								//.setBadge(1)    // 设置 角标数字加1
								.setAlert(iosAlert)
								.addExtras(extras)
								.build())
						.build())
				.build();
	}

	/**
	 * 推送通知：平台是 安卓、ios，指定 别名List 的客户端
	 * @param aliasList 推送目标 别名List
	 * @param title 通知标题
	 * @param alert 通知内容
	 * @param extras 附加字段（传 type 和 id，用于前端点击通知跳转app对应页面）
	 * @return
	 */
	public static PushPayload buildPushObject_androidAndIos_aliasList_alertWithTitle_extras(Collection<String> aliasList, String title, String alert, Map<String, String> extras) {
		// 设置 ios 的通知标题和内容
		IosAlert iosAlert = IosAlert.newBuilder().setTitleAndBody(title, null, alert).build();

		return PushPayload.newBuilder()
				.setPlatform(Platform.android_ios())    // 设置 安卓、ios平台
				.setAudience(Audience.alias(aliasList))    // 设置 别名List
				.setNotification(Notification.newBuilder()
						.addPlatformNotification(AndroidNotification    // 设置 安卓
								.newBuilder()
								.setTitle(title)
								.setAlert(alert)
								.addExtras(extras)
								.build())
						.addPlatformNotification(IosNotification    // 设置 ios
								.newBuilder()
								//.setBadge(1)    // 设置 角标数字加1
								.setAlert(iosAlert)
								.addExtras(extras)
								.build())
						.build())
				.build();
	}

	/**
	 * 推送通知：所有平台、所有用户
	 * @param alert 通知内容
	 * @return
	 */
	public static PushPayload buildPushObject_all_all_alert(String alert) {
		return PushPayload.alertAll(alert);
	}




	/******************************* 下面暂时没用到，用到需要另外测试 **********************************************/

	/**
	 * 推送通知：所有平台，指定 单个别名 的客户端
	 * @param alias 推送目标 别名
	 * @param alert 通知内容
	 * @return
	 */
	public static PushPayload buildPushObject_all_alias_alert(String alias, String alert) {
		return PushPayload.newBuilder()
				.setPlatform(Platform.all())
				.setAudience(Audience.alias(alias))    // 设置 标签
				.setNotification(Notification.alert(alert))
				.build();
	}

	/**
	 * 推送通知：指定 多个别名 的客户端（一次最多推送1000个）
	 * @param aliasList 推送目标 别名List
	 * @param alert 通知内容
	 * @return
	 */
	public static PushPayload buildPushObject_all_aliasList_alert(Collection<String> aliasList, String alert) {
		return PushPayload.newBuilder()
				.setPlatform(Platform.all())
				.setAudience(Audience.alias(aliasList))    // 设置 标签
				.setNotification(Notification.alert(alert))
				.build();
	}

	/**
	 * 推送通知：指定 单个设备标识 的客户端
	 * @param registrationId 设备标识（客户端的极光注册id）
	 * @param alert 通知内容
	 * @return
	 */
	public static PushPayload buildPushObject_all_registrationId_alert(String registrationId, String alert) {
		return PushPayload.newBuilder()
				.setPlatform(Platform.all())    // 设置平台 - 所有平台
				.setAudience(Audience.registrationId(registrationId))    // 设置受众 - 极光注册id
				.setNotification(Notification.alert(alert))    // 设置通知 - 推送内容
				.build();
	}

	/**
	 * 推送通知：指定 多个设备标识 的客户端（一次最多推送1000个）
	 * @param registrationIdList 设备标识集合（客户端的极光注册id集合）
	 * @param alert 通知内容
	 * @return
	 */
	public static PushPayload buildPushObject_all_registrationIds_alert(Collection<String> registrationIdList, String alert) {
		return PushPayload.newBuilder()
				.setPlatform(Platform.all())    // 设置平台 - 所有平台
				.setAudience(Audience.registrationId(registrationIdList))     // 设置受众 - 极光注册id-多个客户端
				.setNotification(Notification.alert(alert))     // 设置通知 - 推送内容
				.build();
	}

	/**
	 * 推送通知：平台是 Android，指定 单个标签 的客户端
	 * @param tag 推送目标 标签
	 * @param alert 通知内容
	 * @param title 通知标题
	 * @return
	 */
	public static PushPayload buildPushObject_android_tag_alertWithTitle(String tag, String alert, String title) {
		return PushPayload.newBuilder()
				.setPlatform(Platform.android())    // 设置 安卓平台
				.setAudience(Audience.tag(tag))
				.setNotification(Notification.android(alert, title, null))    // 设置 推送标题和内容
				.build();
	}

	/**
	 * 推送消息：指定 单个别名 的客户端
	 * @param alias 推送目标 别名
	 * @param message 消息内容
	 * @return
	 */
	public static PushPayload buildPushObject_all_alias_message(String alias, String message) {
		return PushPayload.newBuilder()
				.setPlatform(Platform.all())
				.setAudience(Audience.alias(alias))    // 设置 标签
				.setMessage(Message.content(message))    // 设置 消息
				.build();
	}

	/**
	 * 推送消息：指定 单个别名 的客户端
	 * @param alias 推送目标 别名
	 * @param message 消息内容
	 * @param extras 附加字段和内容
	 * @return
	 */
	public static PushPayload buildPushObject_all_alias_messageWithExtras(String alias, String message, Map<String, String> extras) {
		return PushPayload.newBuilder()
				.setPlatform(Platform.all())
				.setAudience(Audience.alias(alias))    // 设置 标签
				.setMessage(Message.newBuilder()
						.setMsgContent(message)    // 设置 消息
						.addExtras(extras)    // 设置 附加字段
						.build())
				.build();
	}


	/* 下边两个是参考例子 */
	/**
	 * 构建推送对象：平台是 iOS，推送目标是 "tag1", "tag_all" 的交集，推送内容同时包括通知与消息 - 通知信息是 ALERT，
	 * 角标数字为 5，通知声音为 "happy"，并且附加字段 from = "JPush"；消息内容是 MSG_CONTENT。通知是 APNs 推送通道的，
	 * 消息是 JPush 应用内消息通道的。APNs 的推送环境是“生产”
	 *
	 * @return
	 */
	public static PushPayload buildPushObject_ios_tagAnd_alertWithExtrasAndMessage(String alert, String message) {
		return PushPayload.newBuilder()
				.setPlatform(Platform.ios())
				.setAudience(Audience.tag_and("tag1", "tag_all"))
				.setNotification(Notification.newBuilder()
						.addPlatformNotification(IosNotification.newBuilder()
								.setAlert(alert)    // 设置 通知信息
								.setBadge(5)    // 设置 角标数字
								.setSound("happy")    // 设置 声音
								.addExtra("from", "JPush")    // 设置 附加字段
								.build())
						.build())
				.setMessage(Message.content(message))    // 设置 消息内容
				.setOptions(Options.newBuilder()
						.setApnsProduction(true)    // 设置 是否推送生产环境（不指定默认推送生产环境）
						.build())
				.build();
	}

	/**
	 * 构建推送对象：平台是 Andorid 与 iOS，推送目标是 （"tag1" 与 "tag2" 的并集）交（"alias1" 与 "alias2" 的并集），推送内容是 - 内容为 MSG_CONTENT 的消息，并且附加字段 from = JPush
	 * @return
	 */
	public static PushPayload buildPushObject_ios_audienceMore_messageWithExtras(String message) {
		return PushPayload.newBuilder()
				.setPlatform(Platform.android_ios())
				.setAudience(Audience.newBuilder()
						.addAudienceTarget(AudienceTarget.tag("tag1", "tag2"))
						.addAudienceTarget(AudienceTarget.alias("alias1", "alias2"))
						.build())
				.setMessage(Message.newBuilder()
						.setMsgContent(message)
						.addExtra("from", "JPush")
						.build())
				.build();
	}

}

