// 对象uid=>最近弹幕时间
let uidObj = {}

// 歌曲库地址
let musicUrl = 'https://bili.scdxtc.cn'

// 自动删除不说话用户
let autoDel = false
// 多少秒不说话删除
let speakExpireTime = 10*60
// 歌曲列表
var musicList = []

// 领舞人领舞时间 秒
let leaderTime = 15*60
// 何时添加镜头
var addJingTime = 2000;//2秒
// 事件列表-中文
let eventTextList = ['切歌', '跳', '向左', '向右', '左抖腿', '右抖腿', '抖动', '一起喊', '镜头']
// 领舞者喊的集体舞
let allEventList = ['切歌', '一起跳', '一起向左', '一起向右', '一起左抖腿', '一起右抖腿', '一起抖动', '一起喊', '镜头']
// 镜头列表
let list = ['scale-left', 'scale-right', 'scale-bottom-left', 'scale-bottom-right']
// 根据事件文字 获取事件名
function getEvent(name) {
    let map = {
        '切歌'  : 'change_song',
        '跳'  : 'dancing-down',
        '向左'  : 'dancing-left',
        '向右'  : 'dancing-right',
        '左抖腿' : 'dancing-wobble',
        '右抖腿' : 'dancing-wobble-right',
        '抖动'  : 'dancing-up',
        '一起喊' : 'all_shout',
        '镜头'  : scale()
    }

    return map[name] ? map[name] : ''
}

// 根据事件文字 获取领舞者事件名
function getLeaderEvent(name) {
    let map = {
        '切歌'  : 'change_song',
        '一起跳'  : 'dancing-down',
        '一起向左'  : 'dancing-left',
        '一起向右'  : 'dancing-right',
        '一起左抖腿' : 'dancing-wobble',
        '一起右抖腿' : 'dancing-wobble-right',
        '一起抖动'  : 'dancing-up',
        '一起喊' : 'all_shout',
        '镜头'  : scale()
    }

    return map[name] ? map[name] : ''
}

// 随机选择镜头
function scale() {
    return list[Math.floor(Math.random() * 3)];
}

// 字符串包含的事件 (仅取第一个)
function getFirstEventKeyword(name) {
    let event = ''
    $.each(eventTextList, function (index, item) {
        if (name.toString().indexOf(item) != -1) {
            event = item
            return false
        }
    })
    return event
}

// 设置领舞 name=姓名 time=有效期 单位秒
function setLeader(name, time) {
    sessionStorage.setItem('leader', name)
    sessionStorage.setItem('leader_end_at', (new Date).getTime()/1000 + time)
}

// 获取领舞人信息
function getLeader() {
    let res = []
    res['name'] = sessionStorage.getItem('leader') ? sessionStorage.getItem('leader') : ''
    res['time'] = sessionStorage.getItem('leader_end_at') ? sessionStorage.getItem('leader_end_at') : 0
    
    return res
}

function music() {
    $.get(musicUrl, function (res) {
        musicList = res
        if (musicList.length > 0) {
            $('#music source').attr('src', musicUrl+'/music/'+musicList[0])
        }
    })
}

// 切歌
function changeMusic() {
    $.get(musicUrl, function (res) {
        musicList = res
        if (musicList.length > 0) {
            let index = Math.floor(Math.random()*(musicList.length-1))
            $('#music').data('song', musicList[index])
            $('#music source').attr('src', musicUrl+'/music/'+musicList[index])
            $('#music')[0].load()
        }
    })
}
// 个人喊舞
function peopleHan(val){
	return eventTextList.includes(val);
}
// 领舞喊舞
function dancer(val){
	return allEventList.includes(val);
}

// 删除久未说话的人
function delExpireDiv() {
    if (!autoDel) {
        return false
    }

    let timestamp = parseInt(new Date().getTime()/1000)
    let delList = $(".dance-people").filter(function() {
        return  $(this).attr("data-time") < timestamp - speakExpireTime;
    })
    console.log(delList.length, speakExpireTime+'秒未说话人数')
    delList.remove();
}

// 接受消息处理
function receiveMessage(event)
{
    // console.log(event.data, '接受弹幕')
    // 我们能信任信息来源吗?
    if (event.origin !== "https://live.bilibili.com") {
    	return false
    }

    let dataList = JSON.parse(event.data)
    let data = dataList.dm
    // 目前硬编码大航海列表
    // let adminList = dataList.admin
	adminList = ['流域_墨绿绿'];

    if (data.length <= 0) {
        return false
    }

    // 当前直播间 自己的弹幕 无法获取到ct和type值  就暂时过滤
    if (data.ct === '') {
        return false
    }

    // 大航海列表
    if (adminList.length > 0) {
        // 获取当前领舞人
        let currentLeader = getLeader()
        let now = (new Date).getTime()/1000
        if (currentLeader['name'] === '') {
            setLeader(adminList[0], leaderTime)
        } else {
            //领舞人存在 检查过期时间
            if (currentLeader['time'] === 0 || currentLeader['time'] < now) {
                // 切换领舞

                // 当前领舞人
                let leaderIndex = adminList.indexOf(currentLeader['name'])
                let newLeader
                if (leaderIndex == -1) {
                    newLeader = adminList[0]
                } else {
                    let newIndex = leaderIndex + 1
                    if (newIndex >= adminList.length) {
                        newIndex = 0
                    }
                    newLeader = adminList[newIndex]
                }

                setLeader(newLeader, leaderTime)
            }
        }
    }

    // uid是否存在 不存在则存入uidObj
    let isNew = 0
	// console.log(uidObj[data.uid],'uidObj[data.uid]');
    let speakTime = uidObj[data.uid];
    if (!speakTime) {
        isNew = 1
    } else if (autoDel && speakTime < parseInt(new Date().getTime()/1000) - speakExpireTime){
        //存在 但是最近弹幕时间已在过期时间外。
        isNew = 1;
    }
    // 记录uid最近弹幕时间
    uidObj[data.uid] = data.ts

    // console.log(isNew, data.uname + ' 是否存在')

    // custom.js中 每条弹幕的处理 放到了此处
    // -------------------- 每条弹幕处理 begin -----------------------
    // 获取领舞信息
    let leaderInfo = sessionStorage.getItem('leader')

    let eventName = getEvent(data.danmaku)
    let isLeader = data.uname == leaderInfo ? 1 : 0
    let dm = {text: data.danmaku, uid: data.uid, uname: data.uname, 
        event: eventName, 
        is_new: isNew, is_admin: 0, is_leader: isLeader,active_time: data.ts}
    let leader = {
        uid: 0, uname: leaderInfo, text: '', event: ''
    }

    if (isLeader) {
        let leaderEvent = getLeaderEvent(dm.text)
        leader.uid = dm.uid
        leader.uname = dm.uname
        leader.text = dm.text
        leader.event = eventName ? eventName : leaderEvent
    }

	// 新用户
	if(dm.is_new==1){
		// if(dm.uname!=leader.uname){//如果弹幕的人的名字不等于领舞者的名字,就创建一个人物
			peopleObj(dm.uname,dm.uid,dm.text,dm.event,dm.active_time);
		// }
	} else {
		// 老用户
		$(`#${dm.uid} .speak`).html(dm.text);
        //更新最近时间
		$(`#${dm.uid}`).attr('data-time', dm.active_time);
		$(`#${dm.uid} .speak`).removeClass("dn");
		setTimeout(()=>{
			$(`#${dm.uid} .speak`).addClass("dn");
		},3000)
		// 舞者喊舞
		if(peopleHan(dm.text)){
			peopleAction(`${dm.uid}`,dm.event);
		}
	}
    num++;

    // console.log(Object.keys(uidObj).length, 'uid 长度')
    // console.log(uidObj, 'uid')
    // console.log(num, '人物渲染个数')
	// 显示领舞的昵称
    $('.lingname').text(leader.uname);
    if (!isLeader) {
        return false
    }
    // console.log(leader, '领舞人信息')

    if(leader.event=='scale-left' || leader.event=='scale-right' || leader.event=='scale-bottom-left' || leader.event=='scale-bottom-right'){
		// 领舞喊镜头
		list.forEach(item=>{
			var haveDan = $(`.ground-bg`).is(`.${item}`);
			// 如果之前有镜头,删除镜头
			if(haveDan) {
				$('.ground-bg').removeClass(item);
			}
		})
		// 各几秒重新添加镜头
		setTimeout(()=>{
			$('.ground-bg').addClass(leader.event);
		},addJingTime)
    } else {
		// 显示领舞说话
		if (leader.text.length>0) {
			$('.speak-pink').text(leader.text);
			$('.speak-pink').fadeIn();
			//关闭领舞说话
			setTimeout(()=>{
				$('.speak-pink').fadeOut();
			},3000) 
		}
		// 领舞说切歌
		if(leader.text=="切歌"){
			changeMusic();
		}
		// 领舞喊一起喊
		// leader.text.slice(0,3);
        if (leader.text.length >= 4) {
            if(leader.text.slice(0,4)=="一起喊:" || leader.text.slice(0,4)=="一起喊:"){
                allSay(leader.text.slice(4));
            }
        }
		
		// 领舞自己喊跳舞
		if(peopleHan(dm.text)){
			clearInterval(dancerTimer);
			dancerOwn(leader.event);
		}
		// 领舞喊集体跳舞
		if(dancer(leader.text)){
			allDancing(leader.event);
		}
    }
    // -------------------- 每条弹幕处理 end -----------------------
}

music();
window.addEventListener("message", receiveMessage, false);