// 气象数据模拟工具

/**
 * 生成日期数组
 * @param {number} days - 天数
 * @returns {Array} 日期数组
 */
const generateDates = (days) => {
  const dates = [];
  const today = new Date();

  for (let i = days - 1; i >= 0; i--) {
    const date = new Date(today);
    date.setDate(date.getDate() - i);
    dates.push(`${date.getMonth() + 1}/${date.getDate()}`);
  }

  return dates;
};

/**
 * 生成随机数值数组
 * @param {number} count - 数据点数量
 * @param {number} min - 最小值
 * @param {number} max - 最大值
 * @param {number} base - 基准值
 * @param {number} volatility - 波动率 (0-1)
 * @returns {Array} 数值数组
 */
const generateValues = (count, min, max, base = 0, volatility = 0.1) => {
  const values = [];
  let current = base || min + (max - min) * Math.random();

  for (let i = 0; i < count; i++) {
    // 添加随机波动
    const change = (max - min) * volatility * (Math.random() - 0.5);
    current = Math.max(min, Math.min(max, current + change));

    // 对于特定类型添加趋势
    if (i % 10 === 0 && Math.random() > 0.7) {
      current += (max - min) * 0.05 * (Math.random() - 0.5);
    }

    values.push(parseFloat(current.toFixed(1)));
  }

  return values;
};

/**
 * 生成指定天数的气象数据
 * @param {number} days - 天数
 * @returns {Object} 气象数据对象
 */
const generateWeatherData = (days) => {
  const dates = generateDates(days);
  const count = dates.length;

  return {
    // 温度数据 (10-35°C)
    temperature: {
      7: {
        dates: generateDates(7),
        values: generateValues(7, 15, 30, 22, 0.15),
      },
      30: {
        dates: generateDates(30),
        values: generateValues(30, 10, 35, 23, 0.15),
      },
      90: {
        dates: generateDates(90),
        values: generateValues(90, 5, 38, 22, 0.2),
      },
    },

    // 湿度数据 (30-95%)
    humidity: {
      7: {
        dates: generateDates(7),
        values: generateValues(7, 40, 90, 65, 0.2),
      },
      30: {
        dates: generateDates(30),
        values: generateValues(30, 30, 95, 60, 0.25),
      },
      90: {
        dates: generateDates(90),
        values: generateValues(90, 25, 98, 62, 0.25),
      },
    },

    // 降雨量数据 (0-50mm)
    rainfall: {
      7: { dates: generateDates(7), values: generateRainfallValues(7) },
      30: { dates: generateDates(30), values: generateRainfallValues(30) },
      90: { dates: generateDates(90), values: generateRainfallValues(90) },
    },

    // 风速数据 (0-15m/s)
    windSpeed: {
      7: { dates: generateDates(7), values: generateValues(7, 0, 10, 3, 0.3) },
      30: {
        dates: generateDates(30),
        values: generateValues(30, 0, 15, 3.5, 0.3),
      },
      90: {
        dates: generateDates(90),
        values: generateValues(90, 0, 20, 4, 0.35),
      },
    },

    // 气压数据 (980-1040hPa)
    pressure: {
      7: {
        dates: generateDates(7),
        values: generateValues(7, 990, 1030, 1013, 0.05),
      },
      30: {
        dates: generateDates(30),
        values: generateValues(30, 985, 1035, 1015, 0.05),
      },
      90: {
        dates: generateDates(90),
        values: generateValues(90, 980, 1040, 1012, 0.07),
      },
    },

    // 光照数据 (0-100000lux)
    light: {
      7: { dates: generateDates(7), values: generateLightValues(7) },
      30: { dates: generateDates(30), values: generateLightValues(30) },
      90: { dates: generateDates(90), values: generateLightValues(90) },
    },
  };
};

/**
 * 生成降雨量数据（特殊处理，大部分为0）
 * @param {number} count - 数据点数量
 * @returns {Array} 降雨量数组
 */
const generateRainfallValues = (count) => {
  const values = [];

  for (let i = 0; i < count; i++) {
    // 80%的概率无雨
    if (Math.random() < 0.8) {
      values.push(0);
    } else {
      // 小雨到大雨
      const rain =
        Math.random() < 0.7
          ? parseFloat((Math.random() * 10).toFixed(1)) // 小雨 (0-10mm)
          : parseFloat((10 + Math.random() * 40).toFixed(1)); // 大雨 (10-50mm)
      values.push(rain);
    }
  }

  return values;
};

/**
 * 生成光照数据（模拟昼夜变化）
 * @param {number} count - 数据点数量
 * @returns {Array} 光照数组
 */
const generateLightValues = (count) => {
  const values = [];

  for (let i = 0; i < count; i++) {
    // 模拟白天光照强，晚上光照弱
    const hour = Math.floor(Math.random() * 24);
    let light;

    if (hour >= 6 && hour <= 18) {
      // 白天 5000-100000lux
      light = 5000 + Math.random() * 95000;
    } else if ((hour >= 5 && hour < 6) || (hour > 18 && hour <= 19)) {
      // 晨昏 100-5000lux
      light = 100 + Math.random() * 4900;
    } else {
      // 夜晚 0-100lux
      light = Math.random() * 100;
    }

    // 添加天气影响（阴天光照减弱）
    if (Math.random() < 0.3) {
      light *= 0.3 + Math.random() * 0.5;
    }

    values.push(parseFloat(light.toFixed(0)));
  }

  return values;
};

/**
 * 生成实时气象数据
 * @returns {Object} 实时气象数据
 */
const generateRealtimeWeatherData = () => {
  return {
    temperature: parseFloat((15 + Math.random() * 20).toFixed(1)),
    humidity: parseFloat((30 + Math.random() * 65).toFixed(1)),
    rainfall: parseFloat((Math.random() * 10).toFixed(1)),
    windSpeed: parseFloat((Math.random() * 15).toFixed(1)),
    pressure: parseFloat((990 + Math.random() * 40).toFixed(1)),
    light: parseFloat((Math.random() * 100000).toFixed(0)),
    updateTime: new Date().toLocaleTimeString("zh-CN"),
  };
};

// 导出模拟数据
export const weatherMockData = generateWeatherData();
export const realtimeWeatherData = generateRealtimeWeatherData();

/**
 * 获取指定气象类型和时间范围的格式化数据（用于WeatherChart组件）
 * @param {string} weatherType - 气象类型
 * @param {number} days - 时间范围（7/30/90天）
 * @returns {Object} 格式化的数据 { dates: [], values: [] }
 */
const getFormattedWeatherData = (weatherType, days) => {
  // 验证参数
  if (!weatherMockData[weatherType] || !weatherMockData[weatherType][days]) {
    console.error(`无效的气象类型或时间范围: ${weatherType}, ${days}`);
    return { dates: [], values: [] };
  }

  return weatherMockData[weatherType][days];
};

// 导出工具函数供其他组件使用
export {
  generateDates,
  generateValues,
  generateWeatherData,
  generateRealtimeWeatherData,
  getFormattedWeatherData,
};
