<template>
	<view class="container">
		<trtc-room ref="trtc-component" :config="rtcConfig"> </trtc-room>
		<view class="tip-toast" v-if="showTipToast">
			<view>当前房间为1v1双人通话房间</view>
			<view>不希望其他人打扰</view>
		</view>
		<u-top-tips ref="uTips"></u-top-tips>
	</view>
</template>

<script>
	const NET = require('@/utils/request')
	const API = require('@/config/api')
	import {
		genTestUserSig,
		setData
	} from "@/pagesGood/debug/GenerateTestUserSig";
	import trtcRoom from "@/pagesGood/trtc-room/trtc-room";
	export default {
		components: {
			trtcRoom
		},
		data() {
			return {
				liveId: '',
				roomId: '',
				rtcConfig: {
					sdkAppID: '',
					// 必要参数 开通实时音视频服务创建应用后分配的 sdkAppID
					userID: '',
					// 必要参数 用户 ID 可以由您的帐号系统指定
					userSig: '',
					// 必要参数 身份签名,相当于登录密码的作用
					template: '' // 必要参数 组件模版,支持的值 1v1 grid custom ,注意:不支持动态修改, iOS 不支持 pusher 动态渲染
				},
				showTipToast: false
			}
		},
		onLoad(options) {
			NET.request(API.linkPickVideo, {
				tenantCode : options.tenantCode
			}, 'GET').then(res => {
				this.liveId = res.data.liveId
				this.roomId = res.data.roomId
				wx.setKeepScreenOn({
					keepScreenOn: true
				}); // 获取 rtcroom 实例
				this.trtcComponent = this.$refs['trtc-component']; // 监听TRTC Room 关键事件
				this.bindTRTCRoomEvent(); // 将String 类型的 true false 转换成 boolean
				options.template = '1v1';
				this.options = options; // querystring 只支持传递 String 类型, 注意类型转换
				this.enterRoom({
					roomID: this.roomId,
					userID: uni.getStorageSync("userData").userId, //设置为用户id
					template: '1v1',
					debugMode: false,
					cloudenv: 'PRO',
				});
			}).catch(error => {
				this.$refs.uTips.show({
					title: error.data.msg,
					type: 'warning',
				})
			})
		},
		methods: {
			setData,
			enterRoom: function(params) {
				params.template = params.template || '1v1';
				params.roomID = params.roomID || 2333;
				params.userID = params.userID || new Date().getTime().toString(16);
				console.log('* room enterRoom', params);
				const Signature = genTestUserSig(params.userID);
				params.sdkAppID = Signature.sdkAppID;
				params.userSig = Signature.userSig;
				this.template = params.template;
				this.rtcConfig = {
					sdkAppID: params.sdkAppID,
					// 您的实时音视频服务创建应用后分配的 sdkAppID
					userID: params.userID,
					userSig: params.userSig,
					template: params.template,
					// 1v1 grid custom
					debugMode: params.debugMode,
					// 非必要参数,打开组件的调试模式,开发调试时建议设置为 true
					beautyLevel: 9 // 默认开启美颜
					// cloudenv: params.cloudenv, // 非必要参数
				};
				this.setData({
					rtcConfig: this.rtcConfig
				}, () => {
					// roomID 取值范围 1 ~ 4294967295
					this.trtcComponent.enterRoom({
						roomID: params.roomID
					}).then(() => {

					}).catch(res => {
						console.error('* room joinRoom 进房失败:', res);
					});
				});
			},
			bindTRTCRoomEvent: function() {
				const TRTC_EVENT = this.trtcComponent.EVENT;
				this.timestamp = []; // 初始化事件订阅
				this.trtcComponent.on(TRTC_EVENT.LOCAL_JOIN, event => {
					console.log('* room LOCAL_JOIN', event); // 进房成功,触发该事件后可以对本地视频和音频进行设置

					if (this.options.localVideo === true || this.options.template === '1v1') {
						this.trtcComponent.publishLocalVideo();
					}
					if (this.options.localAudio === true || this.options.template === '1v1') {
						this.trtcComponent.publishLocalAudio();
					}
				});
				this.trtcComponent.on(TRTC_EVENT.LOCAL_LEAVE, event => {
					console.log('* room LOCAL_LEAVE', event);
				});
				this.trtcComponent.on(TRTC_EVENT.ERROR, event => {
					console.log('* room ERROR', event);
				}); // 远端用户进房
				this.trtcComponent.on(TRTC_EVENT.REMOTE_USER_JOIN, event => {
					console.log('* room REMOTE_USER_JOIN ---  room.vue', event, this.trtcComponent.getRemoteUserList(), this.template);
					this.timestamp.push(new Date()); // 1v1视频通话时限制人数为两人的简易逻辑,建议通过后端实现房间人数管理
					// 2人以上同时进行通话请选择网格布局
					if (this.template === '1v1' && this.timestamp.length > 1) {
						const interval = this.timestamp[1] - this.timestamp[0];
						if (interval < 1000) {
							// 房间里已经有两个人
							this.setData({
								showTipToast: true
							}, () => {
								setTimeout(() => {
									this.setData({
										showTipToast: false
									});
									wx.navigateBack({
										delta: 1
									});
								}, 4000);
							});
						}
					}
				}); // 远端用户退出
				this.trtcComponent.on(TRTC_EVENT.REMOTE_USER_LEAVE, event => {
					console.log('* room REMOTE_USER_LEAVE', event, this.trtcComponent.getRemoteUserList());
					if (this.template === '1v1') {
						this.timestamp = [];
					}
					if (this.template === '1v1' && this.remoteUser === event.data.userID) {
						this.remoteUser = null;
					}
				}); // 远端用户推送视频
				this.trtcComponent.on(TRTC_EVENT.REMOTE_VIDEO_ADD, event => {
					console.log('* room REMOTE_VIDEO_ADD', event, this.trtcComponent.getRemoteUserList()); // 订阅视频

					const userList = this.trtcComponent.getRemoteUserList();
					const data = event.data;

					if (this.template === '1v1' && (!this.remoteUser || this.remoteUser === data.userID)) {
						// 1v1 只订阅第一个远端流
						this.remoteUser = data.userID;
						this.trtcComponent.subscribeRemoteVideo({
							userID: data.userID,
							streamType: data.streamType
						});
					} else if (this.template === 'grid') {
						this.trtcComponent.subscribeRemoteVideo({
							userID: data.userID,
							streamType: data.streamType
						});
					}
					if (this.template === 'custom' && data.userID && data.streamType) {
						let index = userList.findIndex(item => {
							return item.userID === data.userID;
						});
						index++;
						const y = 320 * index + 160; // 设置远端视图坐标和尺寸
						this.trtcComponent.setViewRect({
							userID: data.userID,
							streamType: data.streamType,
							xAxis: '480rpx',
							yAxis: y + 'rpx',
							width: '240rpx',
							height: '320rpx'
						});
					}
				}); // 远端用户取消推送视频
				this.trtcComponent.on(TRTC_EVENT.REMOTE_VIDEO_REMOVE, event => {
					console.log('* room REMOTE_VIDEO_REMOVE', event, this.trtcComponent.getRemoteUserList());
				}); // 远端用户推送音频
				this.trtcComponent.on(TRTC_EVENT.REMOTE_AUDIO_ADD, event => {
					console.log('* room REMOTE_AUDIO_ADD', event, this.trtcComponent.getRemoteUserList()); // 订阅音频
					const data = event.data;
					if (this.template === '1v1' && (!this.remoteUser || this.remoteUser === data.userID)) {
						this.remoteUser = data.userID;
						this.trtcComponent.subscribeRemoteAudio({
							userID: data.userID
						});
					} else if (this.template === 'grid' || this.template === 'custom') {
						this.trtcComponent.subscribeRemoteAudio({
							userID: data.userID
						});
					} // 如果不订阅就不会自动播放音频
					// this.trtcComponent.subscribeRemoteAudio({ userID: data.userID })
				}); // 远端用户取消推送音频
				this.trtcComponent.on(TRTC_EVENT.REMOTE_AUDIO_REMOVE, event => {
					console.log('* room REMOTE_AUDIO_REMOVE', event, this.trtcComponent.getRemoteUserList());
				});
			}
		}
	}
</script>

<style lang="less" scoped>
	page {
		width: 100%;
		height: 100%;
	}

	.container {
		width: 100%;
		height: 100%;
		float: left;
		position: relative;

		.tip-toast {
			position: absolute;
			top: 40vh;
			width: 70vw;
			left: 15vw;
			border-radius: 12rpx;
			height: 20vh;
			background: rgba(0, 0, 0, 0.8);
			color: white;
			display: flex;
			flex-direction: column;
			align-items: center;
			justify-content: center;
		}

		.tip-toast view {
			padding: 20rpx 0;
			font-size: 32rpx;
		}
	}
</style>