package com.persagy.adm.server.backstage.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.persagy.adm.server.backstage.domain.AdmAnalysisModel;
import com.persagy.adm.server.backstage.service.AdmAnalyseService;
import com.persagy.dmp.common.exception.BusinessException;
import lombok.extern.slf4j.Slf4j;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

/**
 * revit模型解析基类
 * @author : lijie
 * Update By 2022/1/21 10:48
 */
@Slf4j
public abstract class AdmAnalysisServiceBase implements AdmAnalyseService {

    protected AdmAnalyseService next = null;

    /**
     * 初始化方法,用于准备环境
     * return : void
     * @author : lijie
     * Update By 2022/1/21 10:59
     */
    @PostConstruct
    @Override
    public final synchronized void init() throws BusinessException {
        // 1.是否需要打印日志
        if (log.isDebugEnabled()) {
            log.debug("AdmAnalysisModelBase.init方法开始:{}", this);
        }
        // 调具体实现类的方法，完成自身的初始化
        initInternal();
    }

    /**
     * 销毁方法
     * return : void
     * @author : lijie
     * Update By 2022/1/21 10:50
     */
    @PreDestroy
    @Override
    public final synchronized void destroy() throws BusinessException {
        // 1.是否需要打印日志
        if (log.isDebugEnabled()) {
            log.debug("AdmAnalysisModelBase.destroy() :{}", this);
        }
        // 调具体实现类的方法，完成自身的销毁逻辑
        destroyInternal();
        if (log.isDebugEnabled()) {
            log.debug("AdmAnalysisModelBase.destroy() end:{}", this);
        }
    }
    /**
     * 解析模型文件方法
     * return : void
     * @author : lijie
     * Update By 2022/1/21 10:59
     */
    @Override
    public final void analysis(AdmAnalysisModel model) {
        try {
            // 调具体实现类的方法，完成自身的初始化
            analysisInternal(model);
        }catch (Exception e){
            log.warn("解析模型数据失败:{},错误信息:{}", JSONObject.toJSONString(model.getCurrentModelFile()),e);
            afterAnalysisException(model,e.getMessage());
        }finally {
            afterAnalysis(model);
        }
    }
    /**
     * 解析完成后执行的逻辑
     * @param model : 模型文件
     * return : void
     * @author : lijie
     * Update By 2022/1/22 17:43
     */
    protected void afterAnalysis(AdmAnalysisModel model){};

    /**
     * 出现异常的处理逻辑
     * @param model : 模型文件
     * return : void
     * @author : lijie
     * Update By 2022/1/22 17:43
     */
    protected void afterAnalysisException(AdmAnalysisModel model,String errorMessage){};

    /**
     * 获取下一个链
     * @return : com.persagy.adm.server.backstage.service.AdmValve
     * @author : lijie
     * Update By 2022/1/21 15:26
     */
    @Override
    public AdmAnalyseService getNext() {
        return next;
    }
    /**
     * 设置下一个链的逻辑类
     * @param next : 下一个链的逻辑类
     * return : void
     * @author : lijie
     * Update By 2022/1/21 15:26
     */
    @Override
    public void setNext(AdmAnalyseService next) {
        this.next = next;
    }

    /**
     * 内部解析方法逻辑
     * @param model : 模型数据DTO
     * return : void
     * @author : lijie
     * Update By 2022/1/21 14:36
     */
    protected abstract void analysisInternal(AdmAnalysisModel model);

    /**
     * 内部初始化方法,子类覆写即可
     * return : void
     * @author : lijie
     * Update By 2022/1/21 12:03
     */
    protected void initInternal(){};

    /**
     * 内部销毁方法,子类覆写即可
     * return : void
     * @author : lijie
     * Update By 2022/1/21 12:03
     */
    protected void destroyInternal(){};
}
