<template>
	<view class="container">
		<trtc-room ref="trtc-component" :config="rtcConfig"> </trtc-room>
		<view class="top_box" :style="{ top: btn_top, left: btn_left}">
			<image class="top_box_img" :src="head_img"></image>
			<view class="top_box_text">
				<text class="text_box_top">{{title}}</text><text class="text_box_bottom" style="display:none">{{user_name}}</text>
			</view>
		</view>
		<view class="popup-flip" @click="changeCamera()">
			<view class="iconfont iconFill"></view>
		</view>
		<view class="popup-open" @click="popupShow = true">
			<view class="iconfont iconzhibo-shangpin"></view>
		</view>
		<u-popup v-model="popupShow" mode="bottom">
			<view class="popup-box">
				<view class="popup-close" @click="popupShow = false">收起</view>
				<view class="popup-edit" @click="bindGood()">绑定</view>
				<scroll-view scroll-y="true" class="good-select-box">
					<view class="select-good-row" v-for="(item, index) in goodList" :key="index">
						<view class="good-check">
							<view class="iconfont" :class="item.check ? 'iconqueding' : 'iconfeigouxuan'" @click="checkGoods(item)"></view>
						</view>
						<view class="good-card" style="width: calc(100% - 60px);">
							<image class="goods-img" :src="item.imgPath"></image>
							<view class="good-info">
								<view class="good-name">{{item.productName}}</view>
								<view class="good-text">销量：{{item.sellCount}}</view>
								<view class="good-price">
									<text class="goods-spec">￥{{item.bizPrice}}/{{item.unit}}</text>
									<text class="goods-original">原价:{{item.originalPrice}}</text>
								</view>
							</view>
						</view>
					</view>
				</scroll-view>
			</view>
		</u-popup>
		<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 "@/pagesMedia/debug/GenerateTestUserSig";
	import trtcRoom from "@/pagesMedia/trtc-room/trtc-room";
	export default {
		components: {
			trtcRoom
		},
		data() {
			return {
				liveId: '',
				popupShow: false,
				goodList: [],
				rtcConfig: {
					sdkAppID: '',
					// 必要参数 开通实时音视频服务创建应用后分配的 sdkAppID
					userID: '',
					// 必要参数 用户 ID 可以由您的帐号系统指定
					userSig: '',
					// 必要参数 身份签名，相当于登录密码的作用
					template: '' // 必要参数 组件模版，支持的值 1v1 grid custom ，注意：不支持动态修改, iOS 不支持 pusher 动态渲染
				},
				showTipToast: false,
				options: {},
				btn_left:0,
				btn_top:0,
				title:"",
				user_name:'0',
				head_img:"../static/images/loginLogo.png"
			}
		},
		onLoad(options) {
			this.liveId = options.liveId
			NET.request(API.getBindedLiveGoods, {
				liveId: this.liveId
			}, 'GET').then(res => {
				let goodsIds = res.data.map(site => {
					return site.productId
				}).join(',')
				this.getAllGoods(goodsIds)
			}).catch(res => {
				this.$refs.uTips.show({
					title: '获取已绑定商品失败',
					type: 'warning',
				})
			})
			NET.request(API.creatLive, {
				liveId: this.liveId,
				liveStatus: 1
			}, 'GET').then(res => {}).catch(res => {
				this.$refs.uTips.show({
					title: '开启直播失败',
					type: 'warning',
				})
			})
		},
		onReady() {
			var that=this;
			
			let menuButtonObject = wx.getMenuButtonBoundingClientRect();
			let userData = uni.getStorageSync("userData")
			 wx.getSystemInfo({
			    success: res => {
					this.setData({
						btn_left: res.windowWidth - menuButtonObject.right+'rpx',
						btn_top:menuButtonObject.top+menuButtonObject.height+14+'rpx'
					})
				},
			})
			
			wx.setKeepScreenOn({
				keepScreenOn: true
			}); // 获取 rtcroom 实例
			this.trtcComponent = this.$refs['trtc-component']; // 监听TRTC Room 关键事件
			this.bindTRTCRoomEvent(); // 将String 类型的 true false 转换成 boolean
			this.options.localAudio = true; //开启麦克风
			this.options.localVideo = true; //开启视频
			NET.request(API.getLiveData + this.liveId, {}, 'POST').then(res => {
				this.enterRoom({
					roomID: Number(res.data.roomId),
					userID: uni.getStorageSync("userData").userId,
					template: "grid",
				});
				this.setData({
					head_img:res.data.imgUrl,
					title:res.data.liveName
				})
			}).catch(res => {
				this.$refs.uTips.show({
					title: '获取直播设置参数失败',
					type: 'warning',
				})
			})
		},
		onUnload() {
			NET.request(API.creatLive, {
				liveId: this.liveId,
				liveStatus: 2
			}, 'GET').then(res => {}).catch(res => {
				this.$refs.uTips.show({
					title: '关闭直播失败',
					type: 'warning',
				})
			})
		},
		methods: {
			//  勾选商品
			checkGoods(site) {
				site.check = !site.check
			},
			//  获取可绑定商品
			getAllGoods(goodsIds) {
				NET.request(API.getVideoGoods, {}, 'GET').then(res => {
					res.data.forEach(site => {
						site.check = goodsIds.indexOf(site.productId) != -1
					})
					this.goodList = res.data
				}).catch(res => {
					this.$refs.uTips.show({
						title: '获取可绑定商品失败',
						type: 'warning',
					})
				})
			},
			//  绑定商品
			bindGood() {
				NET.request(API.bindLiveGoods, {
					liveId: this.liveId,
					prudoctIds: this.goodList.filter(site => site.check).map(site => {
						return site.productId
					})
				}, 'POST').then(res => {
					this.popupShow = false
					this.$refs.uTips.show({
						title: '绑定商品成功',
						type: 'success',
					})
				}).catch(res => {
					this.$refs.uTips.show({
						title: '绑定商品失败',
						type: 'warning',
					})
				})
			},
			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: false,
					// 非必要参数，打开组件的调试模式，开发调试时建议设置为 true
					// cloudenv: params.cloudenv, // 非必要参数
					frontCamera: "front",
					enableEarMonitor: false,
					enableAutoFocus: true,
					localMirror: 'auto',
					enableAgc: true,
					enableAns: true,
					encsmall: false ? 1 : 0,
					videoWidth: 1280,
					videoHeight: 720,
					scene: "live",
					maxBitrate: 2000,
					minBitrate: 1500,
					beautyLevel: 9 // 默认开启美颜
				};
				this.setData({
					rtcConfig: this.rtcConfig
				}, () => {
					// roomID 取值范围 1 ~ 4294967295
					this.trtcComponent.enterRoom({
						roomID: params.roomID
					}).then(() => {
						if (this.template === 'custom') {
							// 设置推流端视窗的坐标和尺寸
							this.trtcComponent.setViewRect({
								userID: params.userID,
								xAxis: '480rpx',
								yAxis: '160rpx',
								width: '240rpx',
								height: '320rpx'
							});
						}
					}).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 => {
					let user_list=this.trtcComponent.getRemoteUserList();
					this.setData({
						user_name:user_list.length
					})
					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 => {
					let user_list=this.trtcComponent.getRemoteUserList();
					this.setData({
						user_name:user_list.length
					})
					
					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 => {
					let user_list=this.trtcComponent.getRemoteUserList();
					this.setData({
						user_name:user_list.length
					})
					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());
				});
			},
			changeCamera: function() {
				this.trtcComponent.switchCamera();
			}
		},
	}
</script>

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

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

		.popup-flip {
			width: 50px;
			height: 50px;
			position: fixed;
			top: 15px;
			right: 15px;
			background: #52A63A;
			border-radius: 50%;
			text-align: center;
			line-height: 50px;
			z-index: 10000;

			.iconFill {
				color: #FFFFFF;
				font-size: 34px;
			}
		}

		.popup-open {
			width: 50px;
			height: 50px;
			position: fixed;
			bottom: 15px;
			right: 15px;
			background: #52A63A;
			border-radius: 50%;
			text-align: center;
			line-height: 50px;
			z-index: 10000;

			.iconzhibo-shangpin {
				color: #FFFFFF;
				font-size: 34px;
			}
		}

		.popup-box {
			width: 100%;
			height: 400px;
			float: left;
			background-color: #FFFFFF;
			border-radius: 15px 15px 0px 0px;
			box-sizing: border-box;
			padding: 16px 0 0 0;
			position: relative;

			.popup-close {
				width: 50%;
				height: 26px;
				float: left;
				box-sizing: border-box;
				padding: 10px 15px 0 15px;
				font-size: 15px;
				font-family: PingFang SC;
				color: #52A63A;
				line-height: 16px;
				margin-bottom: 10px;
			}

			.popup-edit {
				width: 50%;
				height: 26px;
				float: right;
				box-sizing: border-box;
				padding: 10px 15px 0 15px;
				font-size: 15px;
				font-family: PingFang SC;
				color: #52A63A;
				line-height: 16px;
				margin-bottom: 10px;
				text-align: right;
			}

			.good-select-box {
				width: 100%;
				height: 400px;
				float: left;
				overflow-y: auto;
				padding: 40px 0 10px 0;
			}

			.select-good-row {
				width: 100%;
				height: 114px;
				float: left;
			}

			.good-check {
				width: 30px;
				height: 104px;
				float: left;
				line-height: 104px;
				margin-right: 10px;

				.iconfont {
					font-size: 40px;
					text-align: right;
					color: #51A539;
				}
			}

			.good-card {
				width: 100%;
				float: left;
				margin: 5px;
				background: #FFFFFF;
				border-radius: 15px;
				box-shadow: 0px 1px 5px 0px rgba(102, 102, 102, 0.43);
				padding: 12px;
				box-sizing: border-box;

				.goods-img {
					width: 80px;
					height: 80px;
					float: left;
					border-radius: 10px;
					object-fit: cover;
				}

				.good-info {
					width: calc(100% - 86px);
					height: 80px;
					float: right;

					.good-name {
						width: 100%;
						height: 40px;
						float: left;
						font-size: 15px;
						font-family: PingFang SC;
						color: #333333;
						line-height: 20px;
						overflow: hidden;
						text-overflow: ellipsis;
						display: -webkit-box;
						-webkit-line-clamp: 2;
						-webkit-box-orient: vertical;
						word-wrap: break-word;
					}

					.good-price {
						width: 100%;
						height: 20px;
						float: left;
						line-height: 20px;
						font-family: PingFang SC;
						white-space: nowrap;
						margin: 3px 0 3px 0;

						.goods-spec {
							font-size: 15px;
							color: #52A63A;
							margin-right: 6px;
						}

						.goods-original {
							font-size: 12px;
							text-decoration: line-through;
							color: #A67954;
						}
					}
				}
			}
		}
		.top_box{
		  width: 304rpx;
		  height: 86rpx;
		  position: absolute;
		  z-index: 100;
		  background:rgba(0, 0, 0, 0.4);
		  border-radius: 100px;
		  top: 182rpx;
		  left: 30rpx;
		}
		.top_box_img{
		  width: 86rpx;
		height: 86rpx;
		border-radius: 100rpx;
		float: left;
		}
		.top_box_text{
		  float: left;
		  color: #fff;
		  margin-left: 30rpx;
		  width: 180rpx;
		  padding-top: 2rpx;
		}
		.text_box_top{
		 font-size: 34rpx;
		 width: 100%;
		 display: block;
		 height: 30rpx;
		 float: left;
		 margin-top: 19rpx;
		}
		.text_box_bottom{
		  font-size: 22rpx;
		  float: left;
		  margin-top: 10rpx;
		}
	}
</style>
