package com.ruoyi.dj.mqtt.domain;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;

import java.util.List;

@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class OSDMessage4 {
    private String tid;
    private String bid;
    private long timestamp;
    private DataDetail data;
    private String gateway;

    @Data
    @JsonIgnoreProperties(ignoreUnknown = true)
    public static class DataDetail {
        private Gimbal gimbal;  // 云台信息
        private long activation_time;  // 激活时间
        private double attitude_head;  // 姿态航向
        private double attitude_pitch;  // 姿态俯仰角
        private double attitude_roll;  // 姿态横滚角
        private Battery battery;  // 电池信息
        private String best_link_gateway;  // 最佳链路网关
        private List<Camera> cameras;  // 相机信息数组
        private String country;  // 国家
        private DistanceLimitStatus distance_limit_status;  // 距离限制状态
        private double elevation;  // 海拔高度
        private int gear;  // 档位
        private double height;  // 高度
        private int height_limit;  // 高度限制
        private double home_distance;  // 距离起点的距离
        private double horizontal_speed;  // 水平速度
        private int is_near_area_limit;  // 是否接近区域限制
        private int is_near_height_limit;  // 是否接近高度限制
        private double latitude;  // 纬度
        private double longitude;  // 经度
        private MaintainStatus maintain_status;  // 保养状态
        private int mode_code;  // 模式代码
        private int night_lights_state;  // 夜灯状态
        private ObstacleAvoidance obstacle_avoidance;  // 障碍物回避信息
        private PositionState position_state;  // 位置状态
        private int rc_lost_action;  // 遥控信号丢失后的动作
        private boolean rid_state;  // RID状态
        private int rth_altitude;  // 返回高度
        private Storage storage;  // 存储信息
        private double total_flight_distance;  // 总飞行距离
        private int total_flight_sorties;  // 总飞行架次
        private double total_flight_time;  // 总飞行时间
        private String track_id;  // 轨迹ID
        private double vertical_speed;  // 垂直速度
        private int wind_direction;  // 风向
        private double wind_speed;  // 风速

        @Data
        @JsonIgnoreProperties(ignoreUnknown = true)
        public static class Gimbal {
            private double gimbal_pitch;  // 云台俯仰角
            private double gimbal_roll;  // 云台横滚角
            private double gimbal_yaw;  // 云台航向角
            private String payload_index;  // 载荷索引
            private int thermal_current_palette_style;  // 热成像当前调色板样式
            private int thermal_gain_mode;  // 热成像增益模式
            private double thermal_global_temperature_max;  // 热成像全球最高温度
            private double thermal_global_temperature_min;  // 热成像全球最低温度
            private int thermal_isotherm_lower_limit;  // 热成像等温线下限
            private int thermal_isotherm_state;  // 热成像等温线状态
            private int thermal_isotherm_upper_limit;  // 热成像等温线上限
            private double zoom_factor;  // 变焦因子
        }

        @Data
        @JsonIgnoreProperties(ignoreUnknown = true)
        public static class Battery {
            private List<BatteryDetail> batteries;  // 电池详细信息数组
            private int capacity_percent;  // 电池剩余容量百分比
            private int landing_power;  // 着陆功率
            private int remain_flight_time;  // 剩余飞行时间
            private int return_home_power;  // 返回家功率

            @Data
            @JsonIgnoreProperties(ignoreUnknown = true)
            public static class BatteryDetail {
                private int capacity_percent;  // 电池剩余容量百分比
                private String firmware_version;  // 固件版本
                private int high_voltage_storage_days;  // 高电压存储天数
                private int index;  // 电池索引
                private int loop_times;  // 循环次数
                private String sn;  // 序列号
                private int sub_type;  // 子类型
                private double temperature;  // 温度
                private int type;  // 类型
                private int voltage;  // 电压
            }
        }

        @Data
        @JsonIgnoreProperties(ignoreUnknown = true)
        public static class Camera {
            private int camera_mode;  // 相机模式
            private int ir_metering_mode;  // 红外测光模式
            private IrMeteringPoint ir_metering_point;  // 红外测光点
            private double ir_zoom_factor;  // 红外变焦因子
            private LiveviewWorldRegion liveview_world_region;  // 实时视图世界区域
            private String payload_index;  // 载荷索引
            private int photo_state;  // 照片状态
            private String[] photo_storage_settings;  // 照片存储设置
            private int record_time;  // 记录时间
            private int recording_state;  // 记录状态
            private int remain_photo_num;  // 剩余照片数量
            private int remain_record_duration;  // 剩余记录时长
            private boolean screen_split_enable;  // 是否启用分屏
            private int wide_calibrate_farthest_focus_value;  // 宽视角校准最远焦点值
            private int wide_calibrate_nearest_focus_value;  // 宽视角校准最近焦点值
            private int wide_exposure_mode;  // 宽视角曝光模式
            private int wide_exposure_value;  // 宽视角曝光值
            private int wide_focus_mode;  // 宽视角对焦模式
            private int wide_focus_state;  // 宽视角对焦状态
            private int wide_focus_value;  // 宽视角对焦值
            private int wide_iso;  // 宽视角ISO
            private int wide_max_focus_value;  // 宽视角最大对焦值
            private int wide_min_focus_value;  // 宽视角最小对焦值
            private int wide_shutter_speed;  // 宽视角快门速度
            private int zoom_calibrate_farthest_focus_value;  // 变焦校准最远焦点值
            private int zoom_calibrate_nearest_focus_value;  // 变焦校准最近焦点值
            private int zoom_exposure_mode;  // 变焦曝光模式
            private int zoom_exposure_value;  // 变焦曝光值
            private double zoom_factor;  // 变焦因子
            private int zoom_focus_mode;  // 变焦对焦模式
            private int zoom_focus_state;  // 变焦对焦状态
            private int zoom_focus_value;  // 变焦对焦值
            private int zoom_iso;  // 变焦ISO
            private int zoom_max_focus_value;  // 变焦最大对焦值
            private int zoom_min_focus_value;  // 变焦最小对焦值
            private int zoom_shutter_speed;  // 变焦快门速度

            @Data
            @JsonIgnoreProperties(ignoreUnknown = true)
            public static class IrMeteringPoint {
                private double temperature;  // 温度
                private double x;  // X坐标
                private double y;  // Y坐标
            }

            @Data
            @JsonIgnoreProperties(ignoreUnknown = true)
            public static class LiveviewWorldRegion {
                private double bottom;  // 底部
                private double left;  // 左侧
                private double right;  // 右侧
                private double top;  // 顶部
            }
        }

        @Data
        @JsonIgnoreProperties(ignoreUnknown = true)
        public static class DistanceLimitStatus {
            private int distance_limit;  // 距离限制
            private int is_near_distance_limit;  // 是否接近距离限制
            private int state;  // 状态
        }

        @Data
        @JsonIgnoreProperties(ignoreUnknown = true)
        public static class MaintainStatus {
            private List<MaintainStatusArray> maintain_status_array;  // 保养状态数组

            @Data
            @JsonIgnoreProperties(ignoreUnknown = true)
            public static class MaintainStatusArray {
                private int state;  // 保养状态
                private int last_maintain_type;  // 上一次保养类型
                private long last_maintain_time;  // 上一次保养时间
                private int last_maintain_flight_sorties;  // 上一次保养时飞行架次
                private double last_maintain_flight_time;  // 上一次保养时飞行时间
            }
        }

        @Data
        @JsonIgnoreProperties(ignoreUnknown = true)
        public static class ObstacleAvoidance {
            private int downside;  // 下侧
            private int horizon;  // 水平
            private int upside;  // 上侧
        }

        @Data
        @JsonIgnoreProperties(ignoreUnknown = true)
        public static class PositionState {
            private int gps_number;  // GPS数量
            private int is_fixed;  // 是否固定
            private int quality;  // 质量
            private int rtk_number;  // RTK数量
        }

        @Data
        @JsonIgnoreProperties(ignoreUnknown = true)
        public static class Storage {
            private long total;  // 总容量
            private long used;  // 已使用容量
        }
    }
}
