package com.mosty.bkzx.service;

import com.alibaba.fastjson.JSONObject;
import com.mosty.base.enums.BKCSTypeEnum;
import com.mosty.base.enums.BKDbTypeEnum;
import com.mosty.base.model.entity.bkzx.TbBkCl;
import com.mosty.base.model.entity.bkzx.TbBkDb;
import com.mosty.base.model.entity.bkzx.TbBkRy;
import com.mosty.base.model.vo.base.DeptInfoVo;
import com.mosty.bkzx.sjjs.dto.ResponseStatusObject;
import com.mosty.common.base.exception.BusinessException;
import com.mosty.common.token.UserInfo;
import lombok.Data;
import org.springframework.util.CollectionUtils;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

/**
 * 第三方布控数据库服务接口
 */
public interface ThridBkService {
    /**
     * 创建布控数据库
     * @param dto  创建数布控数据库基础信息模型
     * @param  userInfo  当前登陆用户信息
     * @param  detpVo   部门信息
     * @return
     * @throws BusinessException
     */
    default ResultData  createDb(List<TbBkDb> dto, UserInfo userInfo, DeptInfoVo detpVo) throws BusinessException{
        return null;
    };

    /**
     * 修改布控数据库信息
     * @param dbInfo  数据库信息
     * @return
     * @throws BusinessException
     */
    default ResultData  modifyDb(TbBkDb dbInfo) throws  BusinessException{
        return  null;
    }

    /**
     * 删除布控数据库
     * @param args
     * @return
     * @throws BusinessException
     */
    default  ResultData  delDb(Map<String, Object> args) throws  BusinessException{
        return  null;
    }

    /**
     * 开始进行布控
     * @param arg
     * @throws BusinessException
     */
    void startBKHandler(BkHand arg) throws  BusinessException;

    /**
     * 删除布控信息
     * @param records
     * @return
     */
//    List<Long>  delBuKong(List<TbBkRecords> records);

    /**
     * 布控数据库
     * @param bkdbitems
     * @param  bkdbitems 厂商
     */
    default  List<ResponseStatusObject> startBkDb(List<TbBkDb> bkdbitems, UserInfo user){
        throw  new BusinessException("暂未实现数据库布控操作！");
    }


    /**
     * 编辑人员信息
     * @param bkRy
     * @throws BusinessException
     */
//    default void  updatePerson(TbBkRy bkRy, TbBkRecords record) throws BusinessException{}

    /**
     * 编辑车辆信息
     * @param bkCl
     * @param record
     * @throws BusinessException
     */
//    default void  updateVehicle(TbBkCl bkCl, TbBkRecords record) throws  BusinessException{}

    /**
     * 撤销对数据库的布控操作
     * @param value
     * @return
     */
    default List<String> cancleDbBuKong(List<TbBkDb> value){
        return  null;
    }

    @Data
    public static class ResultData{
        /**
         * 数据返回的厂商类型
         */
        private BKCSTypeEnum csType;

        /**
         * 接口返回的数据对象
         */
        private  JSONObject  object = null;

        /**
         * 返回对象信息
         */
        private  Object      resultObject = null;

        /**
         * 操作成功的records的主键key集合和
         */
        private  List<String> primKeys;

        public  ResultData(){
            this.csType = null;
            this.object = null;
            this.resultObject = null;
        };

        public  ResultData(BKCSTypeEnum csType){
            this.csType = csType;
        }

    }

    @Data
    public  static  class  BkHand  implements Serializable {
        /**
         * 布控库列表信息
         */
        private List<TbBkDb> bkDbList;

        /**
         * 布控类型，人或车
         */
        private BKDbTypeEnum dbTypeEnum;

        /**
         * 布控人员信息
         */
        private TbBkRy tbBkRy;

        /**
         * 布控的车辆信息
         */
        private TbBkCl tbBkCl;

        public  void  checkData(){
            if(null == dbTypeEnum){
                throw  new BusinessException("布控类型参数无效！");
            }
            if(CollectionUtils.isEmpty(bkDbList)){
                throw new BusinessException("未找到需要布控的布控数据库信息！");
            }
            switch (dbTypeEnum){
                case Personnel:
                    if(null == tbBkRy){
                        throw  new BusinessException("布控人员信息无效！");
                    }
                    break;
                case Car:
                    if(null == tbBkCl){
                        throw  new BusinessException("布控车辆信息无效！");
                    }
                    break;
            }
        }
    }


    @Data
    public static  class  DbInfo{
        /**
         * 建立成功数据库主键
         */
        private  String  dbKey;

        /**
         * 标说数据库是否是隐藏属性
         */
        private  boolean hidden =false;
    }
}
