package cn.axzo.msg.center.service.pending.response.v3.model;

import cn.axzo.im.center.api.feign.SendPriority;
import cn.axzo.im.center.common.enums.AppTypeEnum;
import cn.axzo.msg.center.push.PushData;
import cn.axzo.msg.center.service.domain.CardUrlConfig;
import cn.axzo.msg.center.service.domain.card.AppVersionConfig;
import cn.axzo.msg.center.service.domain.card.StateImageConfig;
import cn.axzo.msg.center.service.enums.CardUrlOpenStrategy;
import cn.axzo.msg.center.service.enums.MessageCategoryEnum;
import cn.axzo.msg.center.service.enums.MessageChannel;
import cn.axzo.msg.center.service.enums.StatusEnum;
import cn.axzo.msg.center.service.enums.YesOrNo;
import cn.axzo.msg.center.service.pending.card.domain.CardElementConfig;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Getter;
import lombok.Setter;
import org.apache.commons.collections4.CollectionUtils;

import java.util.Collections;
import java.util.List;

import static java.util.stream.Collectors.toList;

/**
 * @author yanglin
 */
@Setter
@Getter
public class ParsedTemplateV3 {
    /**
     * 模板名称
     */
    private String name;

    /**
     * 系统自动生成的模板code
     */
    private String code;

    /**
     * 所属消息类型
     */
    private MessageCategoryEnum msgCategory;

    /**
     * 模板标题
     */
    private String title;

    /**
     * 模板类容
     */
    private String content;

    /**
     * 消息详情样式. BIZ_COMMON: 业务待办能用, FLOW_COMMON: 审批待办能用, 其它动态配置的
     */
    private String detailStyleCode;

    /**
     * 模板icon
     */
    private String icon;

    /**
     * APP最小版本支持，可不配
     */
    private String minAppVersion;

    /**
     * 模板状态
     */
    private StatusEnum status;

    /**
     * 推送终端配置 JSON字串
     */
    private String pushTerminal;

    /**
     * 卡片跳转方式. NONE: 无跳转, OPEN_TODO_DETAIL: 打开待办详情, OPEN_CUSTOM_PAGE: 打开指定页面
     */
    private CardUrlOpenStrategy cardUrlOpenStrategy;

    /**
     * 卡片跳转配置. 在links的基础上再包一层, 避免以后卡片增加自己的配置
     */
    @JsonIgnore
    private CardUrlConfig cardUrlConfig;

    /**
     * 卡片链接
     */
    private ParsedCardUrl cardUrl;

    /**
     * IM发送优先级
     */
    private Integer imSendPriority;

    /**
     * push配置
     */
    private JSONObject pushData;

    /**
     * 是否显示在列表中. YES: 是, NO: 否
     */
    private YesOrNo displayOnList;

    /**
     * app最低版本控制
     */
    private List<AppVersionConfig> appVersionConfigs;

    /**
     * 卡片样式编码
     */
    private String cardStyleCode;

    /**
     * 卡片样式扩展字段
     */
    private List<CardElementConfig> cardExtFields;

    /**
     * 卡片状态图片配置
     */
    private List<StateImageConfig> stateImageConfigs;

    /**
     * 通道
     */
    private List<MessageChannel> channels;

    public List<StateImageConfig> determineStateImageConfigs() {
        return stateImageConfigs == null ? Collections.emptyList() : stateImageConfigs;
    }

    public List<AppTypeEnum> parseImAppTypes() {
        if (CollectionUtils.isEmpty(appVersionConfigs))
            return Collections.emptyList();
        return appVersionConfigs.stream()
                .map(AppVersionConfig::getAppType)
                .distinct()
                .collect(toList());
    }

    public PushData parsePushData() {
        JSONObject pushData = this.pushData;
        if (pushData == null)
            pushData = new JSONObject();
        return pushData.toJavaObject(PushData.class);
    }

    @JsonIgnore @JSONField(serialize = false)
    public ParsedCardUrl getOrCreateCardUrl() {
        if (cardUrl == null)
            cardUrl = new ParsedCardUrl();
        return cardUrl;
    }

    public Integer determineImSendPriority() {
        return imSendPriority == null ? SendPriority.TEMPLATE_MESSAGE.getPriority() : imSendPriority;
    }

    @Override
    public String toString() {
        return JSON.toJSONString(this);
    }
}