// 名前空間
var CHAT = {};

//招待するメンバーを保存する変数
CHAT.globalSelectedUserList = new Array();
CHAT.globalIsInvite = false;

//ログイン中の部屋情報を保存する変数
CHAT.globalLoginParameter;

CHAT.saveRoomInfo = function(roomId, roomName) {
	CHAT.globalLoginParameter.roomId = roomId;
	CHAT.globalLoginParameter.roomName = roomName;
	if (CHAT_UTIL.isIOS()) {
		webkit.messageHandlers.roomInfosaveMessageHandlerId.postMessage({"roomId":roomId, "roomName":roomName});
	} else if (CHAT_UTIL.isAndroid()) {
		if (roomId == undefined && roomName == undefined) {
			android.saveVisitRoomInfo('', '');
		} else {
			android.saveVisitRoomInfo(roomId, roomName);
		}
	}
}

// #36170 画像パスが存在しない場合はデフォルトの画像を返す
// 存在する場合はプロフィール画像取得用APIのURLを生成して返す
CHAT.getProfileImgUrl = function(path) {
	if(path == undefined || path == "") {
		return ASSET_PATH + 'images/user-profile.png';
	} else {
		var userInfo = path.split("/").reverse();
		return CMS_SERVER_URL + '/file/getProfileImage?profileFileName=' + userInfo[0] + '&profileGetLoginId=' + userInfo[1];
	}
}

// Video のサムネイルファイル生成する
CHAT.createVideoThumbnailAndUpload = function(sourceImage, callback) {
	var fileReader = new FileReader();

	fileReader.onload = function() {
		var blob = new Blob([fileReader.result], {type: sourceImage.type});
		var url = URL.createObjectURL(blob);
		var video = document.createElement('video');
		var timeupdate = function() {
			if (snapImage()) {
				video.removeEventListener('timeupdate', timeupdate);
				video.pause();
			}
		};
		video.addEventListener('loadeddata', function() {
			if (snapImage()) {
				video.removeEventListener('timeupdate', timeupdate);
			}
		});
		var snapImage = function() {
			var canvas = document.createElement('canvas');
			canvas.width = video.videoWidth;
			canvas.height = video.videoHeight;
			canvas.getContext('2d').drawImage(video, 0, 0, canvas.width, canvas.height);

			fetch(canvas.toDataURL("image/jpeg"))
				.then(function(res){
					return res.arrayBuffer();
				})
				.then(function(buf){
					// 回転された画像をFormDataに保存
					const newFile = new File([buf], sourceImage.name, {type:"image/jpeg"});
					callback(newFile, true);
					// ajax End
				}).catch((error) => { // fetch Error catch Block
						if(error) {
							console.log(error)
						}
				});
			return true;
		};
		video.addEventListener('timeupdate', timeupdate);
		video.preload = 'metadata';
		video.src = url;
		// Load video in Safari / IE11
		video.muted = true;
		video.playsInline = true;
		video.play();
	};
	fileReader.readAsArrayBuffer(sourceImage);
}

// Ajaxでイメージをアップロードする
CHAT.uploadImage = function(formData) {
	formData.append('roomId', CHAT.globalLoginParameter.roomId);
	jQuery.ajax({
		async: true,
		url:	CMS_SERVER_URL+"/file/upload",
		type: "post",
		data: formData,
		contentType: false,
		processData: false
	}).done(function( res ){
		// 8
		var imgPath = CMS_SERVER_URL + '/file/getImage?fileName=' + res.fileName + '&roomId=' + CHAT.globalLoginParameter.roomId;
		var imageName = res.fileName

		// uploadFileの判断
		var extension = imageName.substr(imageName.lastIndexOf('.') + 1).toLowerCase();

		// 画像の処理
		if (res.fileType == "jpeg" || res.fileType == "jpg" || res.fileType == "png") {
			if(res.thumbnailPath && res.thumbnailPath.length > 0) {
				imgPath = CMS_SERVER_URL + '/file/getImage?fileName=' + res.thumbImageFileName + '&roomId=' + CHAT.globalLoginParameter.roomId;
				imageName = res.thumbImageFileName;
			}

			let downloadPath = CMS_SERVER_URL + '/file/download?fileName=' + imageName + '&roomId=' + CHAT.globalLoginParameter.roomId;
			// アップロードが終了した後ローディング画面から離れてメッセージをメッセージを転送する
			const lightbox = jQuery('<a/>',{href:imgPath, 'data-lightbox':'attachedImages','data-title':imageName});
			const image = jQuery('<img/>',{src:imgPath, width:'auto',style:'max-width:100%'});
			const downloadIcon = jQuery('<a/>',{href:downloadPath, class:'fa fa-download', download:res.fileName});

			lightbox.append(image);
			lightbox.append(downloadIcon);
			let text = lightbox.prop('outerHTML')
			let encodedText
			try {
				encodedText = encodeURIComponent(text)
			} catch(e) {
				encodedText = text;
			}

			socket.emit('createMessage', {
				text: encodedText
			}, 1);

		} else {	// 動画の処理
			if (res.thumbnailPath && res.thumbnailPath.length > 0) {
				imgPath = CMS_SERVER_URL + '/file/getImage?fileName=' + res.thumbImageFileName + '&roomId=' + CHAT.globalLoginParameter.roomId;
			}

			let downloadPath = CMS_SERVER_URL + '/file/download?fileName=' + imageName + '&roomId=' + CHAT.globalLoginParameter.roomId;
			const aTag = jQuery('<a/>', {id:"attachedImages"})
			const image = jQuery('<img/>',{src:imgPath, width:'auto',style:'max-width:100%'});
			const downloadIcon = jQuery('<a/>',{href:downloadPath, class:'fa fa-download', download:res.fileName});

			aTag.append(image);
			aTag.append(downloadIcon);

			let text = aTag.prop('outerHTML');
			let encodedText
			try {
				encodedText = encodeURIComponent(text)
			} catch(e) {
				encodedText = text;
			}

			socket.emit('createMessage', {
				text: encodedText
			}, 1);
		}

		jQuery('.overlay').removeClass('active undismissable');
		jQuery('.loader').removeClass('active');
		CHAT_UI.dismissLoadingIndicator();
	})
}

// Thumbnailのファイルを生成する。
CHAT.createThumbnailAndUpload = function(sourceImage, callback) {
	const fileReader = new FileReader();
	const img = new Image();
	fileReader.onloadend = function(){
			img.src = fileReader.result
	}

	img.onload = function() {
		const elem = document.createElement('canvas');
		var rate
		var width = img.width
		var height = img.height
		if((img.width <= 500) && (img.height <= 500))
		{
			callback(undefined, false)
			return
		}

		if(img.width > img.height)
		{
			rate = 500/img.width
		} else {
			rate = 500/img.height
		}
		elem.width = width * rate;
		elem.height = height * rate;

		const ctx = elem.getContext('2d')

		ctx.drawImage(img, 0, 0, img.width, img.height, 0, 0, elem.width, elem.height);
		// ctx.drawImage(img, 0, 0, width, height);

		fetch(elem.toDataURL("image/jpeg"))
		.then(function(res){
			return res.arrayBuffer();
		})
		.then(function(buf){
			const newFile = new File([buf], sourceImage.name, {type:"image/jpeg"});

			callback(newFile, true)

		}).catch((error) => { // fetch Error catch Block
				if(error) {
					console.log(error)
				}
		});
	}

	fileReader.readAsDataURL(sourceImage);
}

// 該当チャットルームに参加するためログイン情報をサーバに渡す
getLoginParameter = function(sid, loginId, shopName, roomId = undefined, roomName = undefined, languageCode) {
	var loginParam = new Object()
	loginParam.sid = sid;
	loginParam.loginId = loginId;
	loginParam.shopName = shopName;
	loginParam.roomId = roomId;
	loginParam.roomName = roomName;

	CHAT.globalLoginParameter = loginParam;

	if(!languageCode) {
		languageCode = "en"
	}
	CHAT_UI.htmlElementTextInitialize(languageCode)

	socket.emit('join', loginParam, function (err) {
		if (err) {
			// #36174
			$("#customAlertTitle").text(err);
			$("#customAlertOk").text(getLocalizedString("yesTitle"));

			$('#customAlert').appendTo("body").modal({
				backdrop: 'static',
				keyboard: false
			})
			.on('click', '#customAlertOk', function(e) {
			});

		} else {
			console.log('No error');
			if (loginParam.roomName != undefined && loginParam.roomName != "null") {
				jQuery('.titleRoomName').text(loginParam.roomName).data('roomName', loginParam.roomName);
			} else {
				// 設定されていたroomNameがない場合
				let roomListTitle = getLocalizedString("roomListTitle")
				jQuery('.titleRoomName').text(roomListTitle).data('roomName', roomListTitle);
			}
		}
		// loadingIndicatorを表示しない
		CHAT_UI.dismissLoadingIndicator();
	});
}

CHAT.leaveRoom = function() {
	socket.emit('leaveRoom', function() {
	});
}