package com.dji.sdk.cloudapi.wayline;

import com.dji.sdk.common.IErrorInfo;
import com.dji.sdk.mqtt.events.IEventsErrorCode;
import com.dji.sdk.mqtt.services.IServicesErrorCode;
import com.fasterxml.jackson.annotation.JsonCreator;

import java.util.Arrays;

/**
 * @author sean.zhou
 * @version 0.1
 * @date 2021/11/25
 */
public enum WaylineErrorCodeEnum implements IServicesErrorCode, IEventsErrorCode, IErrorInfo {

    SUCCESS(0, "success"),

    WRONG_PARAM(314001, "飞行任务下发失败，请稍后重试"),

    MD5_EMPTY(314002, "飞行任务下发失败，请稍后重试.已发布的航路线任务MD5为空"),

    WRONG_WAYLINE_FILE(314003, "航线文件格式不兼容，请检查航线文件是否正确"),

    DISTRIBUTE_TASK_FAILED_1(314004, "飞行任务下发失败"),

    MD5_CHECK_FAILED(314005, "飞行任务下发失败，请稍后重试或重启机场后重试.航线MD5验证失败"),

    INITIATE_AIRCRAFT_FAILED_1(314006, "飞行器初始化失败，请重启机场后重试"),

    TRANSFER_KMZ_FILE_FAILED(314007, "机场传输航线至飞行器失败，请重启机场后重试"),

    PREPARATION_TIMED_OUT(314008, "飞行器起飞前准备超时，请重启机场后重试"),

    INITIATE_AIRCRAFT_FAILED_2(314009, "飞行器初始化失败，请重启机场后重试"),

    PERFORM_TASK_FAILED(314010, "航线执行失败，请重启机场后重试"),

    QUERY_TIMEOUT(314011, "机场系统异常，无法获取飞行任务执行结果"),

    PREPARATION_FAILED_1(314012, "飞行器起飞前准备失败，无法执行飞行任务，请重启机场后重试"),

    WRONG_KMZ_URL(314013, "飞行任务下发失败，机场无法获取到本次飞行任务的航线，无法执行飞行任务，请稍后重试"),

    DOCK_SYSTEM_ERROR_1(314014, "机场系统异常，飞行任务执行失败，请稍后重试"),

    CLOSE_FOURTH_GENERATION_FAILED(314015, "机场传输精准复拍航线至飞行器失败，无法执行飞行任务，请稍后重试或重启机场后重试"),

    PROCESS_KMZ_FILE_FAILED_1(314016, "航线文件解析失败，无法执行飞行任务，请检查航线文件"),

    MODIFY_KMZ_FILE_FAILED(314017, "机场系统异常，飞行任务执行失败，请稍后重试"),

    AIRCRAFT_RTK_ERROR(314018, "飞行器 RTK 定位异常，无法执行飞行任务，请稍后重试或重启机场后重试"),

    CONVERGE_RTK_FAILED_1(314019, "飞行器 RTK 收敛失败，无法执行飞行任务，请稍后重试或重启机场后重试"),

    AIRCRAFT_POSITION_ERROR(314020, "飞行器不在停机坪正中间或飞行器朝向不正确，无法执行飞行任务，请检查飞行器位置和朝向"),

    AIRCRAFT_RTK_POSITIONING_ERROR(314021, "飞行器 RTK 定位异常，无法执行飞行任务，请稍后重试或重启机场后重试"),

    MODIFY_KMZ_BREAKPOINT_FILE_FAILED(314022, "修改从断点恢复飞行的kmz文件失败"),

    SETTING_BACKUP_LANDING_POINT_FAILED(316001, "飞行器参数配置失败，请重启机场后重试"),

    SETTING_BACKUP_SAFE_HEIGHT_FAILED(316002, "飞行器参数配置失败，请重启机场后重试"),

    SETTING_TAKEOFF_HEIGHT_FAILED(316003, "起飞高度设置失败。注:飞机安全起飞高度默认设置为1.8米。飞机起飞后会飞到1.8米，在0-1.8米的起飞过程中不能中断，其他动作只有在起飞后才能进行。默认情况下，该高度由机场配置，不支持修改。这样做的目的是为了防止人身伤害"),

    SETTING_OUT_OF_CONTROL_ACTION_FAILED(316004, "航线完成动作设置失败"),

    CONVERGE_RTK_FAILED_2(316005, "飞行器 RTK 收敛失败，无法执行飞行任务，请重启机场后重试"),

    DOCK_PREPARATION_FAILED(316006, "任务超时，飞行器已丢失或降落时机场未开启舱盖或展开推杆，飞行器无法降落回机场，请尽快至机场部署现场检查飞行器状况"),

    INITIATE_AIRCRAFT_FAILED(316007, "飞行器初始化失败，请重启机场后重试"),

    OBTAIN_FLIGHT_CONTROL_FAILED(316008, "机场获取飞行器控制权失败，无法执行飞行任务，请确认遥控器未锁定控制权"),

    LOW_POWER(316009, "飞行器电量低于30%，无法执行飞行任务，请充电后重试（建议电量≥50%）"),

    AIRCRAFT_NOT_DETECTED(316010, "机场未检测到飞行器，无法执行飞行任务，请检查舱内是否有飞行器，机场与飞行器是否已对频，或重启机场后重试"),

    LANDED_ON_INCORRECT_LOCATION(316011, "飞行器降落位置偏移过大，请检查飞行器是否需要现场摆正"),

    FOLDER_COLORING_FAILED(316012, "飞行器起飞前准备失败，无法执行飞行任务，请重启机场后重试"),

    OBTAIN_BATTERY_POWER_FAILED(316013, "飞行器起飞前准备失败，查询电池电量失败"),

    FLIGHT_CONTROL_PUSHING_TIMED_OUT(316014, "飞行器起飞前准备失败，无法执行飞行任务，请重启机场后重试"),

    AIRCRAFT_LOCATION_TOO_FAR(316015, "飞行器 RTK 收敛位置距离机场过远，无法执行飞行任务，请重启机场后重试"),

    LANDING_TIMEOUT(316016, "飞行器降落至机场超时，可能是机场与飞行器断连导致，请通过直播查看飞行器是否降落至舱内"),

    OBTAIN_MEDIA_TIMEOUT(316017, "获取飞行器媒体数量超时，可能是机场与飞行器断连导致，请通过直播查看飞行器是否降落至舱内"),

    TASK_PERFORMANCE_TIMED_OUT(316018, "飞行任务执行超时，可能是机场与飞行器断连导致，请通过直播查看飞行器是否降落至舱内"),

    CAMERA_COLORING_TIMED_OUT(316019, "机场系统错误，开启负载相机超时，无法执行飞行任务，请稍后重试"),

    RTK_SOURCE_ERROR(316020, "飞行器使用的 RTK 信号源错误，请稍后重试"),

    RTK_SOURCE_TIMEOUT(316021, "飞行器 RTK 信号源检查超时，请稍后重试"),

    AIRCRAFT_NOT_CONNECTED(316022, "飞行器无法执行返航指令，请检查飞行器是否已开机，机场与飞行器是否已断连，请确认无以上问题后重试"),

    NO_FLIGHT_CONTROL_1(316023, "飞行器无法执行返航指令，飞行器已被 B 控接管，请在 B 控操控飞行器，或关闭 B 控后重试"),

    WRONG_COMMAND(316024, "飞行器执行返航指令失败，请检查飞行器是否已起飞，确认飞行器已起飞后请重试"),

    SETTING_AIRCRAFT_PARAMETERS_FAILED(316025, "飞行器参数配置失败，请稍后重试或重启机场后重试"),

    EMERGENCY_BUTTON_PRESSED_DOWN(316026, "机场急停按钮被按下，无法执行飞行任务，请释放急停按钮后重试"),

    SETTING_AIRCRAFT_PARAMETERS_TIMEOUT(316027, "飞行器参数配置超时，请稍后重试或重启机场后重试"),

    FLYING_TO_BACKUP_POINT_1(316029, "机场急停按钮被按下，飞行器将飞往备降点降落，请立即检查飞行器是否已安全降落并将飞行器放回至机场"),

    REFRESH_HOME_POINT_FAILED(316030, "返航点刷新失败，请稍后重试或重启机场后重试"),

    SETTING_RTH_MODE_FAILED(316031, "设置返航模式失败，请稍后重试或重启机场后重试"),

    // TODO：316032 获取电池数据超时，请稍后重试或重启飞行器后重试
    // TODO：316033 飞行器电池循环次数过高，为保证飞行安全，已自动终止任务，建议更换该电池
    // TODO：316034 无法起飞，飞行器固件版本与机场固件版本不匹配，为保证飞行安全请升级固件后再试
    // TODO：316035 进离场航线下发失败，请确保设备固件为最新版本后重新下发任务，如果持续报错，请联系大疆售后。
    
    LOW_POWER_LANDING_OUTSIDE(316050, "飞行器因电量过低在舱外降落，请立即检查飞行器是否已安全降落并将飞行器放回至机场"),

    TASK_ABNORMAL_LANDING_OUTSIDE(316051, "飞行任务异常，飞行器在舱外降落，请立即检查飞行器是否已安全降落并将飞行器放回至机场"),

    FLYING_TO_BACKUP_POINT_2(316052, "飞行任务异常，飞行器将飞往备降点降落，请立即检查飞行器是否已安全降落并将飞行器放回至机场"),

    USER_CONTROL_LANDING(316053, "用户已操控飞行器降落，请立即检查飞行器是否已安全降落并将飞行器放回至机场"),

    OBTAIN_MEDIA_FAILED(317001, "获取飞行器媒体文件数量失败，请重启机场后重试"),

    CAMERA_NOT_CONNECTED(317002, "飞行器存储格式化失败，飞行器未开机、未连接或未检测到相机，请确认无以上问题后重试，或重启飞行器后重试"),

    FORMAT_AIRCRAFT_STORAGE_FAILED(317003, "飞行器存储格式化失败，请重启飞行器后重试"),

    FORMAT_MEDIA_FILES_FAILED(317004, "机场媒体文件格式化失败，请稍后重试或重启机场后重试"),

    STOP_RECORDING_FAILED(317005, "飞行器结束录像失败，本次飞行任务的媒体文件可能无法上传"),

    NOT_IDLE(319001, "机场作业中或设备异常反馈上传日志中，无法执行飞行任务，请等待当前飞行任务或操作执行完成后重试"),

    DOCK_SYSTEM_ERROR_2(319002, "机场系统运行异常，请重启机场后重试"),

    TASK_ID_NOT_EXIST(319003, "机场系统运行异常，请重新下发任务，任务ID异常"),

    TASK_EXPIRE(319004, "飞行任务执行超时，已自动终止本次飞行任务"),

    FLIGHTTASK_EXECUTE_COMMAND_TIMEOUT(319005, "云端与机场通信异常，无法执行飞行任务"),

    CANCEL_TASK_FAILED_1(319006, "取消飞行任务失败，飞行任务已经在执行中"),

    EDIT_TASK_FAILED(319007, "修改飞行任务失败，飞行任务已经在执行中"),

    TIME_NOT_SYNCED(319008, "机场时间与云端时间不同步，机场无法执行飞行任务"),

    DISTRIBUTE_TASK_FAILED_2(319009, "飞行任务下发失败，请稍后重试或重启机场后重试"),

    VERSION_TOO_EARLY(319010, "机场固件版本过低，无法执行飞行任务，请升级机场固件为最新版本后重试"),

    INITIALIZING_DOCK(319015, "机场正在初始化中，无法执行飞行任务，请等待机场初始化完成后重试"),

    PERFORMING_OTHER_TASK(319016, "机场正在执行其他飞行任务，无法执行本次飞行任务"),

    PROCESSING_MEDIA_FILE(319017, "机场正在处理上次飞行任务媒体文件，无法执行本次飞行任务，请稍后重试"),

    EXPORTING_LOGS(319018, "机场正在自动导出日志中（设备异常反馈），无法执行飞行任务，请稍后重试"),

    PULLING_LOGS(319019, "机场正在拉取日志中（设备异常反馈），无法执行飞行任务，请稍后重试"),

    PAUSE_TASK_FAILED(319020, "航线中断失败，请稍后重试"),

    DISABLE_FLIGHT_CONTROL_FAILED(319021, "退出远程控制失败，请稍后重试"),

    FLYTO_TASK_FAILED(319022, "指点飞行失败，请稍后重试"),

    STOP_FLYTO_TASK_FAILED(319023, "指点飞行停止失败，请稍后重试"),

    TAKING_OFF_TASK_FAILED(319024, "一键起飞失败，请稍后重试"),

    TASK_IN_PREPARATION(319025, "机场未准备完成，无法执行云端下发的飞行任务，请稍后重试"),

    LOW_POWER_THAN_SET_VALUE(319026, "飞行器电池电量低于用户设置的任务开始执行的电量，请等待充电完成后再执行飞行任务"),

    INSUFFICIENT_STORAGE(319027, "机场或飞行器剩余存储容量过低，无法执行飞行任务，请等待媒体文件上传，机场和飞行器存储容量释放后再执行飞行任务"),

    NO_FLIGHT_CONTROL_2(319030, "操作失败，无飞行器控制权"),

    NO_PAYLOAD_CONTROL(319031, "控制权异常，请刷新重试"),

    WRONG_POINT_NUMBER(319032, "指点飞行失败，请稍后重试"),

    SEQ_NUMBER_SMALLER_THAN_LAST(319033, "DRC 虚拟摇杆操作失败，请稍后重试"),

    DELAY_TIME_SMALLER_THAN_SET(319034, "DRC 虚拟摇杆操作失败，请稍后重试"),

    EMERGENCY_STOP_FAILED(319035, "急停失败，请稍后重试"),

    REMOTE_DEBUGGING_MODE(319036, "设备远程调试中，请稍后重试"),

    ONSITE_DEBUGGING_MODE(319037, "设备本地调试中，请稍后重试"),

    UPDATING(319038, "设备正在升级，请稍后重试"),

    RESUME_TASK_FAILED(319042, "航线恢复失败，请稍后重试"),

    CANCEL_TASK_FAILED_2(319043, "取消返航失败，请稍后重试"),

    NO_BREAKPOINT(319044, "航线任务已结束，无法恢复"),

    EMERGENCY_STOP_STATUS(319045, "急停成功，请重新进入DRC 虚拟遥杆进行按键操作"),

    NOT_IN_WAYLINE(319046, "无法暂停航线，飞行器尚未进入航线或已退出航线"),

    DOCK_SYSTEM_ERROR_3(319999, "机场系统运行异常，请重启机场后重试"),

    TASK_ERROR(321000, "航线执行异常，请稍后重试或重启机场后重试"),

    PROCESS_KMZ_FILE_FAILED_2(321004, "航线文件解析失败，无法执行飞行任务，请检查航线文件"),

    MISSING_BREAKPOINT(321005, "航线缺少断点信息，机场无法执行飞行任务"),

    TASK_IN_PROGRESS(321257, "飞行任务已在执行中，请勿重复执行"),

    STATUS_NOT_SUPPORTED(321258, "飞行任务无法终止，请检查飞行器状态"),

    NOT_STARTED_CANNOT_STOP(321259, "飞行任务未开始执行，无法终止飞行任务"),

    NOT_STARTED_CANNOT_INTERRUPT(321260, "飞行任务未开始执行，无法中断飞行任务"),

    HEIGHT_LIMIT(321513, "航线规划高度已超过飞行器限高，机场无法执行飞行任务"),

    DISTANCE_LIMIT(321514, "任务失败，起点或终点位于限远区域的缓冲区内或超过了限远距离"),

    GEO_ZONE(321515, "航线穿过限飞区，机场无法执行飞行任务"),

    HEIGHT_TOO_LOW(321516, "飞行器飞行高度过低，飞行任务执行被终止"),

    OBSTACLE_SENSED(321517, "飞行器触发避障，飞行任务执行被终止。为保证飞行安全，请勿用当前航线执行断点续飞任务"),

    APPROACHED_GEO_ZONE(321519, "飞行器接近限飞区或限远距离自动返航，无法完成航线飞行"),

    PROPELLER_CHECK_FAILED(321523, "飞行器起飞失败，请稍后重试，如果仍报错请联系大疆售后。"),

    PREPARATION_FAILED_2(321524, "飞行器起飞前准备失败，可能是飞行器无法定位或档位错误导致，请检查飞行器状态"),

    WEAK_GPS(321769, "飞行器卫星定位信号差，无法执行飞行任务，请重启机场后重试"),

    WRONG_GEAR_MODE(321770, "飞行器挡位错误，无法执行飞行任务，请重启机场后重试"),

    HOME_POINT_NOT_SET(321771, "飞行器返航点未设置，无法执行飞行任务，请重启机场后重试"),

    LOW_POWER_PERFORM_TASK(321772, "飞行器电量低于30%，无法执行飞行任务，请充电后重试（建议电量≥50%）"),

    LOW_POWER_RTH(321773, "飞行器执行飞行任务过程中低电量返航，无法完成航线飞行"),

    AIRCRAFT_SIGNAL_LOST(321775, "飞行器航线飞行过程中失联，无法完成航线飞行"),

    RTK_NOT_READY(321776, "飞行器 RTK 收敛失败，无法执行飞行任务，请重启机场后重试"),

    NOT_HOVERING(321777, "飞行器未悬停，无法开始执行飞行任务"),

    B_CONTROL_PROPELLERS(321778, "用户使用 B 控操控飞行器起桨，机场无法执行飞行任务"),
    
    USER_CONTROL(322282, "机场执行飞行任务过程中被中断，飞行器被云端用户或遥控器接管"),

    USER_SEND_RTH(322283, "机场执行飞行任务过程中被用户触发返航，无法完成航线飞行"),

    WRONG_BREAKPOINT(322539, "航线的断点信息错误，机场无法执行飞行任务"),

    EMPTY_ACTION_LAYER(322594, "The layer of action tree can not be empty."),

    WRONG_TASK(386535, "航线执行异常，请稍后重试或重启机场后重试"),

    SET_MEDIA_PRIORITY_FAILED(324030, "因机场网络异常、飞行器图传链路异常等原因，媒体文件暂时无法上传或文件已上传但云端读取失败"),

    MEDIA_PRIORITY_COMMAND_TOO_FAST(324031, "媒体上传优先级设置失败，发出命令动作太快，对最后一条命令的响应还没有结束。"),

    MEDIA_PRIORITY_WRONG_PARAMETER(324032, "设置媒体上传优先级失败，参数错误。"),

    UNKNOWN(-1, "UNKNOWN"),

    ;


    private final String msg;

    private final int code;

    WaylineErrorCodeEnum(int code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    @Override
    public String getMessage() {
        return this.msg;
    }

    @Override
    public Integer getCode() {
        return this.code;
    }

    @Override
    public String toString() {
        return "{" +
                "code='" + code + '\'' +
                ", message=" + msg +
                '}';
    }

    /**
     * @param code error code
     * @return enumeration object
     */
    @JsonCreator
    public static WaylineErrorCodeEnum find(int code) {
        return Arrays.stream(values()).filter(codeEnum -> codeEnum.code == code).findAny().orElse(UNKNOWN);
    }

}
