import time
import re
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys

def clean_str(text):
    if not text: return ""
    return re.sub(r'[^a-zA-Z0-9가-힣]', '', str(text)).lower()

def verify_apartment(driver, comp_name, group_items, clean_realtor):
    print(f"\n🏢 [아파트] '{comp_name}' 접속 및 검색 중...")
    
    core_realtor = clean_realtor.replace("공인중개사", "").replace("사무소", "").replace("부동산", "").replace("중개법인", "").strip()
    if not core_realtor: core_realtor = clean_realtor
    
    sido = group_items[0].get('parsed_sido', '')
    sigungu = group_items[0].get('parsed_sigungu', '')
    dong = group_items[0].get('parsed_dong', '')
    location_str = f"{sido} {sigungu} {dong}".strip()
    
    try:
        driver.get("https://new.land.naver.com/")
        time.sleep(0.3)
        
        fake_search_btn = WebDriverWait(driver, 5).until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".search_area .button_capsule")))
        fake_search_btn.click()
        time.sleep(0.3)
        
        search_input = WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.ID, "land_search")))
        search_input.clear()
        search_input.send_keys(comp_name)
        time.sleep(0.3)
        search_input.send_keys(Keys.ENTER)
        time.sleep(0.3) 
        
        search_items = driver.find_elements(By.CSS_SELECTOR, ".search_panel .item_list--search .item")
        if search_items and any(item.is_displayed() for item in search_items):
            print("   🔎 여러 단지가 검색되었습니다. 주소를 대조하여 정확한 단지를 선택합니다...")
            matched = False
            for s_item in search_items:
                try:
                    if not s_item.is_displayed(): continue
                    title = s_item.find_element(By.CSS_SELECTOR, ".title").text.strip()
                    addr = s_item.find_element(By.CSS_SELECTOR, ".address").text.strip()
                    
                    if title == comp_name and location_str in addr:
                        print(f"      ✅ 정확한 단지 발견: {title} ({addr})")
                        s_item.find_element(By.CSS_SELECTOR, ".item_link").click()
                        time.sleep(0.3) 
                        matched = True
                        break 
                except: continue
            if not matched:
                print(f"      ⚠️ '{comp_name}' / '{location_str}' 조건에 일치하는 단지가 없습니다.")
                return
        else:
            print("   ✅ 단일 검색 결과: 바로 매물 목록으로 진입했습니다.")

        try:
            WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.CSS_SELECTOR, ".list_panel")))
            print("   ✅ 매물 목록 패널 진입 성공")
        except: return

        try:
            checkbox = WebDriverWait(driver, 3).until(EC.presence_of_element_located((By.ID, "address_group2")))
            if not checkbox.is_selected():
                label = driver.find_element(By.CSS_SELECTOR, "label[for='address_group2']")
                driver.execute_script("arguments[0].click();", label) 
                time.sleep(0.3) 
        except: pass
        
        target_ids = [str(i.get('naver_id')) for i in group_items]
        found_ids = set()
        
        target_criteria = []
        for my_item in group_items:
            t_dong = clean_str(my_item.get('parsed_dong_num', ''))
            t_trade = clean_str("월세" if "월세" in my_item.get('trade_type', '') else "매매" if "매매" in my_item.get('trade_type', '') else "전세")
            target_criteria.append((t_dong, t_trade))

        print(f"   ⬇️ 실시간 수색 및 스크롤 시작... (타겟: {len(target_ids)}개)")
        last_count = 0
        retries = 0
        
        while retries < 5:
            current_items = driver.find_elements(By.CSS_SELECTOR, "#articleListArea > .item:not(.item--child):not(.is-loading):not([data-checked='true'])")
            
            for item in current_items:
                try:
                    driver.execute_script("arguments[0].setAttribute('data-checked', 'true');", item)
                    driver.execute_script("arguments[0].scrollIntoView({block: 'center'});", item)
                    time.sleep(0.3)
                    
                    full_text = clean_str(item.get_attribute("textContent"))
                    is_grouped = len(item.find_elements(By.CSS_SELECTOR, ".label--multicp")) > 0
                    
                    trade_matched = any(c_trade in full_text for _, c_trade in target_criteria)
                    dong_matched = any(not c_dong or c_dong in full_text for c_dong, _ in target_criteria)
                    
                    if not is_grouped:
                        if not (trade_matched and dong_matched): continue
                        if core_realtor not in full_text: continue
                        
                        old_id = ""
                        try: old_id = driver.find_element(By.XPATH, "//th[contains(text(), '매물번호')]/following-sibling::td").text.strip()
                        except: pass
                        
                        link = item.find_element(By.CSS_SELECTOR, ".item_link")
                        driver.execute_script("arguments[0].click();", link)
                        
                        try:
                            WebDriverWait(driver, 3).until(lambda d: d.find_element(By.XPATH, "//th[contains(text(), '매물번호')]/following-sibling::td").text.strip() not in [old_id, ""])
                            c_id = driver.find_element(By.XPATH, "//th[contains(text(), '매물번호')]/following-sibling::td").text.strip()
                            if c_id in target_ids and c_id not in found_ids:
                                print(f"        🎉 [단독] 매물 발견! (ID: {c_id}) - 1순위")
                                found_ids.add(c_id)
                                for g_item in group_items:
                                    if str(g_item.get('naver_id')) == c_id: 
                                        g_item['rank_no'] = 1
                                        print(f"        ✨ 데이터 업데이트: ID {c_id} -> 1위")
                        except: pass
                    else:
                        if not trade_matched: continue
                        
                        parent_link = item.find_element(By.CSS_SELECTOR, ".item_inner .item_link")
                        if parent_link.get_attribute("aria-expanded") != "true":
                            driver.execute_script("arguments[0].click();", parent_link) 
                            time.sleep(0.5) 
                        
                        children = item.find_elements(By.CSS_SELECTOR, ".item--child .item_inner:not(.is-loading)")
                        child_info = []
                        
                        for child in children:
                            c_t = child.get_attribute("textContent")
                            d_m = re.search(r'(\d{2}\.\d{2}\.\d{2})', c_t)
                            d_v = int(d_m.group(1).replace('.', '')) if d_m else 0
                            child_info.append({'el': child, 'txt': clean_str(c_t), 'date': d_v})
                        
                        if child_info:
                            child_info.sort(key=lambda x: x['date'], reverse=True)
                            
                            for r_idx, c_info in enumerate(child_info, 1):
                                if core_realtor in c_info['txt']:
                                    old_id = ""
                                    try: old_id = driver.find_element(By.XPATH, "//th[contains(text(), '매물번호')]/following-sibling::td").text.strip()
                                    except: pass

                                    driver.execute_script("arguments[0].scrollIntoView({block: 'center'});", c_info['el'])
                                    time.sleep(0.3)
                                    driver.execute_script("arguments[0].click();", c_info['el'].find_element(By.CSS_SELECTOR, ".item_link"))
                                    
                                    try:
                                        WebDriverWait(driver, 3).until(lambda d: d.find_element(By.XPATH, "//th[contains(text(), '매물번호')]/following-sibling::td").text.strip() not in [old_id, ""])
                                        c_id = driver.find_element(By.XPATH, "//th[contains(text(), '매물번호')]/following-sibling::td").text.strip()
                                        if c_id in target_ids and c_id not in found_ids:
                                            print(f"        🎉 [묶음 자식] 매물 발견! (ID: {c_id}) - {r_idx}순위")
                                            found_ids.add(c_id)
                                            for g_item in group_items:
                                                if str(g_item.get('naver_id')) == c_id:
                                                    g_item['rank_no'] = r_idx
                                                    print(f"        ✨ 데이터 업데이트: ID {c_id} -> {r_idx}위")
                                    except: pass
                except Exception as e:
                    break 
                    
            if len(found_ids) >= len(target_ids):
                print(f"    ✨ [조기 종료] 해당 단지의 모든 매물을 찾았습니다.")
                break

            driver.execute_script("""
                document.querySelectorAll('.list_contents, .item_area, .list_panel, #articleListArea, .infinite_scroll').forEach(el => {
                    el.scrollTop = el.scrollHeight;
                    el.dispatchEvent(new Event('scroll', { bubbles: true }));
                });
            """)
            time.sleep(0.5)
            
            new_items = driver.find_elements(By.CSS_SELECTOR, "#articleListArea > .item:not(.item--child):not(.is-loading)")
            if len(new_items) > last_count:
                last_count = len(new_items)
                retries = 0
            else:
                if len(new_items) > 0:
                    driver.execute_script("arguments[0].scrollIntoView({block: 'end'});", new_items[-1])
                retries += 1
        
        if len(found_ids) < len(target_ids):
            missing_ids = set(target_ids) - found_ids
            print(f"    ⚠️ 리스트 끝까지 확인했지만 {len(missing_ids)}개의 매물을 찾지 못했습니다.")
            for m_id in missing_ids:
                for g_item in group_items:
                    if str(g_item.get('naver_id')) == m_id:
                        print(f"       -> 🕵️‍♂️ [미발견 매물] ID: {m_id} | 동: {g_item.get('parsed_dong_num', '')}")

    except Exception as e:
        print(f" ⚠️ '{comp_name}' 에러: {e}")