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

// ios用
var iosKey = "objc-processing";
function watchValue(obj, propName, func) {
    let value = obj[propName];
    Object.defineProperty(obj, propName, {
        get: () => value,
        set: newValue => {
            const oldValue = value;
            value = newValue;
            func(oldValue, newValue);
        },
        configurable: true
    });
}

const iosData = {
    iosRoomList: "",
    iosMyInfo: "",
    iosMessages: "",
    iosFavoriteUsers: "",
    iosFavoriteGroups: "",
    iosMyGroupUsers: "",
    iosGroupInfo: "",
    iosNameCardData: "",
    iosMyGroupShopMemberByName: "",
    iosAllGroupShopMemberByName: "",
    iosGroupByName: "",
    iosUsersInRoom: "",
    iosArchiveList: "",
    iosSearchArchiveList: "",
    iosArchiveDetail: ""
};

function onChange(v1, v2) {
    console.log(v1);
    console.log(' =>', v2);
    console.log('');
};

Object.getOwnPropertyNames(iosData).forEach(propName => watchValue(iosData, propName, onChange));

iosData.iosRoomList = "roomList";



//ロカールDBからルーム一覧情報を取得
CHAT_DB.getRoomList = function(roomType, keyWord) {
    if (CHAT_UTIL.isIOS()) {
        return JSON.parse(iosRoomList);        
    } else if (CHAT_UTIL.isAndroid()) {
    	return JSON.parse(android.getRoomList(roomType, keyWord));
    }
};

CHAT_DB.callGetRoomList = function(roomType) {
    if (CHAT_UTIL.isIOS()) {
        webkit.messageHandlers.getRoomList.postMessage({roomType});
        // TODO: iosからデータを受け取るまで待つ
        return JSON.parse(iosRoomList);
    } else if (CHAT_UTIL.isAndroid()) {
        //String形式をJsonに変更してReturn
    	return JSON.parse(android.getRoomList(roomType));
    }
}

CHAT_DB.getIosRoomList = function(roomList) {
	iosRoomList = roomList;
};



//ロカールDBからログインしたユーザのデータを取得する。
CHAT_DB.getMyInfo = function() {
    if (CHAT_UTIL.isIOS()) {
        iosMyInfo = "";
        webkit.messageHandlers.getMyInfo.postMessage();
        // JavascriptからObjective-cのメソッドを指定してコールバックを受ける方法がないため、
        // 値が入るまで待たせている。値の変更を検知してreturn。
        return watchValue(iosMyInfo);
    } else if (CHAT_UTIL.isAndroid()) {
        //String形式をJsonに変更してReturn
    	return JSON.parse(android.getMyInfo());
    }
};

CHAT_DB.getIosMyInfo = function(myInfo) {
    iosMyInfo = myInfo;
    iosKey = "myInfo";
};

CHAT_DB.getMessages = function(roomId) {
    if (CHAT_UTIL.isIOS()) {
        iosMessages = "";
        webkit.messageHandlers.getMessages.postMessage({roomId});
        // JavascriptからObjective-cのメソッドを指定してコールバックを受ける方法がないため、
        // 値が入るまで待たせている。
        while (iosKey == "objc-processing") {};
        if (iosKey == "messages") {
            iosKey = "objc-processing";
            return JSON.parse(iosMessages);
        }
    } else if (CHAT_UTIL.isAndroid()) {
        //String形式をJsonに変更してReturn
    	return JSON.parse(android.getMessageList(roomId));
    }
};

CHAT_DB.getIosMessages = function(messages) {
    iosMessages = messages;
    iosKey = "messages";
};

CHAT_DB.getFavoriteUsers = function() {
    if (CHAT_UTIL.isIOS()) {
        iosFavoriteUsers = "";
        webkit.messageHandlers.getFavoriteUsers.postMessage();
        // JavascriptからObjective-cのメソッドを指定してコールバックを受ける方法がないため、
        // 値が入るまで待たせている。
        while (iosKey == "objc-processing") {};
        if (iosKey == "favoriteUsers") {
            iosKey = "objc-processing";
            return JSON.parse(iosFavoriteUsers);
        }
    } else if (CHAT_UTIL.isAndroid()) {
        //String形式をJsonに変更してReturn
    	return JSON.parse(android.getFavoriteUsers());
    }
};

CHAT_DB.getIosFavoriteUsers = function(user) {
    iosFavoriteUsers = user;
    iosKey = "favoriteUsers";
};

CHAT_DB.getFavoriteGroups = function() {
    if (CHAT_UTIL.isIOS()) {
        iosFavoriteGroups = "";
        webkit.messageHandlers.getFavoriteGroups.postMessage();
        // JavascriptからObjective-cのメソッドを指定してコールバックを受ける方法がないため、
        // 値が入るまで待たせている。
        while (iosKey == "objc-processing") {};
        if (iosKey == "favoriteGroups") {
            iosKey = "objc-processing";
            return JSON.parse(iosFavoriteGroups);
        }
    } else if (CHAT_UTIL.isAndroid()) {
        //String形式をJsonに変更してReturn
    	return JSON.parse(android.getFavoriteGroups());
    }
};

CHAT_DB.getIosFavoriteGroups = function(groups) {
    iosFavoriteGroups = groups;
    iosKey = "favoriteGroups";
};

CHAT_DB.getMyGroupUsers = function() {
    if (CHAT_UTIL.isIOS()) {
        iosMyGroupUsers = "";
        webkit.messageHandlers.getMyGroupUsers.postMessage();
        // JavascriptからObjective-cのメソッドを指定してコールバックを受ける方法がないため、
        // 値が入るまで待たせている。
        while (iosKey == "objc-processing") {};
        if (iosKey == "myGroupUsers") {
            iosKey = "objc-processing";
            return JSON.parse(iosMyGroupUsers);
        }
    } else if (CHAT_UTIL.isAndroid()) {
        //String形式をJsonに変更してReturn
    	return JSON.parse(android.getMyGroupUsers());
    }
};

CHAT_DB.getIosMyGroupUsers = function(user) {
    iosMyGroupUsers = user;
    iosKey = "myGroupUsers";
};

CHAT_DB.getGroupInfo = function(groupId) {
    if (CHAT_UTIL.isIOS()) {
        iosGroupInfo = "";
        webkit.messageHandlers.getGroupInfo.postMessage({groupId});
        // JavascriptからObjective-cのメソッドを指定してコールバックを受ける方法がないため、
        // 値が入るまで待たせている。
        while (iosKey == "objc-processing") {};
        if (iosKey == "groupInfo") {
            iosKey = "objc-processing";
            return JSON.parse(iosGroupInfo);
        }
    } else if (CHAT_UTIL.isAndroid()) {
        //String形式をJsonに変更してReturn
    	return JSON.parse(android.getGroupInfo(groupId));
    }
};

CHAT_DB.getIosGroupInfo = function(info) {
    iosGroupInfo = info;
    iosKey = "groupInfo";
};

CHAT_DB.getNameCardData = function(shopMemberId) {
    if (CHAT_UTIL.isIOS()) {
        iosNameCardData = "";
        webkit.messageHandlers.getNameCardData.postMessage({shopMemberId});
        // JavascriptからObjective-cのメソッドを指定してコールバックを受ける方法がないため、
        // 値が入るまで待たせている。
        while (iosKey == "objc-processing") {};
        if (iosKey == "nameCardData") {
            iosKey = "objc-processing";
            return JSON.parse(iosNameCardData);
        }
    } else if (CHAT_UTIL.isAndroid()) {
    	return JSON.parse(android.getNameCardData(shopMemberId));
    }
};

CHAT_DB.getIosNameCardData = function(nameCard) {
    iosNameCardData = nameCard;
    iosKey = "nameCardData";
};

CHAT_DB.getMyGroupShopMemberByName = function(shopMemberName) {
    if (CHAT_UTIL.isIOS()) {
        iosMyGroupShopMemberByName = "";
        webkit.messageHandlers.getMyGroupShopMemberByName.postMessage({shopMemberName});
        // JavascriptからObjective-cのメソッドを指定してコールバックを受ける方法がないため、
        // 値が入るまで待たせている。
        while (iosKey == "objc-processing") {};
        if (iosKey == "myGroupShopMemberByName") {
            iosKey = "objc-processing";
            return JSON.parse(iosMyGroupShopMemberByName);
        }
    } else if (CHAT_UTIL.isAndroid()) {
        //String形式をJsonに変更してReturn
    	return JSON.parse(android.getMyGroupShopMemberByName(shopMemberName));
    }
};

CHAT_DB.getIosMyGroupShopMemberByName = function(user) {
    iosMyGroupShopMemberByName = user;
    iosKey = "myGroupShopMemberByName";
};

CHAT_DB.getAllGroupShopMemberByName = function(shopMemberName) {
    if (CHAT_UTIL.isIOS()) {
        iosAllGroupShopMemberByName = "";
        webkit.messageHandlers.getAllGroupShopMemberByName.postMessage({shopMemberName});
        // JavascriptからObjective-cのメソッドを指定してコールバックを受ける方法がないため、
        // 値が入るまで待たせている。
        while (iosKey == "objc-processing") {};
        if (iosKey == "allGroupShopMemberByName") {
            iosKey = "objc-processing";
            return JSON.parse(iosAllGroupShopMemberByName);
        }
    } else if (CHAT_UTIL.isAndroid()) {
        //String形式をJsonに変更してReturn
    	return JSON.parse(android.getAllGroupShopMemberByName(shopMemberName));
    }
};

CHAT_DB.getIosAllGroupShopMemberByName = function(user) {
    iosAllGroupShopMemberByName = user;
    iosKey = "allGroupShopMemberByName";
};

CHAT_DB.getGroupByName = function(groupName) {
    if (CHAT_UTIL.isIOS()) {
        iosGroupByName = "";
        webkit.messageHandlers.getGroupByName.postMessage({groupName});
        // JavascriptからObjective-cのメソッドを指定してコールバックを受ける方法がないため、
        // 値が入るまで待たせている。
        while (iosKey == "objc-processing") {};
        if (iosKey == "groupByName") {
            iosKey = "objc-processing";
            return JSON.parse(iosGroupByName);
        }
    } else if (CHAT_UTIL.isAndroid()) {
        //String形式をJsonに変更してReturn
    	return JSON.parse(android.getGroupByName(groupName));
    }
};

CHAT_DB.getIosGroupByName = function(group) {
    iosGroupByName = group;
    iosKey = "groupByName";
};

CHAT_DB.getUsersInRoom = function(roomId) {
    if (CHAT_UTIL.isIOS()) {
        iosUsersInRoom = "";
        webkit.messageHandlers.getUsersInRoom.postMessage({roomId});
        // JavascriptからObjective-cのメソッドを指定してコールバックを受ける方法がないため、
        // 値が入るまで待たせている。
        while (iosKey == "objc-processing") {};
        if (iosKey == "usersInRoom") {
            iosKey = "objc-processing";
            return JSON.parse(iosUsersInRoom);
        }
    } else if (CHAT_UTIL.isAndroid()) {
        //String形式をJsonに変更してReturn
    	return JSON.parse(android.getUsersInRoom(roomId));
    }
}

CHAT_DB.getIosUsersInRoom = function(user) {
    iosUsersInRoom = user;
    iosKey = "usersInRoom";
};

// アーカイブ一覧
CHAT_DB.getArchiveList = function() {
    if (CHAT_UTIL.isIOS()) {
        iosArchiveList = "";
        webkit.messageHandlers.getArchiveList.postMessage();
        // JavascriptからObjective-cのメソッドを指定してコールバックを受ける方法がないため、
        // 値が入るまで待たせている。
        while (iosKey == "objc-processing") {};
        if (iosKey == "archiveList") {
            iosKey = "objc-processing";
            return JSON.parse(iosArchiveList);
        }
    } else if (CHAT_UTIL.isAndroid()) {
        // TODO
    }
};

CHAT_DB.getIosArchiveList = function(archiveList) {
    iosArchiveList = archiveList;
    iosKey = "archiveList";
};

CHAT_DB.updateArchiveList = function() {
    if (CHAT_UTIL.isIOS()) {
        webkit.messageHandlers.updateArchiveList.postMessage();
    } else if (CHAT_UTIL.isAndroid()) {
        // TODO
    }
};

// アーカイブ一覧検索
CHAT_DB.getArchiveByName = function(archiveName) {
    if (CHAT_UTIL.isIOS()) {
        iosSearchArchiveList = "";
        webkit.messageHandlers.getArchiveByName.postMessage({archiveName});
        // JavascriptからObjective-cのメソッドを指定してコールバックを受ける方法がないため、
        // 値が入るまで待たせている。
        while (iosKey == "objc-processing") {};
        if (iosKey == "searchArchiveList") {
            iosKey = "objc-processing";
            return JSON.parse(iosSearchArchiveList);
        }
    } else if (CHAT_UTIL.isAndroid()) {
        // TODO
    }
};

CHAT_DB.getIosSearchArchiveList = function(archiveList) {
    iosSearchArchiveList = archiveList;
    iosKey = "searchArchiveList";
};

// アーカイブ詳細
CHAT_DB.getArchiveDetail = function(archiveId) {
    if (CHAT_UTIL.isIOS()) {
        iosArchiveDetail = "";
        webkit.messageHandlers.getArchiveDetail.postMessage({archiveId});
        // JavascriptからObjective-cのメソッドを指定してコールバックを受ける方法がないため、
        // 値が入るまで待たせている。
        while (iosKey == "objc-processing") {};
        if (iosKey == "archiveDetail") {
            iosKey = "objc-processing";
            return JSON.parse(iosArchiveDetail);
        }
    } else if (CHAT_UTIL.isAndroid()) {
        // TODO
    }
};

CHAT_DB.getIosArchiveDetail = function(archiveDetail) {
    iosArchiveDetail = archiveDetail;
    iosKey = "archiveDetail";
};

CHAT_DB.updateArchiveDetail = function(archiveId) {
    if (CHAT_UTIL.isIOS()) {
        webkit.messageHandlers.updateArchiveDetail.postMessage({archiveId});
    } else if (CHAT_UTIL.isAndroid()) {
        // TODO
    }
};
