# /estate/crawlers/alter.py
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 selenium.webdriver.common.keys import Keys
from bs4 import BeautifulSoup

def login(driver, user_id, user_pw):
    """알터 사이트 공통 로그인 함수"""
    print(f"\n[알터] 🔑 '{user_id}' 계정 접속 시도 중...")
    try:
        driver.get("https://rter.kr/login")
        id_input = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.NAME, "username")))
        pw_input = driver.find_element(By.NAME, "password")
        
        id_input.clear()
        id_input.send_keys(user_id)
        time.sleep(0.5) 
        
        pw_input.clear()
        pw_input.send_keys(user_pw)
        time.sleep(0.5)
        
        pw_input.send_keys(Keys.ENTER)
        time.sleep(1.5) 
        
        if "login" not in driver.current_url.lower():
            print("✅ [알터] 로그인 성공!")
            return True
        else:
            print("⚠️ [알터] 로그인 실패 (URL 변경 없음)")
            return False
    except Exception as e:
        print(f"❌ [알터] 로그인 에러 발생: {e}")
        return False

def convert_price_to_full(price_text):
    """'46,000' 또는 '500 / 85' 형태의 만원 단위 금액을 원 단위 문자열로 변환"""
    if not price_text: return ""
    
    parts = price_text.split('/')
    result = []
    
    for part in parts:
        clean_num = re.sub(r'[^0-9]', '', part)
        if clean_num:
            full_num = int(clean_num) * 10000 
            result.append(f"{full_num:,}") 
        else:
            result.append("0")
            
    return " / ".join(result)

def crawl(user_id, user_pw):
    print(f"\n[알터] 🤖 '{user_id}' 계정으로 실제 로그인 시도 중...")
    
    options = uc.ChromeOptions()
    options.add_argument('--window-size=1920,1080')
    options.add_argument('--log-level=3') 
    options.add_argument('--disable-logging')
    # options.add_argument('--headless') 
    
    driver = uc.Chrome(options=options, version_main=147)
    extracted_data = []
    
    try:
        driver.get("https://rter.kr/login")
        
        try:
            id_input = WebDriverWait(driver, 10).until(
                EC.presence_of_element_located((By.NAME, "username"))
            )
            pw_input = driver.find_element(By.NAME, "password")
            
            id_input.clear()
            id_input.send_keys(user_id)
            time.sleep(0.5) 
            
            pw_input.clear()
            pw_input.send_keys(user_pw)
            time.sleep(0.5)
            
            pw_input.send_keys(Keys.ENTER)
            print("👉 로그인 폼 전송 완료. 로딩 대기...")
            time.sleep(1) 
            
            if "login" not in driver.current_url.lower():
                print("✅ [알터] 로그인 성공!\n")
                
                current_page = 1
                
                while True:
                    print(f"🚀 [알터] {current_page}페이지 데이터를 수집합니다...")
                    
                    list_url = f"https://rter.kr/new-pages/naverArticle/list?perCnt=20&curPage={current_page}&selectStatus=ALL&verificationType="
                    driver.get(list_url)
                    
                    WebDriverWait(driver, 10).until(
                        EC.presence_of_element_located((By.ID, "listTable"))
                    )
                    time.sleep(1)
                    
                    soup = BeautifulSoup(driver.page_source, 'html.parser')
                    rows = soup.select('#pcList > tr')
                    
                    if not rows:
                        print("⚠️ 더 이상 매물이 없습니다. 수집을 종료합니다.")
                        break
                        
                    for idx, row in enumerate(rows, 1):
                        status_td = row.select('td')[6] if len(row.select('td')) >= 7 else None
                        if status_td:
                            status_text = status_td.get_text(strip=True)
                            if "서비스중" not in status_text:
                                continue
                        
                        naver_id_elem = row.select_one('.openNaver .text-success')
                        naver_id = naver_id_elem.text.strip() if naver_id_elem else "없음"
                        
                        type_elem = row.select_one('.customer .badge-phoenix-primary')
                        prop_type = type_elem.text.strip() if type_elem else ""
                        
                        addr_elem = row.select_one('.customer .fw-bold.d-block')
                        address = addr_elem.get_text(separator=' ', strip=True) if addr_elem else ""
                        
                        tds = row.select('td')
                        trade_type = ""
                        formatted_price = ""
                        
                        if len(tds) >= 5:
                            td_5 = tds[4]
                            t_type_elem = td_5.select_one('.fw-bold')
                            trade_type = t_type_elem.text.strip() if t_type_elem else ""
                            
                            p_elem = td_5.select_one('.d-block')
                            raw_price = p_elem.text.strip() if p_elem else ""
                            formatted_price = convert_price_to_full(raw_price)

                        extracted_data.append({
                            "platform": "alter",
                            "naver_id": naver_id,
                            "prop_type": prop_type,
                            "address": address,
                            "trade_type": trade_type,
                            "price": formatted_price
                        })
                    
                    print(f"✅ {current_page}페이지에서 {len(rows)}개의 매물을 수집했습니다.")
                    
                    next_page_str = f"goPage({current_page + 1})"
                    next_btn = soup.select_one(f'#pager .page-item a[onclick*="{next_page_str}"]')
                    
                    if next_btn:
                        current_page += 1
                        time.sleep(0.5)
                    else:
                        print("🏁 마지막 페이지에 도달했습니다. 전체 수집을 완료합니다.")
                        break

            else:
                print("⚠️ [알터] 로그인이 되지 않았습니다.")
                
        except Exception as e:
            print(f"❌ [알터] 요소를 찾는 중 에러 발생: {e}")
            
    except Exception as e:
        print(f"🚨 [알터] 치명적 오류 발생: {e}")
        
    finally:
        time.sleep(0.5)
        driver.quit()
        
    return extracted_data

# def refresh_listing(driver, article_id, naver_id):
#     """
#     [테스트용 안전 모드] 순위가 밀린 매물을 '노출종료' 후 '재등록'하여 상단으로 끌어올리는 함수
#     🚨 주의: 실제 과금을 막기 위해 클릭 이벤트를 주석 처리한 가짜 실행 모드입니다.
#     """
#     print(f"\n🔄 [알터-테스트모드] 매물번호 {article_id} 끌어올리기 (노출종료->재등록) 시뮬레이션 시작...")
    
#     try:
#         # ==========================================
#         # 1. 일반 리스트에서 [노출 종료] 찾기 (시뮬레이션)
#         # ==========================================
#         search_url = f"https://rter.kr/new-pages/naverArticle/list?searchKeyword={article_id}"
#         driver.get(search_url)
#         time.sleep(1.5)
        
#         try:
#             # 매물 번호가 있는 행 찾기
#             target_row = WebDriverWait(driver, 5).until(
#                 EC.presence_of_element_located((By.XPATH, f"//tr[contains(., '{article_id}')]"))
#             )
#             # 버튼을 찾고 화면 중앙으로 스크롤까지만 진행
#             end_btn = target_row.find_element(By.CSS_SELECTOR, "a.openArticleClose")
#             driver.execute_script("arguments[0].scrollIntoView({block: 'center'});", end_btn)
#             time.sleep(0.5)
            
#             # 🚨 [핵심 과금 방어선] 실제 클릭과 확인 알럿창 처리 주석화
#             # end_btn.click()
#             # WebDriverWait(driver, 3).until(EC.alert_is_present())
#             # driver.switch_to.alert.accept()
            
#             print(" ⏸️ 1단계: [Dry-Run] 기존 노출 종료 버튼을 확인했습니다. (실제 클릭 생략)")
#         except Exception as e:
#             print(" ⚠️ [Dry-Run] 이미 노출 종료 상태이거나 리스트에 없습니다. 바로 2단계로 넘어갑니다.")

#         time.sleep(2) # 서버에 상태가 갱신될 때까지 안전하게 대기

#         # ==========================================
#         # 2. 종료 매물 목록으로 이동
#         # ==========================================
#         expire_url = f"https://rter.kr/new-pages/naverArticle/expireList?naverUID={naver_id}"
#         driver.get(expire_url)
#         time.sleep(1.5)

#         # ==========================================
#         # 3. [재등록] 버튼 찾기 (시뮬레이션)
#         # ==========================================
#         try:
#             target_row_expired = WebDriverWait(driver, 5).until(
#                 EC.presence_of_element_located((By.XPATH, f"//tr[contains(., '{article_id}')]"))
#             )
            
#             # 버튼을 찾고 화면 중앙으로 스크롤까지만 진행
#             re_reg_btn = target_row_expired.find_element(By.CSS_SELECTOR, "a.openReRegDialog")
#             driver.execute_script("arguments[0].scrollIntoView({block: 'center'});", re_reg_btn)
#             time.sleep(0.5)

#             # 🚨 [핵심 과금 방어선] 실제 클릭과 재등록 확인 알럿창 처리 주석화
#             # re_reg_btn.click()
#             # WebDriverWait(driver, 3).until(EC.alert_is_present())
#             # driver.switch_to.alert.accept()
            
#             time.sleep(1) 
#             print(f" ✅ 2단계: [Dry-Run] 매물 {article_id} 성공적으로 재등록(끌어올리기) 완료 처리! (실제 과금 발생 안함)")
#             return True # 가짜 성공 신호 전송

#         except Exception as e:
#             print(f" ❌ 2단계 실패: [Dry-Run] 종료 리스트에서 재등록 버튼을 찾을 수 없습니다. ({e})")
#             return False

#     except Exception as e:
#         print(f" 🚨 전체 프로세스 중 치명적 오류 발생: {e}")
#         return False
             