#ifndef DATA_STRUCTURES_H
#define DATA_STRUCTURES_H

#include <string>
#include <vector>
#include <map>
#include <chrono>
#include <memory>

namespace Battlefield {

// 数据源类型枚举
enum class DataSourceType {
    UAV_SURVEILLANCE,    // 无人机侦察
    SATELLITE_IMAGERY,   // 卫星影像
    EM_SIGNAL,           // 电磁信号
    FRIENDLY_REPORT,     // 友军单位报告
    GROUND_SENSOR,       // 地面传感器
    HISTORICAL_DATA      // 历史数据
};

// 目标类型枚举
enum class TargetType {
    UNKNOWN,
    MAIN_BATTLE_TANK,    // 主战坦克
    INFANTRY_FIGHTER,    // 步兵战车
    SELF_PROPELLED_ARTILLERY, // 自行火炮
    ARMORED_PERSONNEL_CARRIER, // 装甲运兵车
    MOBILE_AIR_DEFENSE,  // 机动防空系统
    DRONE_SWARM,         // 无人机集群
    COMMAND_VEHICLE,     // 指挥车
    SUPPLY_TRUCK,        // 补给卡车
    ANCIENT_FORTIFICATION // 古代防御工事（用于文化主题）
};

// 威胁等级
enum class ThreatLevel {
    LOW,
    MEDIUM,
    HIGH,
    CRITICAL
};

// 坐标结构
struct GeoCoordinate {
    double longitude;
    double latitude;
    double altitude;  // 海拔高度
    
    GeoCoordinate(double lon = 0.0, double lat = 0.0, double alt = 0.0)
        : longitude(lon), latitude(lat), altitude(alt) {}
    
    double distanceTo(const GeoCoordinate& other) const;
};

// 目标识别结果
struct IdentifiedTarget {
    int id;
    TargetType type;
    std::string typeName;
    GeoCoordinate position;
    double confidence;      // 识别置信度 0.0-1.0
    double speed;           // 运动速度 m/s
    double heading;         // 运动方向 度
    ThreatLevel threatLevel;
    std::chrono::system_clock::time_point timestamp;
    std::vector<GeoCoordinate> trajectory;  // 历史轨迹
    std::map<std::string, std::string> metadata;
    
    // 生成唯一ID
    static int generateID() {
        static int counter = 0;
        return ++counter;
    }
    
    // 预测未来位置
    GeoCoordinate predictPosition(double timeAhead) const;
};

// 数据包结构
struct DataPacket {
    DataSourceType source;
    std::chrono::system_clock::time_point timestamp;
    GeoCoordinate origin;
    std::vector<uint8_t> payload;  // 原始数据
    std::map<std::string, std::string> metadata;
    std::vector<IdentifiedTarget> detectedTargets;
    
    // 序列化/反序列化
    std::vector<uint8_t> serialize() const;
    static DataPacket deserialize(const std::vector<uint8_t>& data);
};

// 战场态势
struct BattlefieldSituation {
    std::vector<IdentifiedTarget> enemyTargets;
    std::vector<IdentifiedTarget> friendlyUnits;
    std::vector<GeoCoordinate> pointsOfInterest;
    std::vector<std::string> detectedThreats;
    std::chrono::system_clock::time_point updateTime;
    double overallThreatLevel;  // 综合威胁等级 0-1
    
    // 获取指定区域的威胁密度
    double getThreatDensity(const GeoCoordinate& center, double radius) const;
    
    // 生成态势报告
    std::string generateReport() const;
};

// 决策建议
struct DecisionSuggestion {
    std::string id;
    std::string description;
    double feasibilityScore;     // 可行性评分
    double effectivenessScore;   // 效能评分
    double riskScore;           // 风险评分
    std::vector<std::string> requiredResources;
    std::vector<std::string> potentialOutcomes;
    std::map<std::string, double> costFactors;
    
    double getOverallScore() const {
        return feasibilityScore * 0.3 + effectivenessScore * 0.4 - riskScore * 0.3;
    }
};

} // namespace Battlefield

#endif // DATA_STRUCTURES_H