#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Mock 資料生成器

從原始 properties_data_with_coordinates.json 生成去識別化的 mock 資料
"""

import json
import random
from pathlib import Path

# 設定隨機種子確保可重現
random.seed(42)

# ===== 替換規則 =====

# 城市替換對照表
CITY_MAPPING = {
    '台北市': 'A市',
    '新北市': 'B市',
    '桃園市': 'C市',
    '新竹縣': 'D縣',
    '新竹市': 'E市',
    '苗栗縣': 'F縣',
    '台中市': 'G市',
    '彰化縣': 'H縣',
    '南投縣': 'I縣',
    '雲林縣': 'J縣',
    '嘉義縣': 'K縣',
    '嘉義市': 'L市',
    '台南市': 'M市',
    '高雄市': 'N市',
    '屏東縣': 'O縣',
    '宜蘭縣': 'P縣',
    '花蓮縣': 'Q縣',
    '台東縣': 'R縣',
    '澎湖縣': 'S縣',
    '金門縣': 'T縣',
    '連江縣': 'U縣',
    '基隆市': 'V市',
    '其他': 'X區',
    '未知': 'Y區',
}

# 估價師替換對照表
APPRAISER_MAPPING = {
    '麗業': '估價師A',
    '尚上': '估價師B',
    '中徵': '估價師C',
    '瑞普': '估價師D',
    'DTZ': '估價師E',
    '戴德梁行': '估價師E',
    '信義': '估價師F',
    '歐亞': '估價師G',
    '展碁': '估價師H',
    'CBRE': '估價師I',
    'Savills': '估價師J',
    '高力': '估價師K',
}

# 假路名池
FAKE_STREETS = [
    '中央路', '建國路', '復興路', '民生路', '和平路',
    '中山路', '中正路', '光復路', '自由路', '民權路',
    '忠孝路', '仁愛路', '信義路', '文化路', '成功路',
]


def generate_mock_address(city_code, index):
    """生成假地址"""
    street = random.choice(FAKE_STREETS)
    number = random.randint(1, 500)
    return f"{city_code}{street}{number}號"


def offset_coordinate(coord, offset_range=(0.01, 0.05)):
    """偏移座標 (約 1-5 公里)"""
    if coord is None:
        return None
    offset = random.uniform(*offset_range)
    direction = random.choice([-1, 1])
    return round(coord + (offset * direction), 6)


def adjust_value(value, variance=0.1):
    """調整金額 (±10%)，確保最小值有幾百萬"""
    if value is None:
        # 沒有值的話，給一個隨機的幾百萬到幾千萬
        return random.randint(5, 50) * 1e6  # 500萬 ~ 5000萬
    if value == 0 or value < 1e6:
        # 太小的值，給一個合理的幾百萬
        return random.randint(3, 30) * 1e6  # 300萬 ~ 3000萬
    factor = 1 + random.uniform(-variance, variance)
    return round(value * factor, 2)


def generate_mock_area(value):
    """根據估值生成合理的假面積（坪）"""
    if value is None or value == 0:
        return random.randint(50, 500)

    # 假設每坪單價在 10-100 萬之間，反推面積
    value_wan = value / 1e4  # 轉為萬元
    avg_price_per_ping = random.randint(20, 80)  # 每坪單價（萬）
    estimated_area = value_wan / avg_price_per_ping

    # 加一些隨機變化
    area = estimated_area * random.uniform(0.7, 1.3)

    # 限制合理範圍
    area = max(50, min(50000, area))  # 50坪 ~ 50000坪
    return round(area, 1)


def generate_mock_data(original_data):
    """生成 mock 資料"""
    mock_data = []

    for idx, prop in enumerate(original_data, start=1):
        # 城市替換
        original_city = prop.get('city', '未知')
        mock_city = CITY_MAPPING.get(original_city, 'X區')

        # 估價師替換
        original_appraisers = prop.get('appraisers', [])
        mock_appraisers = [
            APPRAISER_MAPPING.get(a, f'估價師{chr(65 + i)}')
            for i, a in enumerate(original_appraisers)
        ]

        value_investment = adjust_value(prop.get('value_investment'))

        # 生成 mock 標的
        mock_prop = {
            'code': f'DEMO-{idx:03d}',
            'name': f'標的-{idx:03d}',
            'address': generate_mock_address(mock_city, idx),
            'city': mock_city,
            'value_investment': value_investment,
            'value_normal': adjust_value(prop.get('value_normal')),
            'area': generate_mock_area(value_investment),  # 新增面積欄位
            'appraisers': mock_appraisers,
            'discount_rate': prop.get('discount_rate'),
            'latitude': offset_coordinate(prop.get('latitude')),
            'longitude': offset_coordinate(prop.get('longitude')),
            'geocoding_source': 'mock',
            'geocoding_status': prop.get('geocoding_status', 'success'),
        }

        mock_data.append(mock_prop)

    return mock_data


def main():
    # 路徑設定
    script_dir = Path(__file__).parent
    original_file = script_dir.parent / 'EY-TS_Holding_2025Q4_Review' / '02-Analysis' / 'properties_data_with_coordinates.json'
    output_file = script_dir / 'mock_properties_data.json'

    # 讀取原始資料
    print(f"讀取原始資料: {original_file}")
    with open(original_file, 'r', encoding='utf-8') as f:
        original_data = json.load(f)

    print(f"原始資料筆數: {len(original_data)}")

    # 生成 mock 資料
    mock_data = generate_mock_data(original_data)

    # 儲存 mock 資料
    with open(output_file, 'w', encoding='utf-8') as f:
        json.dump(mock_data, f, ensure_ascii=False, indent=2)

    print(f"Mock 資料已儲存: {output_file}")
    print(f"Mock 資料筆數: {len(mock_data)}")

    # 統計資訊
    cities = {}
    appraisers = set()
    total_value = 0

    for prop in mock_data:
        city = prop['city']
        cities[city] = cities.get(city, 0) + 1
        appraisers.update(prop['appraisers'])
        if prop['value_investment']:
            total_value += prop['value_investment']

    print(f"\n=== 統計資訊 ===")
    print(f"城市數: {len(cities)}")
    print(f"估價師數: {len(appraisers)}")
    print(f"總估值: {total_value / 1e8:.2f} 億元")

    print(f"\n=== 城市分布 ===")
    for city, count in sorted(cities.items(), key=lambda x: -x[1]):
        print(f"  {city}: {count} 個標的")


if __name__ == '__main__':
    main()
