package com.dji.sample.wayline.model.enums;

import com.dji.sdk.common.IErrorInfo;
import com.fasterxml.jackson.annotation.JsonCreator;

import java.util.Arrays;

/**
 * @author sean
 * @version 1.3
 * @date 2023/2/17
 */
public enum WaylineErrorCodeEnum implements IErrorInfo {

    SUCCESS(0, "success", false),

    EMERGENCY_BUTTON(316026, "机场急停按钮被按下，无法执行飞行任务，请释放急停按钮后重试", true),
    
    NOT_IDLE(319001, "机场作业中或设备异常反馈上传日志中，无法执行飞行任务，请等待当前飞行任务或操作执行完成后重试", true),
    
    PERFORMING_TASK(319016, "机场正在执行其他飞行任务，无法执行本次飞行任务", true),
    
    EXPORTING_LOGS(319018, "机场正在自动导出日志中（设备异常反馈），无法执行飞行任务，请稍后重试", true),
    
    PULLING_LOGS(319019, "机场正在拉取日志中（设备异常反馈），无法执行飞行任务，请稍后重试", true),
    
    HEIGHT_LIMIT(321513, "航线规划高度已超过飞行器限高，机场无法执行飞行任务", true),
    
    DISTANCE_LIMIT(321514, "任务失败，起点或终点位于限远区域的缓冲区内或超过了限远距离", true),

    RESTRICTED_FLIGHT_AREA(321515, "航线穿过限飞区，机场无法执行飞行任务", true),
    
    SDR_DISCONNECT(514120, "机场与飞行器断连，请重启机场后重试或重新对频", true),

    HEAVY_RAIN(514134, "雨量过大，机场无法执行飞行任务，请稍后重试", true),
    
    STRONG_WIND(514135, "风速过大，机场无法执行飞行任务，请稍后重试", true),
    
    POWER_DISCONNECT(514136, "机场供电断开，机场无法执行飞行任务，请恢复机场供电后重试", true),

    LOW_TEMPERATURE(514137, "环境温度过低于-20℃ (-4°F)，机场无法执行飞行任务，请稍后重试", true),

    DEBUGGING(514145, "机场处于现场调试中，无法执行当前操作或执行飞行任务，请断开遥控器和机场的数据线连接后重试", true),

    REMOTE_DEBUGGING(514146, "机场处于远程调试中，无法执行飞行任务，请退出远程调试后重试", true),

    DOCK_UPGRADING(514147, "设备升级中，无法进行远程调试或执行飞行任务，请等待升级完成后重试", true),

    DOCK_WORKING(514148, "机场已经在作业中，无法进行远程调试或再次执行飞行任务，请等待当前任务执行完成后重试", true),

    UNKNOWN(-1, "Unknown wayline error.", false);
    
    private String msg;

    private int code;

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

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

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

    public boolean isBlock() {
        return block;
    }

    @JsonCreator(mode = JsonCreator.Mode.DELEGATING)
    public static WaylineErrorCodeEnum find(int code) {
        return Arrays.stream(WaylineErrorCodeEnum.values()).filter(error -> error.code == code).findAny().orElse(UNKNOWN);
    }
}
