import time
import re
import undetected_chromedriver as uc
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

from crawlers.verifier_apt import verify_apartment
from crawlers.verifier_villa import verify_villa_house
from crawlers.verifier_comm import verify_commercial
from crawlers.verifier_room import verify_room

def clean_str(text):
    if not text: return ""
    return re.sub(r'[^a-zA-Z0-9가-힣]', '', str(text)).lower()

def parse_address(full_address):
    parts = full_address.split()
    sido = parts[0] if len(parts) >= 1 else ""
    sigungu = parts[1] if len(parts) >= 2 else ""
    dong = parts[2] if len(parts) >= 3 else ""
    comp = parts[3] if len(parts) >= 4 else full_address
    dong_num = re.search(r'\d+동', full_address)
    return sido, sigungu, dong, comp, (dong_num.group() if dong_num else "")

def verify_list(items, realtor_id=""):
    if not items: return []
    
    apt_groups = {}      
    villa_house_items = []
    commercial_items = [] 
    room_items = []
    
    for item in items:
        sido, sigungu, dong, comp_name, target_dong_num = parse_address(item['address'])
        item.update({'parsed_sido': sido, 'parsed_sigungu': sigungu, 'parsed_dong': dong, 'parsed_comp_name': comp_name, 'parsed_dong_num': target_dong_num, 'rank_no': 0})
        
        prop_type = item.get('prop_type', '')
        
        if any(k in prop_type for k in ["아파트", "오피스텔", "분양권", "재건축"]):
            if comp_name not in apt_groups: apt_groups[comp_name] = []
            apt_groups[comp_name].append(item)
            
        elif any(k in prop_type for k in ["원룸", "투룸", "쓰리룸", "고시원"]):
            room_items.append(item)

        elif any(k in prop_type for k in ["주택", "빌라", "다세대", "단독", "다가구", "전원주택", "한옥"]):
            villa_house_items.append(item)
            
        elif any(k in prop_type for k in ["상가", "점포", "업무", "사무실", "공장", "창고", "토지", "건물", "지식산업센터"]):
            commercial_items.append(item)

    print(f"\n📊 [분류 완료] 아파트({len(apt_groups)}단지) / 주택({len(villa_house_items)}) / 원룸({len(room_items)}) / 상가({len(commercial_items)})")
    
    options = uc.ChromeOptions()
    options.add_argument('--window-size=1920,1080')
    options.add_argument('--log-level=3')
    driver = uc.Chrome(options=options, version_main=147)
    
    try:
        realtor_name = ""
        if realtor_id:
            try:
                driver.get(f"https://new.land.naver.com/?realtorId={realtor_id}")
                time.sleep(0.3)
                realtor_name = WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.CSS_SELECTOR, ".info_agent_title .title"))).text.strip()
                print(f"👤 중개사 이름 확인: {realtor_name}")
            except: 
                print("⚠️ 중개사 이름을 불러오지 못했습니다. 부분 매칭으로 진행합니다.")
        
        clean_realtor = clean_str(realtor_name)

        if apt_groups:
            for comp_name, group_items in apt_groups.items():
                verify_apartment(driver, comp_name, group_items, clean_realtor)

        if room_items:
            verify_room(driver, room_items, clean_realtor)

        if villa_house_items:
            verify_villa_house(driver, villa_house_items, clean_realtor)
            
        if commercial_items:
            verify_commercial(driver, commercial_items, clean_realtor)

    except Exception as e:
        print(f"🚨 [네이버 검증 총괄] 치명적 에러 발생: {e}")
    finally:
        driver.quit()
        print("🛑 네이버 검증 프로세스 종료.")

    return items