import streamlit as st
import pandas as pd
import os
from crawler import run_instant_search
from mappings import REGION_MAP, CAT_CODES

# [NEW] FTP 핸들러 임포트
from ftp_handler import upload_to_server

# --- 페이지 설정 ---
st.set_page_config(page_title="경매 스나이퍼", page_icon="🎯", layout="wide")

TARGET_FILE = "targets.csv"

if "view_mode" not in st.session_state:
    st.session_state.view_mode = "saved"
if "search_results" not in st.session_state:
    st.session_state.search_results = pd.DataFrame()

# --- [사이드바] ---
with st.sidebar:
    st.title("🎯 경매 스나이퍼")
    
    if st.button("🏠 나의 관심물건 (홈)", use_container_width=True):
        st.session_state.view_mode = "saved"
        st.rerun()

    # -------------------------------------------------------
    # [NEW] 서버 동기화 버튼 (FTP)
    # -------------------------------------------------------
    st.markdown("---")
    st.subheader("☁️ 데이터 동기화")
    if st.button("📤 서버로 보내기 (FTP)", type="secondary", use_container_width=True, help="현재 PC의 관심물건을 서버로 전송하여 모바일에서 볼 수 있게 합니다."):
        with st.spinner("🚀 서버로 파일 전송 중..."):
            success, msg = upload_to_server(TARGET_FILE, TARGET_FILE)
            if success:
                st.toast(msg, icon="✅")
            else:
                st.error(msg)
    st.markdown("---")

    st.caption("🔍 매물 검색 조건")
    
    sido_list = list(REGION_MAP.keys())
    selected_sido = st.selectbox("시/도", sido_list)
    gugun_dict = REGION_MAP[selected_sido]["sub_regions"]
    gugun_list = ["전체"] + list(gugun_dict.keys())
    selected_gugun = st.selectbox("구/군", gugun_list)
    if selected_gugun == "전체": selected_gugun = ""
    
    selected_cat = st.selectbox("물건 종류", list(CAT_CODES.keys()))
    
    limit_count = st.number_input("수집 개수 (0=무제한)", 0, 10000, 50, step=10)
    if limit_count == 0: limit_count = 9999
    
    if st.button("🚀 검색 시작", type="primary", use_container_width=True):
        st.session_state.view_mode = "search"
        with st.spinner("🕵️‍♂️ 타겟을 찾는 중입니다..."):
            data = run_instant_search(selected_sido, selected_gugun, selected_cat, limit=limit_count)
            if data:
                st.session_state.search_results = pd.DataFrame(data)
            else:
                st.session_state.search_results = pd.DataFrame()
        st.rerun()

# --- [공통 함수] 테이블 표시 ---
def display_auction_table(df, is_saved_mode=False):
    if "select" not in df.columns:
        df["select"] = False  
        
    column_config = {
        "select": st.column_config.CheckboxColumn("V", default=False, width="small"),
        "case_no": st.column_config.TextColumn("사건번호", width="small"),
        "status": st.column_config.TextColumn("상태", width="small"),
        "price_info": st.column_config.TextColumn("가격 (감정/최저)", width="medium"),
        "address": st.column_config.TextColumn("주소", width="large"),
        "area_info": st.column_config.TextColumn("면적", width="medium"),
        "auction_date": st.column_config.TextColumn("기일", width="small"),
        "link": st.column_config.LinkColumn("상세", display_text="🔗이동", width="small"),
    }
    
    display_cols = ["select", "case_no", "status", "price_info", "address", "area_info", "auction_date", "link"]
    final_cols = [c for c in display_cols if c in df.columns]

    return st.data_editor(
        df[final_cols],
        column_config=column_config,
        hide_index=True,
        use_container_width=True,
        key=f"editor_{'saved' if is_saved_mode else 'search'}"
    )

# --- [화면 1] 나의 관심물건 (Local CSV) ---
if st.session_state.view_mode == "saved":
    
    if os.path.exists(TARGET_FILE):
        try:
            saved_df = pd.read_csv(TARGET_FILE)
            
            if not saved_df.empty:
                st.caption(f"내 PC 저장됨: {len(saved_df)}건")

                edited_saved_df = display_auction_table(saved_df, is_saved_mode=True)

                selected_rows = edited_saved_df[edited_saved_df["select"] == True]
                if not selected_rows.empty:
                    st.info("👇 URL 복사")
                    urls_to_copy = "\n".join(selected_rows["link"].tolist())
                    st.code(urls_to_copy, language="text")

                st.markdown("---")
                
                col1, col2 = st.columns([1, 6])
                with col1:
                    if st.button("🗑️ 선택 삭제", type="secondary"):
                        if "select" in edited_saved_df.columns:
                            remaining_df = edited_saved_df[edited_saved_df["select"] == False]
                            # 저장 (선택 컬럼 제외)
                            save_cols = [c for c in remaining_df.columns if c != "select"]
                            remaining_df[save_cols].to_csv(TARGET_FILE, index=False, encoding='utf-8-sig')
                            st.rerun()
                with col2:
                    csv = saved_df.to_csv(index=False).encode('utf-8-sig')
                    st.download_button("📥 엑셀 내보내기", csv, "my_targets.csv", "text/csv")
            else:
                st.info("저장된 타겟이 없습니다.")
        except Exception as e:
            st.error(f"파일 오류: {e}")
            if st.button("파일 초기화"):
                os.remove(TARGET_FILE)
                st.rerun()
    else:
        st.info("저장된 타겟이 없습니다.")

# --- [화면 2] 검색 결과 ---
elif st.session_state.view_mode == "search":
    
    if not st.session_state.search_results.empty:
        df = st.session_state.search_results
        
        st.caption(f"검색 결과: {len(df)}건")
        
        edited_search_df = display_auction_table(df, is_saved_mode=False)

        selected_rows_search = edited_search_df[edited_search_df["select"] == True]
        if not selected_rows_search.empty:
            st.info("👇 URL 복사")
            urls_to_copy = "\n".join(selected_rows_search["link"].tolist())
            st.code(urls_to_copy, language="text")

        st.markdown("---")
        
        col1, col2 = st.columns([1, 6])
        with col1:
            if st.button("⭐ 선택 저장", type="primary"):
                if "select" in edited_search_df.columns:
                    selected_rows = edited_search_df[edited_search_df["select"] == True]
                    if not selected_rows.empty:
                        save_cols = [c for c in selected_rows.columns if c != "select"]
                        save_data = selected_rows[save_cols]
                        
                        # 로컬 CSV에 Append (중복제거 포함)
                        if os.path.exists(TARGET_FILE):
                            existing = pd.read_csv(TARGET_FILE)
                            combined = pd.concat([existing, save_data]).drop_duplicates(subset=['case_no'])
                            combined.to_csv(TARGET_FILE, index=False, encoding='utf-8-sig')
                        else:
                            save_data.to_csv(TARGET_FILE, index=False, encoding='utf-8-sig')
                        
                        st.toast(f"✅ {len(save_data)}건 로컬 저장 완료! (서버 동기화 필요)", icon="💾")
                    else:
                        st.toast("저장할 타겟을 선택해주세요.", icon="⚠️")
        
        with col2:
            if st.button("🏠 홈으로 이동"):
                st.session_state.view_mode = "saved"
                st.rerun()
    else:
        st.info("검색 결과가 없습니다.")