import { ref, computed } from 'vue'

/**
 * 灾害数据状态管理
 */
export function useDisasterData() {
  // 灾害基本信息
  const disasterInfo = ref({
    type: '边坡垮塌',
    volume: '1220',
    volumeUnit: 'm³',
    length: '33',
    lengthUnit: 'm',
    width: '15',
    widthUnit: 'm',
    casualties: '0',
    vehicles: '0',
    location: '巴南G348武大线三峭湾'
  })

  // 力量预置信息
  const forcePreset = ref({
    equipment: 0,
    materials: 0,
    bases: 0,
    personnel: 0,
    searchRadius: 30, // km
    stations: [
      {
        id: 1,
        name: '大进养护站',
        distance: 8,
        type: 'maintenance'
      },
      {
        id: 2,
        name: '郭家养护站',
        distance: 8,
        type: 'maintenance'
      }
    ]
  })

  // 力量调度信息
  const forceDispatch = ref({
    responseLevel: 4, // 四级
    // estimatedClearTime: getCurrentDateTime('24:00'),
    estimatedClearTime: '2025-11-19 24:00',
    plan: {
      name: '智能应急方案',
      status: 'ready'
    }
  })

  // 获取当前日期
  function getCurrentDate() {
    const date = new Date();
    const year = date.getFullYear();
    const month = String(date.getMonth() + 1).padStart(2, '0');
    const day = String(date.getDate()).padStart(2, '0');
    return `${year}-${month}-${day}`;
  }
  // 获取当前日期加上指定时间
  function getCurrentDateTime(time) {
    const date = new Date();
    const year = date.getFullYear();
    const month = String(date.getMonth() + 1).padStart(2, '0');
    const day = String(date.getDate()).padStart(2, '0');
    return `${year}-${month}-${day} ${time}`;
  }
  // 获取当前日期没有年份
  function getCurrentDateWithoutYear() {
    const date = new Date();
    const year = date.getFullYear();
    const month = String(date.getMonth() + 1).padStart(2, '0');
    const day = String(date.getDate()).padStart(2, '0');
    return `${month}月${day}日`;
  };

  // 协同信息
  const collaborationInfo = ref([
    {
      id: 1,
      source: '气象预警',
      // content:
      //   `忠县气象台${getCurrentDate()} 08:30分升级发布"暴雨黄色预警信号"，过去6小时，文峰、红池坝、天元、长桂等乡镇累计降雨量已达70毫米以上。`,
      content:
        `忠县气象台2025-11-19 08:30分升级发布"暴雨黄色预警信号"，过去6小时，文峰、红池坝、天元、长桂等乡镇累计降雨量已达70毫米以上。`,
      timestamp: getCurrentDateTime('08:30')
    },
    {
      id: 2,
      source: '公安部门',
      content: '对忠县S204武大线三峭湾进行交通管制。',
      timestamp: '2025-10-17 13:00'
    },
    {
      id: 3,
      source: '融媒体中心',
      // content:
      //   `发布了阻断信息：巴南S204武大线三湾于${getCurrentDateWithoutYear()}发生山体滑坡，边坡有继续垮塌风险，需断道观察，车辆从桥口坝绕行金田村，预计${getCurrentDate()} 24:00恢复通行。`,
      content:
        `发布了阻断信息：巴南S204武大线三湾于11月19日发生山体滑坡，边坡有继续垮塌风险，需断道观察，车辆从桥口坝绕行金田村，预计2025-11-19 24:00恢复通行。`,
      timestamp: getCurrentDateTime('24:00')
    }
  ])

  // 调度力量建议（根据力量预置数据动态计算）
  const dispatchSuggestion = computed(() => {
    // 根据实际资源计算建议调度力量
    const stationsCount = forcePreset.value.stations?.length || 0

    return {
      // 应急物资建议数
      supplies: forcePreset.value.materials,

      // 应急人员建议数
      personnel: forcePreset.value.personnel,

      // 养护站建议数：使用实际可用养护站数量
      stations: stationsCount,

      // 应急基地
      bases: forcePreset.value.bases,

      // 挖掘机建议数
      // excavators: Math.max(1, Math.ceil(stationsCount / 2)),

      // 应急装备
      excavators: forcePreset.value.equipment,

      // 阻断信息：固定建议
      blockInfo: '需发布',

      // 交通管制：固定建议
      trafficControl: '需要'
    }
  })

  // 计算属性
  const totalResources = computed(() => {
    return (
      forcePreset.value.equipment +
      forcePreset.value.bases +
      forcePreset.value.personnel
    )
  })

  /**
   * 更新搜索半径
   * @param {number} radius - 新的搜索半径(km)
   */
  const updateSearchRadius = (radius) => {
    if (typeof radius === 'number' && radius > 0) {
      forcePreset.value.searchRadius = radius
      console.log(`[useDisasterData] 搜索半径已更新为: ${radius}km`)
    } else {
      console.warn('[useDisasterData] 无效的搜索半径值:', radius)
    }
  }

  /**
   * 将储备中心/预置点接口返回的数据转换为通用 stations 结构
   * @param {Array} reserveData - /yhYjll/list 接口数据
   * @param {Object} disasterCenter - 灾害中心点坐标 { longitude, latitude }
   * @returns {Array} 标准化的 stations 数组
   */
  const transformReserveDataToStations = (reserveData = [], disasterCenter = {}) => {
    if (!Array.isArray(reserveData)) {
      console.warn('[useDisasterData] transformReserveDataToStations: 输入数据不是数组')
      return []
    }

    if (reserveData.length === 0) {
      console.warn('[useDisasterData] transformReserveDataToStations: 输入数据为空数组')
      return []
    }

    console.log(`[useDisasterData] 开始转换 ${reserveData.length} 条储备中心/预置点数据`)

    return reserveData.map((item, index) => {
      // 1. 提取并验证类型
      const typeCode = String(item?.gl1Lx ?? '').trim()
      if (!typeCode) {
        console.warn(`[useDisasterData] 数据项 ${index} 缺少 gl1Lx 字段:`, item)
      }
      const isReserveCenter = typeCode === '2'
      const type = isReserveCenter ? 'reserveCenter' : 'presetPoint'

      // 2. 提取经纬度
      const longitude = typeof item?.gl1Lng === 'number' ? item.gl1Lng : null
      const latitude = typeof item?.gl1Lat === 'number' ? item.gl1Lat : null

      // 3. 计算距离(如果接口未提供)
      let distance = null
      if (
        longitude !== null &&
        latitude !== null &&
        typeof disasterCenter?.longitude === 'number' &&
        typeof disasterCenter?.latitude === 'number'
      ) {
        distance = Number(
          calculateDistance(
            { longitude, latitude },
            { longitude: disasterCenter.longitude, latitude: disasterCenter.latitude }
          ).toFixed(2)
        )
      }

      // 4. 构造标准格式
      const station = {
        id: item?.gl1Id || `reserve-${index}`,
        name: item?.gl1Yjllmc?.trim() || (isReserveCenter ? '储备中心' : '预置点'),
        distance,
        type,
        longitude,
        latitude,
        district: item?.gl1Qxmc || '-',
        personnelCount: Number(item?.gl1Rysl) || 0,
        area: item?.gl1Zdmj || '-'
      }

      console.log(`[useDisasterData] 转换成功: ${station.name} (${type}, ${distance}km)`)
      return station
    })
  }

  /**
   * 计算两个经纬度点之间的距离(公里)
   * 使用 Haversine 公式
   * @param {Object} pointA - { longitude, latitude }
   * @param {Object} pointB - { longitude, latitude }
   * @returns {number} 距离(km)
   */
  const EARTH_RADIUS_KM = 6371
  const calculateDistance = (pointA, pointB) => {
    if (
      typeof pointA?.longitude !== 'number' ||
      typeof pointA?.latitude !== 'number' ||
      typeof pointB?.longitude !== 'number' ||
      typeof pointB?.latitude !== 'number'
    ) {
      console.warn('[useDisasterData] calculateDistance: 坐标参数无效')
      return 0
    }

    const lat1 = toRadians(pointA.latitude)
    const lat2 = toRadians(pointB.latitude)
    const deltaLat = toRadians(pointB.latitude - pointA.latitude)
    const deltaLon = toRadians(pointB.longitude - pointA.longitude)

    const a =
      Math.sin(deltaLat / 2) ** 2 +
      Math.cos(lat1) * Math.cos(lat2) * Math.sin(deltaLon / 2) ** 2
    const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a))

    return EARTH_RADIUS_KM * c
  }

  /**
   * 角度转弧度
   * @param {number} degrees - 角度值
   * @returns {number} 弧度值
   */
  const toRadians = (degrees) => (degrees * Math.PI) / 180

  /**
   * 更新力量预置数据
   * @param {Object} emergencyResourcesData - 接口返回的应急资源数据
   * @param {number} emergencyResourcesData.equipmentCount - 应急装备数量
   * @param {number} emergencyResourcesData.personnelCount - 应急人员数量
   * @param {number} emergencyResourcesData.materialCount - 应急物资数量
   * @param {number} emergencyResourcesData.baseCount - 应急基地数量
   * @param {Array} emergencyResourcesData.stations - 养护站列表
   * @param {string} emergencyResourcesData.stations[].stationId - 养护站ID
   * @param {string} emergencyResourcesData.stations[].stationName - 养护站名称
   * @param {number} emergencyResourcesData.stations[].distance - 距离(km)
   * @param {Object} options - 可选配置
   * @param {boolean} options.onlyStatistics - 是否仅更新统计数据(不更新stations)
   */
  const updateForcePreset = (emergencyResourcesData, options = {}) => {
    if (!emergencyResourcesData) {
      console.warn('[useDisasterData] 应急资源数据为空,跳过更新')
      return
    }

    const { onlyStatistics = false } = options
    const {
      equipmentCount,
      personnelCount,
      materialCount,
      baseCount,
      stations
    } = emergencyResourcesData

    // 更新装备数量
    if (typeof equipmentCount === 'number') {
      forcePreset.value.equipment = equipmentCount
    }

    // 更新人员数量
    if (typeof personnelCount === 'number') {
      forcePreset.value.personnel = personnelCount
    }

    // 更新物资数量 (新增)
    if (typeof materialCount === 'number') {
      forcePreset.value.materials = materialCount
    }

    // 更新基地数量 (新增)
    if (typeof baseCount === 'number') {
      forcePreset.value.bases = baseCount
    }

    // 仅当不是"仅统计"模式时才更新养护站列表
    if (!onlyStatistics && Array.isArray(stations)) {
      // 如果baseCount未提供,则从stations长度推导
      if (typeof baseCount !== 'number') {
        forcePreset.value.bases = stations.length
      }

      forcePreset.value.stations = stations.map((station) => ({
        id: station.stationId,
        name: station.stationName?.trim() || '未命名养护站',
        distance: typeof station.distance === 'number'
          ? Number(station.distance.toFixed(2))
          : 0,
        type: 'maintenance'
      }))
    }

    console.log('[useDisasterData] 力量预置数据已更新:', forcePreset.value)
  }

  return {
    disasterInfo,
    forcePreset,
    forceDispatch,
    collaborationInfo,
    dispatchSuggestion,
    totalResources,
    updateForcePreset,
    updateSearchRadius,
    transformReserveDataToStations
  }
}
