
(function () {
	// 즐겨찾기 토글 저장
	function toggleFavorite(id) {
		id = String(id || "");
		var fav = (window.localStorage.getArray && window.localStorage.getArray("favorite")) || [];
		var idx = fav.indexOf(id);
		if (idx === -1) fav.push(id);
		else fav.splice(idx, 1);
		if (window.localStorage && window.localStorage.setArray) {
			window.localStorage.setArray("favorite", fav);
		}
		window.favoriteContact = fav;
	}

	// 화면 이벤트 바인딩
	function bindDelegates() {
		// 즐겨찾기 체크 토글
		$("#list_favorites, #list_all").off("change.addrFav").on("change.addrFav", ".fav input[type=checkbox]", function (e) {
			e.stopPropagation();
			var $li = $(this).closest("li");
			var id = String($li.data("id") || "");
			if (!id) return;

			// 저장 반영
			toggleFavorite(id);

			if (typeof printFavorites === "function") printFavorites();
			if (typeof printAddress === "function") printAddress();
		});

		// 통화 버튼 → 팝업 열기 요청
		$("#list_favorites, #list_all").off("click.addrCall").on("click.addrCall", "a.call", function (e) {
			e.preventDefault();
			var id = String($(this).data("id") || $(this).closest("li").data("id") || "");
			if (!id || !window.contactMap) return;
			var contact = window.contactMap[id];
			if (!contact) return;

			if (typeof window.showCallPopup === "function") {
				window.showCallPopup(contact); // 외부 팝업 열기 함수 (Main.js)
			}
		});
	}

	function bindAccordion() {
		$(".contact")
			.off("click.contactAccordion")
			.on("click.contactAccordion", ".accordion", function () {
				var $head = $(this);
				var $panel = $head.next(".accordion_panel");
				$head.toggleClass("open");
				$panel.stop(true, true).slideToggle(150);
			});
		$(".contact .accordion").addClass("open");
		$(".contact .accordion_panel").show();
	}

	$(function () {
		bindAccordion();
		bindDelegates();
	});

	// 주소록 검색
	$(document)
		.off('keyup.addrSearch click.addrSearch', '#inp_board_search_address, #btn_search_address')
		.on('keyup.addrSearch', '#inp_board_search_address', runAddressSearch)
		.on('click.addrSearch', '#btn_search_address', function () { runAddressSearch(); });

	function runAddressSearch() {

		var q = $.trim($('#inp_board_search_address').val() || '');

		var overMin = (typeof getByteLengthOfString === 'function')
			? (getByteLengthOfString(q) > 1)
			: (q.length > 1);

		if (!overMin) {
			if (typeof printFavorites === 'function') printFavorites();
			if (typeof printAddress === 'function') printAddress();
			return;
		}

		// 연락처/즐겨찾기 로드
		var contacts = window.localStorage.getArray('contact') || [];
		var favArr = window.localStorage.getArray('favorite') || [];
		var favSet = {};
		for (var i = 0; i < favArr.length; i++) favSet[String(favArr[i])] = true;

		// 유틸
		var qLower = q.toLowerCase();
		var qDigits = q.replace(/\D+/g, '');
		// function digits(s) { return String(s == null ? '' : s).replace(/\D+/g, ''); }
		function s(v) { return String(v == null ? '' : v); }
		function isHit(contact) {
			var name = s(contact.displayName).toLowerCase();
			var cho = s(contact.nameCho);
			if (name.indexOf(qLower) > -1) return true;
			if (cho && cho.indexOf(q) > -1) return true;
			if (!Array.isArray(contact.phoneNumbers)) return false;
			if (!qDigits) return false;
			for (var j = 0; j < contact.phoneNumbers.length; j++) {
				var p = contact.phoneNumbers[j] || {};
				if (gformatter.number(p.normalizedNumber || p.number).indexOf(qDigits) > -1) return true;
			}
			return false;
		}

		// 결과 컨테이너 비우기
		var $favList = $('#address_list_favorites').empty();
		var $allList = $('#address_list_all').empty();

		function appendItem($wrap, c, checked) {
			if (!Array.isArray(c.phoneNumbers) || !c.phoneNumbers.length) return;
			var p = c.phoneNumbers[0] || {};
			var numDisp = p.number || p.normalizedNumber || '';
			var inputId = 'fav_' + c.id + '_srch'; // label for 연결용 고유 id

			var $li = 	
				$(`<li data-id="${c.id}">		
					<div class="accordion_list">		
						<div class="fav">
							<input type="checkbox" id="${inputId}" class="favchk" ${checked ? 'checked' : ''}>
							<label for="${inputId}" class="favbtn" aria-label="즐겨찾기"></label>
						</div>		
						<div class="thumb" style="background-image:url('${getThumbImage(c.thumbnail)}')"></div>		
						<div class="who">
							<div class="name"></div>
							<div class="num"></div>
						</div>		
					</div>		
					<a href="javascript:" class="call" aria-label="통화"></a>		
				</li>`);
			$li.find('.name').text(c.displayName || '');
			$li.find('.num').text(numDisp || '');
			$li.attr('data-contact', JSON.stringify(c));
			$wrap.append($li);
		}

		for (var k = 0; k < contacts.length; k++) {
			var c = contacts[k]; if (!c || !c.displayName) continue;
			if (!isHit(c)) continue;

			var isFav = !!favSet[String(c.id || '')];
			// 즐겨찾기한 사람의 검색결과가 즐겨찾기, 전체목록 모두 표시
			appendItem($allList, c, isFav);
			if (isFav) appendItem($favList, c, true);

			// 즐겨찾기한 사람의 검색결과가 즐겨찾기에만 표시
			// isFav ? appendItem($favList, c, true) : appendItem($allList, c, false);
		}

		// 결과 없으면 원상복구
		if (!$favList.children().length && !$allList.children().length) {
			if (typeof printFavorites === 'function') printFavorites();
			if (typeof printAddress === 'function') printAddress();
		}
	}

	// 통화 버튼 공통 콜 팝업 열기
	$(document)
		.off('click.addrCall', '#address_list_favorites .call, #address_list_all .call')
		.on('click.addrCall', '#address_list_favorites .call, #address_list_all .call', function (e) {
			e.preventDefault();

			var $li = $(this).closest('li');
			var contact = $li.data('contact')||{};
			if (!contact) {
				try { contact = JSON.parse($li.attr('data-contact') || '{}'); } catch (err) { contact = null; }
			}
			if (!contact) return;

			var name = gformatter.string(contact.displayName);
			var phones = [];

			if (Array.isArray(contact.phoneNumbers)) {
				for (var i = 0; i < contact.phoneNumbers.length; i++) {
					var p = contact.phoneNumbers[i] || {};
					var raw = p.normalizedNumber || p.number || '';
					var clean = cleanPhoneNumber(raw);
					if (!clean) continue;

					var display = p.number || getKoreanNumber(clean) || clean;
					var type = p.type || '기타';

					phones.push({
						id: (contact.id != null ? String(contact.id) : '') + '_' + i,
						number: clean,
						display: display,
						type: type
					});
				}
			}

			// // 중복 번호 제거
			// var seen = {};
			// phones = phones.filter(function (n) {
			// 	if (seen[n.number]) return false;
			// 	seen[n.number] = true;
			// 	return true;
			// });

			// 공통 팝업 호출 (주소록은 내선이 아니므로 dialPrefix는 공란)
			openCallPopupByNumbers(name, phones, {
				callId: contact.id != null ? String(contact.id) : '',
				dialPrefix: ''
			});
		});

	// 스크롤 바닥 도달 시 다음 페이지 로딩
	$('.address_cont').bind('scroll', () => {
		// 검색 중이면 페이징 중단
		var searchQuery = $.trim($('#inp_board_search_address').val() || '');
		var hasEnoughSearchText = (typeof getByteLengthOfString === 'function')
			? (getByteLengthOfString(searchQuery) > 1)
			: (searchQuery.length > 1);
		if (hasEnoughSearchText) return;

		var $cont = $('.address_cont:visible').length ? $('.address_cont:visible').eq(0) : $('.address_cont').eq(0);
		if (!$cont.length || !$cont[0]) return;

		var renderedCount = $('#address_list_all > li').length;
		var pageSize = Number(window.address_pageinsize || 30);

		// 바닥 판정
		var el = $cont[0];
		var atBottom = (el.scrollTop + $cont.innerHeight()) >= (el.scrollHeight - 2);

		if (renderedCount >= pageSize && atBottom) {
			// 중복 호출 방지
			if (window.__addr_paging_lock) return;
			window.__addr_paging_lock = true;

			// 레이아웃 안정화 후 호출
			requestAnimationFrame(function () {
				drawAddressList(renderedCount);
				window.__addr_paging_lock = false;
			});
		}
	});

	// 초기 진입 시 첫 페이지만 렌더
	$(function () {
		function initialPageRender() {
			var searchQuery = $.trim($('#inp_board_search_address').val() || '');
			var hasEnoughSearchText = (typeof getByteLengthOfString === 'function')
				? (getByteLengthOfString(searchQuery) > 1)
				: (searchQuery.length > 1);

			if (!window.__patched_printAddress && typeof window.printAddress === 'function') {
				window.__patched_printAddress = true;
				window.__printAddress_original = window.printAddress;
				window.printAddress = function () {
					// 전체 렌더 대신 항상 첫 페이지만
					$('#address_list_all').empty();
					drawAddressList(0);
				};
			}

			if (!hasEnoughSearchText) {
				var rendered = $('#address_list_all > li').length;
				var pageSize = Number(window.address_pageinsize || 30);

				// 이미 페이지 사이즈로 렌더되어 있으면 건너뜀
				if (rendered === pageSize) return;

				// 비어있거나(=아직 미렌더), 잘못 전체가 그려졌다면 첫 페이지로 리셋
				if (!rendered || rendered > pageSize) {
					$('#address_list_all').empty();
					drawAddressList(0);
				}
			}
		}

		// 웹(즉시) + Cordova(deviceready 후)에서 모두 보장
		initialPageRender();
		document.addEventListener('deviceready', initialPageRender, { once: true });
	});

})();
