package com.wakeup.qcloud.utils;

import static org.apache.commons.lang3.StringUtils.isNotBlank;

import org.apache.commons.codec.digest.DigestUtils;

import com.google.common.base.Throwables;
import com.wakeup.qcloud.constant.StreamDataType;
import com.wakeup.qcloud.domain.StreamPlayUrlDO;
import com.wakeup.qcloud.domain.StreamUrlConfig;

/**
 * @since 2017年2月22日
 * @author kalman03
 */
public class QCloudStreamUrlUtil {
	/**
	 * <pre>
	 * 直播码计算规则:

直播码=BIZID_MD5(房间号_用户名_数据类型)。
字符串传输按utf-8编码。摄像头数据类型是main,屏幕分享的数据类型是aux。而BIZID是一个固定的参数,可以在直播控制台的顶部找到它。
假如BIZID=8888,用户名=14y2l2c,房间号=293710,在进行摄像头分享,
则MD5(293710_14y2l2c_main)=81265058829fd2e50c8ec2ac78d55127。
那么直播码就是8888_81265058829fd2e50c8ec2ac78d55127。
	</pre>
	 * @param bizId 您在腾讯云分配到的bizid
	 * @param roomId 房间号
	 * @param userId 主播id
	 * @param dataType 摄像头数据类型是main,屏幕分享的数据类型是aux
	 */
	public static String getStreamId(String bizId,String roomId,String userId,StreamDataType dataType){
		String org= roomId+"_"+userId+"_"+dataType.name();
		return bizId +"_"+DigestUtils.md5Hex(org);
	}

	/**
	 * 获取推流地址 如果不传key和过期时间,将返回不含防盗链的url
	 */
	public static String getPushUrl(StreamUrlConfig config) {
		String liveCode = getStreamId(config.getBizId(), config.getRoomId(), config.getUserId(), config.getDataType());
		if(isNotBlank(config.getKey()) && config.getExpireTime() != null){
			String txTime = Long.toHexString(config.getExpireTime().getTime()/1000).toUpperCase();
			String input = new StringBuilder().append(config.getKey()).append(liveCode)
					.append(txTime).toString();
			try {
				String txSecret = DigestUtils.md5Hex(input.getBytes("UTF-8"));
				return "rtmp://"+config.getBizId()+".livepush.myqcloud.com/live/"+liveCode+"?bizid="+config.getBizId()+"&txSecret="+txSecret+"&txTime="+txTime;
			} catch (Exception e) {
				Throwables.propagate(e);
			}
		}
		return "rtmp://"+config.getBizId()+".livepush.myqcloud.com/live/"+liveCode;
	}
	
	/**
	 * 获取播放地址
	 * @param streamId 
	 */
	public static StreamPlayUrlDO getPlayUrls(String streamId) {
		String bizId = streamId.substring(0,streamId.indexOf("_"));
		StreamPlayUrlDO playUrlDO = new StreamPlayUrlDO();
		playUrlDO.setFlvPlayUrl("http://" + bizId + ".liveplay.myqcloud.com/live/" + streamId + ".flv");
		playUrlDO.setHlsPlayUrl("http://" + bizId + ".liveplay.myqcloud.com/live/" + streamId + ".m3u8");
		playUrlDO.setRtmpPlayUrl("rtmp://" + bizId + ".liveplay.myqcloud.com/live/" + streamId);
		return playUrlDO;
	}
}