package com.jsowell.pile.dto.camera;

import com.alibaba.fastjson2.annotation.JSONField;
import lombok.Data;

import java.util.List;

/**
 * 识别结果推送
 *
 * @author Lemon
 * @Date 2023/12/5 11:08:07
 */
@Data
public class CameraIdentifyResultsDTO {
    /**
     * 识别id
     */
    @JSONField(name = "reco_id")
    private Integer recoId;

    /**
     * 结果序列号
     */
    private String serial;

    /**
     * UTC时间
     */
    @JSONField(name = "time_s")
    private Integer times;

    /**
     * 触发类型
     *
     * 5:虚拟线圈触发;
     * 6:稳定触发;
     * 7:IO强制触发;
     * 8:手动触发;
     * 9:SDK抓拍;
     * 10:实时结果（车辆实时入场事件）
     * 12:单帧识别结果;
     * 13:定时触发;
     */
    @JSONField(name = "trigger_type")
    private Integer triggerType;

    /**
     * 适配通道
     */
    @JSONField(name = "chnlid")
    private Integer chnlId;

    /**
     * 设备信息对象
     */
    @JSONField(name = "device_info")
    private DeviceInfo deviceInfo;

    /**
     * 报警信息对象
     */
    @JSONField(name = "alarm_info")
    private AlarmInfo alarmInfo;

    /**
     * 背景图信息对象(数组)
     */
    @JSONField(name = "bg_img")
    private List<BgImg> bgImgList;

    /**
     * 特征图信息对象(数组)
     */
    @JSONField(name = "feture_img")
    private List<FetureImg> fetureImgList;

    /**
     * 路内产品信息
     */
    @JSONField(name = "product_h")
    private ProductH productH;




    @Data
    public static class DeviceInfo{
        /**
         * 设备名
         * UTF8+BASE64编码
         */
        @JSONField(name = "dev_name")
        private String devName;

        /**
         * 设备ip地址
         */
        private String ip;

        /**
         * 设备sn编号
         */
        private String sn;
    }

    @Data
    public static class AlarmInfo{
        /**
         * 报警状态
         *
         * 0:无报警,默认值(取消报警)
         * 1:视频遮挡
         * 3:占用双车位/压线停车
         * 4:非机动车/摩托车
         * 5:车头/车尾方向不一致
         * 7:无牌车
         * 9：行人滞留(预留)
         * （10-99:保留）
         * ==“占用双车位/压线停车”和“车头/车尾方向不一致”,报警属于证据链==
         */
        @JSONField(name = "alarm_status")
        private Integer alarmStatus;

        /**
         * 白名单/准入车型状态
         * 1:在白名单/准入车型内，且有效
         *
         * 2:不在白名单/准入车型内，或验证未通过
         * ==启用白名单后，优先判断白名单==
         *
         */
        @JSONField(name = "alarm_whitelist")
        private Integer alarmWhiteList;
    }

    @Data
    public static class BgImg{
        /**
         * 图片数据
         * base64格式的数据
         */
        private String image;

        /**
         * 图片原始大小
         * 字节数
         */
        @JSONField(name = "image_length")
        private Integer imageLength;

        /**
         * 图片发送标志
         */
        @JSONField(name = "image_send_flag")
        private Integer imageSendFlag;

        /**
         * 图片的索引id
         */
        private String key;

        /**
         * 图片缓存的路径名
         */
        private String path;

        /**
         * 图片分辨率
         */
        private Resolution resolution;
    }

    @Data
    public static class FetureImg{
        private Integer type;
        private String image;

        @JSONField(name = "image_length")
        private Integer imageLength;

        @JSONField(name = "image_send_flag")
        private Integer imageSendFlag;
        private String key;
        private String path;
        private Resolution resolution;
    }

    @Data
    public static class ProductH{

        /**
         * 车辆信息对象
         */
        @JSONField(name = "car_pos")
        private CarPos carPos;

        /**
         * 车位信息对象
         */
        private Parking parking;

        /**
         * 车牌信息对象
         */
        private Plate plate;

        /**
         * 识别信息对象
         */
        private Reco reco;


        @Data
        private static class CarPos{
            /**
             * 位置坐标对象
             * 按照背景图的分辨率
             */
            private Loc loc;

            /**
             * 车头车尾信息
             * 0:无效;
             * 1:车头;
             * 2:车尾
             */
            private Integer pos;
        }

        @Data
        public static class Parking{
            private Loc loc;

            /**
             * 车位状态
             *
             * 0x01：入场；
             * 0x02：在场；
             * 0x04：出场；
             * 0x08：空场；
             * 0x10：车位异常(=="跨车位报警"和"视频遮挡"时==)；
             * 0x20：延迟上报出场(预留)；
             * 0x40：合并出入场(预留)；
             * 0x80：预入场(预留)；
             * 0x100：预出场(预留)；
             * 0x200：入场修正(预留)
             */
            @JSONField(name = "parking_state")
            private Integer parkingState;

            /**
             * 车位id
             */
            @JSONField(name = "zone_id")
            private Integer zoneId;

            /**
             * 车位名
             */
            @JSONField(name = "zone_name")
            private String zoneName;

            @Data
            private static class Loc{

                /**
                 * 坐标点
                 */
                @JSONField(name = "point")
                private List<Point> pointList;

                /**
                 * 坐标点个数
                 */
                @JSONField(name = "point_num")
                private Integer pointNum;

                /**
                 * 标点坐标系尺寸
                 */
                @JSONField(name = "reco_zone_size_factor")
                private RecoZoneSizeFactor recoZoneSizeFactor;

                @Data
                private static class Point{
                    // 点x坐标
                    private Integer x;
                    // 点y坐标
                    private Integer y;
                }

                @Data
                private static class RecoZoneSizeFactor{
                    /**
                     * 坐标点坐标系尺寸高度
                     */
                    @JSONField(name = "factor_h")
                    private Integer factorH;

                    /**
                     * 坐标点坐标系尺寸宽度
                     */
                    @JSONField(name = "factor_w")
                    private Integer factorW;
                }
            }
        }

        @Data
        public static class Plate{
            /**
             * 车牌颜色
             *
             * 0:未知;
             * 1:蓝色;
             * 2:黄色;
             * 3:白色;
             * 4:黑色;
             * 5:绿色;
             */
            private Integer color;

            // 车牌置信度
            private Integer confidence;
            private Loc loc;

            /**
             * 车牌
             * UTF8后再BASE64编码
             * 如果有车牌:真实车牌号
             * 如果有车无牌:无牌车
             * 如果无车无牌:__无__
             * 非机动车:非机动车
             */
            private String plate;

            /**
             * 车牌类型
             *
             * 0:未知车牌
             * 1:蓝牌小汽车
             * 2:黑牌小汽车
             * 3:单排黄牌
             * 4:双排黄牌(大车尾牌，农用车)
             * 5:警车车牌
             * 6:武警车牌
             * 7:个性化车牌
             * 8:单排军车牌
             * 9:双排军车牌
             * 10:使馆车牌
             * 11:香港进出中国大陆车牌
             * 12:农用车牌
             * 13:教练车牌
             * 14:澳门进出中国大陆车牌
             * 15:双层武警车牌
             * 16:武警总队车牌
             * 17:双层武警总队车牌
             * 18:民航车牌
             * 19:新能源车牌
             * 20:新能源车牌大
             * 21:应急
             * 22:领馆
             */
            private Integer type;
        }

        @Data
        private static class Reco{

            /**
             * 识别组id
             */
            @JSONField(name = "group_id")
            private Integer groupId;

            /**
             * 识别标志
             */
            @JSONField(name = "reco_flag")
            private Integer recoFlag;

            /**
             * 识别id
             */
            @JSONField(name = "reco_id")
            private Integer recoId;

            /**
             * 识别时间(字符串格式时间)
             */
            @JSONField(name = "reco_time")
            private String recoTime;
        }
    }









    @Data
    private static class Resolution{
        /**
         * 图片高
         */
        private Integer height;

        /**
         * 图片宽
         */
        private Integer width;
    }

    @Data
    private static class Loc{
        // 下
        private Integer bottom;
        // 左
        private Integer left;
        // 右
        private Integer right;
        // 上
        private Integer top;
    }

}
