package com.persagy.dmp.rwd.digital.handler;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.JsonNodeFactory;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.persagy.dmp.common.context.AppContext;
import com.persagy.dmp.common.lang.PsDateTime;
import com.persagy.dmp.digital.entity.ObjectDigital;
import lombok.Data;

import java.math.BigDecimal;
import java.util.Collections;
import java.util.Set;

/**
 * 项目消息对象
 * {
 *   "id":"PR1395270128588939265", //项目主键Id
 *   "groupCode":"ICBC",           //集团编码
 *   "projectId":"Pj8765863329",   //项目ID
 *   "projectLocalId":"8765863329",//项目本地编码
 *   "areaId":"AR1381523632282435585",//区域ID
 *   "projectName":"项目名称",       //项目名称
 *   "provinceCode":"",             //项目所在省份
 *   "cityCode":"",                 //项目所在市
 *   "zoneCode":"",                 //项目所在区
 *   "location":"天府大道219号",      //项目详细地址
 *   "openTime":1623985811012,       //开业时间
 *   "createTime":1623985811012,     //创建时间
 *   "updateTime":1623985811012,     //更新时间
 *   "updateUser":"AC1372371635352403969",//最后修改人ID
 *   "remark":"备注",                 //备注
 *   "valid":1,                      //有效状态，0-无效，1-有效
 *   "projectFun":"E100",            //项目功能
 *   "projectWeather":"20",          //项目天气
 *   "projectImage":["图4.jpg","图6.jpg"],//项目图片，set集合
 *   "longitude":11.002,             //项目经度
 *   "latitude":22.99,               //项目纬度
 *   "manageZone":"高新区",            //集团管理分区
 *   "type":"create"                //通知类型，create-创建，update-修改
 * }
 * @author Charlie Yu
 * @date 2021-06-25
 */
@Data
public class ProjectMessageVO {

    /** 项目主键Id */
    private String id;
    /** 集团编码 */
    private String groupCode;
    /** 项目ID */
    private String projectId;
    /** 项目本地编码 */
    private String projectLocalId;
    /** 区域ID */
    private String areaId;
    /** 项目名称 */
    private String projectName;
    /** 项目所在省份 */
    private String provinceCode;
    /** 项目所在市 */
    private String cityCode;
    /** 项目所在区 */
    private String zoneCode;
    /** 项目详细地址 */
    private String location;
    /** 开业时间 */
    private PsDateTime openTime;
    /** 创建时间 */
    private PsDateTime createTime;
    /** 更新时间 */
    private PsDateTime updateTime;
    /** 最后修改人ID */
    private String updateUser;
    /** 备注 */
    private String remark;
    /** 有效状态，0-无效，1-有效 */
    private Integer valid;
    /** 项目功能 */
    private String projectFun;
    /** 项目天气 */
    private String projectWeather;
    /** 项目图片，set集合 */
    private Set<String> projectImage;
    /** 项目经度 */
    private BigDecimal longitude;
    /** 项目纬度 */
    private BigDecimal latitude;
    /** 集团管理分区 */
    private String manageZone;
    /** 通知类型，create-创建，update-修改 */
    private String type;

    /**
     * 转换为对象
     * @return
     */
    public ObjectDigital toObjectDigital() {
        ObjectDigital project = new ObjectDigital();
        project.setId(projectId);
        project.setProjectId(projectId);
        project.setName(projectName);
        project.setLocalId(projectLocalId);
        project.setObjType("project");
        project.setClassCode("project");
        project.setGrouping(1);
        project.setVirtualCodes(Collections.emptyList());
        project.setValid(valid);
        if("create".equalsIgnoreCase(type)) {
            project.setCreateApp(AppContext.getContext().getAppId());
        } else {
            project.setUpdateApp(AppContext.getContext().getAppId());
        }
        project.setInfos(toObjectInfos());
        return project;
    }

    /**
     * 构建infos
     * @return
     */
    public ObjectNode toObjectInfos() {
        // 构建infos - 为空不写入
        ObjectNode infos = JsonNodeFactory.instance.objectNode();
        if(StrUtil.isNotBlank(provinceCode)) {
            infos.put("province", provinceCode);
        }
        if(StrUtil.isNotBlank(cityCode)) {
            infos.put("city", cityCode);
        }
        if(StrUtil.isNotBlank(zoneCode)) {
            infos.put("urbanZone", zoneCode);
        }
        if(longitude != null) {
            infos.put("longitude", longitude);
        }
        if(latitude != null) {
            infos.put("latitude", latitude);
        }
        if(StrUtil.isNotBlank(location)) {
            infos.put("address", location);
        }
        if(openTime != null) {
            infos.put("businessOpeningTime", openTime.toString("yyyyMMdd"));
        }
        if(StrUtil.isNotBlank(projectFun)) {
            infos.put("projFuncType", projectFun);
        }
        if(StrUtil.isNotBlank(projectWeather)) {
            infos.put("climateZone", projectWeather);
        }
        if(StrUtil.isNotBlank(manageZone)) {
            infos.put("groupManageZone", manageZone);
        }
        // 添加图片 - BOSS提供的只有图片key
        if(CollUtil.isNotEmpty(projectImage)) {
            ArrayNode projPic = infos.withArray("projPic");
            projectImage.forEach(p -> ensureImageNode(projPic.addObject(), p));
        }
        return infos;
    }

    /**
     * 构建为附件对象
     * @param node
     * @param key
     */
    private void ensureImageNode(ObjectNode node, String key) {
        if(StrUtil.isBlank(key)) {
            return;
        }
        node.put("key", key);
        node.put("name", key);
        node.put("type", "file");
    }
}
