import pandas as pd
import numpy as np
from datetime import datetime, timedelta
import random

class FakeDataGenerator:
    """生成用于测试在线率分析工具的模拟数据"""
    
    def __init__(self):
        # 省份列表
        self.provinces = [
            '北京市', '上海市', '广东省', '江苏省', '浙江省', 
            '山东省', '河南省', '四川省', '湖北省', '福建省'
        ]
        
        # 制造商列表
        self.manufacturers = [
            '华为', '中兴', '烽火', '诺基亚', '爱立信',
            '思科', '新华三', '锐捷', '迈普', '东方通信'
        ]
        
        # 基础在线率范围
        self.base_rate_range = (0.85, 0.98)
        
    def generate_region_data(self, region_name: str, start_time: str, end_time: str) -> pd.DataFrame:
        """生成指定地区和时间段的在线率数据"""
        start_date = datetime.strptime(start_time, '%Y-%m-%d')
        end_date = datetime.strptime(end_time, '%Y-%m-%d')
        date_range = pd.date_range(start_date, end_date, freq='D')
        
        data = []
        base_rate = random.uniform(*self.base_rate_range)
        
        for date in date_range:
            # 添加一些随机波动
            daily_rate = min(1.0, max(0.0, base_rate + random.uniform(-0.05, 0.05)))
            data.append({
                'date': date,
                'region': region_name,
                'online_rate': daily_rate,
                'device_count': random.randint(1000, 5000)
            })
            
        return pd.DataFrame(data)
    
    def generate_ranking_data(self, rank_type: int) -> pd.DataFrame:
        """生成排名数据"""
        if rank_type == 1:  # 省份排名
            entities = self.provinces
        else:  # 厂商排名
            entities = self.manufacturers
            
        data = []
        for entity in entities:
            base_rate = random.uniform(*self.base_rate_range)
            data.append({
                'name': entity,
                'online_rate': base_rate,
                'device_count': random.randint(5000, 20000),
                'offline_count': random.randint(100, 1000)
            })
            
        return pd.DataFrame(data).sort_values('online_rate', ascending=False)
    
    def generate_national_trend(self, start_time: str, end_time: str) -> pd.DataFrame:
        """生成全国在线率趋势数据"""
        start_date = datetime.strptime(start_time, '%Y-%m-%d')
        end_date = datetime.strptime(end_time, '%Y-%m-%d')
        date_range = pd.date_range(start_date, end_date, freq='D')
        
        data = []
        base_rate = random.uniform(*self.base_rate_range)
        trend = np.linspace(-0.02, 0.02, len(date_range))  # 添加轻微的趋势
        
        for i, date in enumerate(date_range):
            # 基础在线率 + 趋势 + 随机波动
            daily_rate = min(1.0, max(0.0, base_rate + trend[i] + random.uniform(-0.02, 0.02)))
            data.append({
                'date': date,
                'online_rate': daily_rate,
                'total_devices': random.randint(50000, 100000),
                'online_devices': random.randint(40000, 90000)
            })
            
        return pd.DataFrame(data)

class MockDBConnection:
    """模拟数据库连接类"""
    
    def __init__(self):
        self.fake_data = FakeDataGenerator()
        
    def query(self, sql: str, params: dict = None) -> pd.DataFrame:
        """模拟SQL查询"""
        # 根据SQL语句特征返回相应的模拟数据
        if 'region' in sql.lower():
            return self.fake_data.generate_region_data(
                params.get('region_name', '北京市'),
                params.get('start_time', '2024-01-01'),
                params.get('end_time', '2024-01-07')
            )
        elif 'rank' in sql.lower():
            return self.fake_data.generate_ranking_data(
                params.get('type', 1)
            )
        elif 'national' in sql.lower():
            return self.fake_data.generate_national_trend(
                params.get('start_time', '2024-01-01'),
                params.get('end_time', '2024-01-07')
            )
        else:
            return pd.DataFrame()  # 默认返回空数据框