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

def clean_str(text):
    if not text: return ""
    return re.sub(r'[^a-zA-Z0-9가-힣]', '', str(text)).lower()

def verify_villa_house(driver, items, clean_realtor):
    print(f"\n🏡 [빌라/주택] 총 {len(items)}개 매물 실시간 검증 시작...")
    
    core_realtor = clean_realtor.replace("공인중개사", "").replace("사무소", "").replace("부동산", "").replace("중개법인", "").strip()
    if not core_realtor: core_realtor = clean_realtor
    
    location_groups = {}
    for item in items:
        loc_key = (item['parsed_sido'], item['parsed_sigungu'], item['parsed_dong'])
        if loc_key not in location_groups: location_groups[loc_key] = []
        location_groups[loc_key].append(item)

    try:
        driver.get("https://new.land.naver.com/houses")
        time.sleep(0.3)
        
        for (sido, sigungu, dong), group_items in location_groups.items():
            print(f"\n📍 [지역 이동] {sido} {sigungu} {dong} 탐색 시작...")
            target_ids = [str(i.get('naver_id')) for i in group_items]
            found_ids = set()
            
            try:
                first_area_span = WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.CSS_SELECTOR, ".filter_btn_region .area")))
                driver.execute_script("arguments[0].click();", first_area_span)
                time.sleep(0.3)
                
                region_success = True
                for loc_name in [sido, sigungu, dong]:
                    if not loc_name: continue
                    labels = driver.find_elements(By.CSS_SELECTOR, ".area_list--district .radio_label_district")
                    clicked = False
                    for label in labels:
                        if loc_name in label.text:
                            driver.execute_script("arguments[0].scrollIntoView({block: 'center'});", label)
                            time.sleep(0.3)
                            driver.execute_script("arguments[0].click();", label)
                            clicked = True; time.sleep(0.3)
                            break
                    if not clicked: region_success = False; break
                if not region_success: continue 

                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

                print(f"    ⬇️ 실시간 수색 및 스크롤 시작... (타겟: {len(target_ids)}개)")
                last_count = 0
                retries = 0
                
                while retries < 5:
                    current_items = driver.find_elements(By.CSS_SELECTOR, "#list .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
                            
                            if not is_grouped:
                                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:
                                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.3)
                                
                                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 .list_contents, #list .item_area, .list_panel').forEach(el => { 
                            el.scrollTop = el.scrollHeight; 
                            el.dispatchEvent(new Event('scroll', { bubbles: true })); 
                        });
                    """)
                    time.sleep(0.3)
                    
                    new_items = driver.find_elements(By.CSS_SELECTOR, "#list .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('prop_type', '')}")

            except Exception as e: print(f"   🚨 지역 처리 에러: {e}")

    except Exception as e: print(f"🚨 [빌라/주택] 치명적 오류: {e}")