//TL取得
var websocket
function tl(data) {
	var tlid = 0
	if (websocket) {
		websocket.close()
	}
	var acct_id = $('#post-acct-sel').val()
	var type = $('#type-sel').val()
	var domain = localStorage.getItem('domain_' + acct_id)
	//タグの場合はカラム追加して描画
	if (!type) {
		//デフォルト
		var type = 'local'
	}
	var at = localStorage.getItem('acct_' + acct_id + '_at')
	$('#notice_nano').text(
		cap(type, data) + ' TL(' + localStorage.getItem('user_' + acct_id) + '@' + domain + ')'
	)
	var start = 'https://' + domain + '/api/v1/timelines/' + com(type, data)
	fetch(start, {
		method: 'GET',
		headers: {
			'content-type': 'application/json',
			Authorization: 'Bearer ' + at
		}
	})
		.then(function(response) {
			if (!response.ok) {
				response.text().then(function(text) {
					setLog(response.url, response.status, text)
				})
			}
			return response.json()
		})
		.catch(function(error) {
			console.error(error)
		})
		.then(function(json) {
			var templete = parse([json[0]], '', acct_id, tlid)
			$('#timeline_nano').html(templete)
			jQuery('time.timeago').timeago()
			$('#menu').addClass('hide')
		})
	//Streaming接続
	var tlid = 0
	if (type == 'home') {
		var start = 'wss://' + domain + '/api/v1/streaming/?stream=user&access_token=' + at
	} else if (type == 'pub') {
		var start = 'wss://' + domain + '/api/v1/streaming/?stream=public&access_token=' + at
	} else if (type == 'local') {
		var start = 'wss://' + domain + '/api/v1/streaming/?stream=public:local&access_token=' + at
	} else if (type == 'tag') {
		var start =
			'wss://' + domain + '/api/v1/streaming/?stream=hashtag&tag=' + data + '&access_token=' + at
	}
	websocket = new WebSocket(start)
	websocket.onopen = function(mess) {
		$('#notice_icon_' + tlid).removeClass('red-text')
	}
	websocket.onmessage = function(mess) {
		var typeA = JSON.parse(mess.data).event
		if (typeA == 'update') {
			var obj = JSON.parse(JSON.parse(mess.data).payload)
			var templete = parse([obj], '', acct_id, tlid)
			jQuery('time.timeago').timeago()
			$('#timeline_nano').html(templete)
		}
	}
	websocket.onerror = function(error) {
		console.error('WebSocket Error ' + error)
	}
	websocket.onclose = function(mess) {
		console.error('Close Streaming API:' + type)
	}
}
//TLのタイトル
function cap(type, data) {
	if (type == 'home') {
		return 'Home'
	} else if (type == 'local') {
		return 'Local'
	} else if (type == 'pub') {
		return 'Public'
	} else if (type == 'tag') {
		return '#' + data
	} else if (type == 'list') {
		return 'List(id:' + data + ')'
	} else if (type == 'notf') {
		return 'Notification'
	}
}

//TLのURL
function com(type, data) {
	if (type == 'home') {
		return 'home?'
	} else if (type == 'local') {
		return 'public?local=true&'
	} else if (type == 'pub') {
		return 'public?'
	} else if (type == 'tag') {
		return 'tag/' + data + '?'
	}
	if (type == 'list') {
		return 'list/' + data + '?'
	}
}

//TLのアイコン
function icon(type) {
	if (type == 'home') {
		return 'home'
	} else if (type == 'local') {
		return 'people_outline'
	} else if (type == 'pub') {
		return 'language'
	} else if (type == 'tag') {
		return 'search'
	}
	if (type == 'list') {
		return 'subject'
	}
}
function todo() {}
function todc() {}
function hide() {}
$(function($) {
	//キーボードショートカット
	$(window).keydown(function(e) {
		var hasFocus = $('input').is(':focus')
		var hasFocus2 = $('textarea').is(':focus')
		//Ctrl+Enter:投稿
		if (event.ctrlKey) {
			if (e.keyCode === 13) {
				post()
				return false
			}
		}
	})
})
function set() {
	$('#menu').toggleClass('hide')
	if ($('#menu').hasClass('hide')) {
		$('#setting').text('Setting')
	} else {
		$('#setting').text('Close')
	}
}

var multi = localStorage.getItem('multi')
if (!multi) {
	var obj = [
		{
			at: localStorage.getItem(localStorage.getItem('domain_' + acct_id) + '_at'),
			name: localStorage.getItem('name_' + acct_id),
			domain: localStorage.getItem('domain_' + acct_id),
			user: localStorage.getItem('user_' + acct_id),
			prof: localStorage.getItem('prof_' + acct_id)
		}
	]
	var json = JSON.stringify(obj)
	localStorage.setItem('multi', json)
} else {
	var obj = JSON.parse(multi)
}
var templete
var last = localStorage.getItem('last-use')
var sel
Object.keys(obj).forEach(function(key) {
	var acct = obj[key]
	var list = key * 1 + 1
	if (key == last) {
		sel = 'selected'
	} else {
		sel = ''
	}
	templete = `<option value="${key}" ${sel}>${acct.user}@${acct.domain}</option>`
	$('#post-acct-sel').append(templete)
})
function mov() {
	return false
}
function resetmv() {
	return false
}
function post() {
	var acct_id = $('#post-acct-sel').val()
	var domain = localStorage.getItem('domain_' + acct_id)
	var at = localStorage.getItem('acct_' + acct_id + '_at')
	var start = 'https://' + domain + '/api/v1/statuses'
	var str = $('#textarea').val()
	var toot = {
		status: str
	}
	var vis = loadVis(acct_id)
	toot.visibility = vis
	var httpreq = new XMLHttpRequest()
	httpreq.open('POST', start, true)
	httpreq.setRequestHeader('Content-Type', 'application/json')
	httpreq.setRequestHeader('Authorization', 'Bearer ' + at)
	httpreq.responseType = 'json'
	httpreq.send(JSON.stringify(toot))
	httpreq.onreadystatechange = function() {
		if (httpreq.readyState === 4) {
			if (this.status !== 200) {
				setLog(start, this.status, this.response)
			}
			$('#textarea').val('')
		}
	}
}
function loadVis(acct_id) {
	var vist = localStorage.getItem('vis')
	if (!vist) {
		return 'public'
	} else {
		if (vist == 'memory') {
			var memory = localStorage.getItem('vis-memory-' + acct_id)
			if (!memory) {
				memory = 'public'
			}
			return memory
		} else if (vist == 'server' || vist == 'useapi') {
			var multi = localStorage.getItem('multi')
			var obj = JSON.parse(multi)
			var memory = obj[acct_id]['vis']
			if (!memory) {
				memory = 'public'
			}
			return memory
		} else {
			return vist
		}
	}
}
function loader() {
	var acct_id = $('#post-acct-sel').val()
	console.log(loadVis(acct_id))
	$('#vis-sel').val(loadVis(acct_id))
}
loader()
$('textarea').height(15) //init
$('textarea').css('lineHeight', '1rem') //init

$('textarea').on('input', function(evt) {
	if (evt.target.scrollHeight > evt.target.offsetHeight) {
		$(evt.target).height(evt.target.scrollHeight)
	} else {
		var lineHeight = Number(
			$(evt.target)
				.css('lineHeight')
				.split('px')[0]
		)
		while (true) {
			$(evt.target).height($(evt.target).height() - lineHeight)
			if (evt.target.scrollHeight > evt.target.offsetHeight) {
				$(evt.target).height(evt.target.scrollHeight)
				break
			}
		}
	}
})
