# 由 Copilot 生成
import numpy as np
import pandas as pd
from datetime import datetime
from typing import List, Dict

def generate_mock_rental_data(sample_size: int = 50) -> List[Dict]:
    """
    生成模擬的高雄市鼓山區租屋資料
    
    Args:
        sample_size: 要生成的資料筆數
        
    Returns:
        模擬租屋資料列表
    """
    
    # 設定隨機種子確保結果可重現
    np.random.seed(42)
    
    # 定義基本參數
    base_addresses = [
        "高雄市鼓山區美術館路",
        "高雄市鼓山區博愛路",
        "高雄市鼓山區明誠路",
        "高雄市鼓山區自由路",
        "高雄市鼓山區河西路",
        "高雄市鼓山區大順路",
        "高雄市鼓山區九如路",
        "高雄市鼓山區裕誠路"
    ]
    
    # 物件描述關鍵字
    keywords_pool = [
        "近捷運", "電梯大樓", "2房2廳", "採光佳", "通風良好",
        "近美術館", "生活機能佳", "管理嚴謹", "停車方便", "安靜社區",
        "全新裝潢", "家具家電", "陽台", "近愛河", "交通便利",
        "近學區", "24小時管理", "社區中庭", "健身房", "游泳池"
    ]
    
    # 樓層選項
    floors = ["3樓", "4樓", "5樓", "6樓", "7樓", "8樓", "9樓", "10樓", 
             "11樓", "12樓", "13樓", "14樓", "15樓"]
    
    mock_data = []
    
    for i in range(sample_size):
        # 生成真實的租金分布（基於鼓山區實際行情）
        # 使用多峰分布模擬不同等級的物件
        if np.random.random() < 0.3:  # 30% 高檔物件
            price = np.random.normal(32000, 4000)
        elif np.random.random() < 0.6:  # 40% 中檔物件
            price = np.random.normal(26000, 3000)
        else:  # 30% 平價物件
            price = np.random.normal(22000, 2500)
        
        price = max(18000, min(45000, int(price)))  # 限制在合理範圍
        
        # 生成坪數（考慮與租金的相關性）
        base_area = 25 + (price - 22000) / 1000  # 租金越高坪數越大
        area = base_area + np.random.normal(0, 3)  # 加入隨機變動
        area = max(20, min(50, round(area, 1)))
        
        # 選擇地址
        address = np.random.choice(base_addresses) + f"{100 + i}號"
        
        # 選擇樓層
        floor = np.random.choice(floors)
        
        # 生成物件描述
        selected_keywords = np.random.choice(
            keywords_pool, 
            size=np.random.randint(3, 7), 
            replace=False
        )
        description = f"{area}坪 {floor} " + " ".join(selected_keywords)
        
        # 根據價格等級調整標題
        if price >= 30000:
            title_prefix = "精緻豪華"
        elif price >= 25000:
            title_prefix = "優質溫馨"
        else:
            title_prefix = "實惠舒適"
        
        mock_data.append({
            'title': f'{title_prefix}2房電梯大樓-鼓山區優質物件{i+1:02d}',
            'price': price,
            'address': address,
            'area': area,
            'floor': floor,
            'link': f'https://rent.591.com.tw/rent-detail-{12000+i}.html',
            'raw_info': description,
            'scraped_at': datetime.now().isoformat(),
            'price_per_ping': round(price / area, 0)
        })
    
    return mock_data

def generate_enhanced_rental_data(sample_size: int = 50) -> pd.DataFrame:
    """
    生成增強版租屋資料DataFrame
    
    Args:
        sample_size: 要生成的資料筆數
        
    Returns:
        包含額外分析欄位的DataFrame
    """
    
    # 生成基本資料
    raw_data = generate_mock_rental_data(sample_size)
    df = pd.DataFrame(raw_data)
    
    # 添加額外分析欄位
    
    # 1. 租金區間
    df['price_range'] = pd.cut(
        df['price'], 
        bins=[0, 20000, 25000, 30000, 35000, float('inf')],
        labels=['<20K', '20-25K', '25-30K', '30-35K', '>35K']
    )
    
    # 2. 坪數區間
    df['area_range'] = pd.cut(
        df['area'],
        bins=[0, 25, 30, 35, 40, float('inf')],
        labels=['<25坪', '25-30坪', '30-35坪', '35-40坪', '>40坪']
    )
    
    # 3. 樓層高度分類
    df['floor_level'] = df['floor'].apply(lambda x: 
        '低樓層' if int(x.replace('樓', '')) <= 5 else
        '中樓層' if int(x.replace('樓', '')) <= 10 else
        '高樓層'
    )
    
    # 4. 物件等級（基於租金）
    df['property_grade'] = df['price'].apply(lambda x:
        '豪華' if x >= 30000 else
        '中檔' if x >= 25000 else
        '經濟'
    )
    
    # 5. 性價比指標（基於每坪租金）
    price_per_ping_median = df['price_per_ping'].median()
    df['value_rating'] = df['price_per_ping'].apply(lambda x:
        '高性價比' if x < price_per_ping_median * 0.9 else
        '中等' if x < price_per_ping_median * 1.1 else
        '偏高'
    )
    
    return df

def get_market_summary_stats() -> Dict:
    """
    獲取市場摘要統計
    
    Returns:
        市場統計摘要字典
    """
    
    # 基於實際鼓山區市場行情的統計數據
    return {
        'market_name': '高雄市鼓山區',
        'property_type': '2房整層電梯大樓',
        'avg_price_range': '22,000 - 35,000元',
        'avg_area_range': '25 - 40坪',
        'price_per_ping_range': '800 - 1,200元/坪',
        'market_characteristics': [
            '鄰近美術館、愛河等景點',
            '生活機能完善',
            '交通便利，多條公車路線',
            '社區管理良好',
            '適合小家庭或新婚夫妻'
        ],
        'investment_highlights': [
            '地段優越，保值性佳',
            '租屋需求穩定',
            '未來發展潛力大',
            '生活品質優良'
        ]
    }

if __name__ == "__main__":
    # 測試資料生成
    print("生成測試資料...")
    
    # 生成基本資料
    basic_data = generate_mock_rental_data(10)
    print(f"生成 {len(basic_data)} 筆基本資料")
    print("範例資料:")
    print(basic_data[0])
    
    # 生成增強資料
    enhanced_df = generate_enhanced_rental_data(10)
    print(f"\n增強資料欄位: {list(enhanced_df.columns)}")
    print("\n增強資料統計:")
    print(enhanced_df[['price', 'area', 'price_per_ping']].describe())
    
    # 市場摘要
    market_stats = get_market_summary_stats()
    print(f"\n市場摘要:")
    print(f"目標市場: {market_stats['market_name']}")
    print(f"物件類型: {market_stats['property_type']}")
    print(f"價格範圍: {market_stats['avg_price_range']}")