package com.mosty.yjzl.utils;

import com.mosty.base.model.vo.yjzl.TbZdxlFgdwVO;
import com.mosty.base.utils.Kit;
import org.apache.commons.lang3.ObjectUtils;
import org.locationtech.jts.geom.Coordinate;

import java.math.BigDecimal;

/**
 * @author zhangzhao
 * @description 指导巡逻方格巡逻任务工具类
 * @modifier zhangzhao
 * @modifiedTime 2025/05/11 22:43
 * @since 2025/05/11 22:43
 */
public class TbZdxlFgxlrwUtils {

    /**
     * 打卡时间间隔（默认10分钟）
     */
    public final static Long CLOCK_IN_INTERVAL_TIME = 10L*60L*1000L;

    /**
     * 方格巡逻任务-街面警情-查询开始日期运算长度
     */
    public final static Integer FGXLRW_JMJQ_QUERY_START_D_STEP = -8;

    /**
     * 方格巡逻任务-街面警情-查询结束日期运算长度
     */
    public final static Integer FGXLRW_JMJQ_QUERY_END_D_STEP = -1;

    /**
     * 方格巡逻任务-街面警情-数量统计-红色预警
     */
    public final static Integer FGXLRW_JMJQ_COUNT_RED = 20;

    /**
     * 方格巡逻任务-街面警情-数量统计-橙色预警
     */
    public final static Integer FGXLRW_JMJQ_COUNT_ORANGE = 10;

    /**
     * 方格巡逻任务-街面警情-数量统计-黄色预警
     */
    public final static Integer FGXLRW_JMJQ_COUNT_YELLOW = 5;

    /**
     * 方格巡逻任务-高发时段-开始小时-运算长度
     */
    public final static Integer FGXLRW_GFSD_HOUR_START_STEP = -1;

    /**
     * 方格巡逻任务-高发时段-结束小时-运算长度
     */
    public final static Integer FGXLRW_GFSD_HOUR_END_STEP = 1;

    /**
     * 方格巡逻任务-高发警情最大数量
     */
    public final static Integer FGXLRW_GFJQ_MAX_COUNT = 5;

    /**
     * 方格巡逻任务-默认规划时长（分钟）
     */
    public final static Double FGXLRW_DEFAULT_XLGHSC = 120.00;

    /**
     * 方格巡逻任务-默认规划巡逻里程（公里）
     */
    public final static Double FGXLRW_DEFAULT_XLGHXLLC = 2.00;

    /**
     * 字典项-指导巡逻方格巡逻任务预警等级-一级
     */
    public final static String DICT_ITEM_D_ZDXL_FGXLRW_YJDJ_FT = "01";

    /**
     * 字典项-指导巡逻方格巡逻任务预警等级-二级
     */
    public final static String DICT_ITEM_D_ZDXL_FGXLRW_YJDJ_SE = "02";

    /**
     * 字典项-指导巡逻方格巡逻任务预警等级-三级
     */
    public final static String DICT_ITEM_D_ZDXL_FGXLRW_YJDJ_TH = "03";

    /**
     * 字典项-指导巡逻方格巡逻任务预警等级-四级
     */
    public final static String DICT_ITEM_D_ZDXL_FGXLRW_YJDJ_FO = "04";

    /**
     * 字典项-指导巡逻方格巡逻任务预警颜色-红色预警
     */
    public final static String DICT_ITEM_D_ZDXL_FGXLRW_YJYS_RED = "01";

    /**
     * 字典项-指导巡逻方格巡逻任务预警颜色-橙色预警
     */
    public final static String DICT_ITEM_D_ZDXL_FGXLRW_YJYS_ORANGE = "02";

    /**
     * 字典项-指导巡逻方格巡逻任务预警颜色-黄色预警
     */
    public final static String DICT_ITEM_D_ZDXL_FGXLRW_YJYS_YELLOW = "03";

    /**
     * 字典项-指导巡逻方格巡逻任务预警颜色-蓝色预警
     */
    public final static String DICT_ITEM_D_ZDXL_FGXLRW_YJYS_BLUE = "04";

    /**
     * 字典项-指导巡逻方格巡逻任务状态-创建
     */
    public final static String DICT_ITEM_D_ZDXL_FGXLRW_RWZT_CJ = "01";

    /**
     * 字典项-指导巡逻方格巡逻任务状态-已导出
     */
    public final static String DICT_ITEM_D_ZDXL_FGXLRW_RWZT_YDC = "02";

    /**
     * 字典项-指导巡逻方格巡逻任务状态-已下发
     */
    public final static String DICT_ITEM_D_ZDXL_FGXLRW_RWZT_YXF = "03";

    /**
     * 字典项-指导巡逻方格巡逻任务状态-巡逻中
     */
    public final static String DICT_ITEM_D_ZDXL_FGXLRW_RWZT_XLZ = "04";

    /**
     * 字典项-指导巡逻方格巡逻任务状态-巡逻结束
     */
    public final static String DICT_ITEM_D_ZDXL_FGXLRW_RWZT_XLJS = "05";

    /**
     * 系统配置配置键-方格巡逻任务警情配置-报警细类
     */
    public final static String SYS_CONFIG_PZJ_FGXLRW_JQPZ_BJXL = "ZDXL_FGYSJS_JQ_BJXL";

    /**
     * 系统配置配置键-方格巡逻任务警情配置-报警子类
     */
    public final static String SYS_CONFIG_PZJ_FGXLRW_JQPZ_BJZL = "ZDXL_FGYSJS_JQ_BJZL";

    /**
     * 校验点位是否在方格中
     * @param fgdwVO 方格信息
     * @param jd 经度
     * @param wd 纬度
     * @return 是否在方格中
     */
    public static  boolean isInGeometry(TbZdxlFgdwVO fgdwVO, BigDecimal jd, BigDecimal wd){
        if(ObjectUtils.isEmpty(fgdwVO) || ObjectUtils.isEmpty(jd) || ObjectUtils.isEmpty(wd)){
            return false;
        }
        Coordinate leftTop = new Coordinate(fgdwVO.getX1().doubleValue(), fgdwVO.getY2().doubleValue());
        Coordinate rightTop = new Coordinate(fgdwVO.getX2().doubleValue(), fgdwVO.getY2().doubleValue());
        Coordinate leftBottom = new Coordinate(fgdwVO.getX1().doubleValue(), fgdwVO.getY1().doubleValue());
        Coordinate rightBottom = new Coordinate(fgdwVO.getX2().doubleValue(), fgdwVO.getY1().doubleValue());
        Coordinate[] coordinates = new Coordinate[4];
        coordinates[0] = leftTop;
        coordinates[1] = rightTop;
        coordinates[2] = rightBottom;
        coordinates[3] = leftBottom;
        return Kit.isInGeometryByRay(coordinates, jd + "," + wd);
    }

}
