package com.tmerclub.cloud.search.listener;

import cn.hutool.core.util.ObjectUtil;
import com.tmerclub.cloud.api.loacl.cuerecycle.feign.CueProductFeignClient;
import com.tmerclub.cloud.common.local.bo.EsCueProductBO;
import com.tmerclub.cloud.search.bo.CueProductBO;
import com.tmerclub.cloud.search.canal.model.CanalBinLogResult;
import com.tmerclub.cloud.search.constant.EsIndexEnum;
import com.tmerclub.cloud.search.util.EsSearchUtil;
import org.apache.dubbo.config.annotation.DubboReference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

/**
 * 球杆商品监听器
 *
 * @author: frank
 * @create: 2025-04-19
 **/
@Component
public class CueProductCanalListener extends BaseCanalBinlogEventThrowExceptionProcessor<CueProductBO> {

    private static final Logger log = LoggerFactory.getLogger(CueProductCanalListener.class);

    @DubboReference
    CueProductFeignClient cueProductFeignClient;

    @Override
    protected void processInsertInternal(CanalBinLogResult<CueProductBO> result) {
        log.info("球杆商品新增:{}", result.getDatabaseName());
        CueProductBO afterData = result.getAfterData();
        EsCueProductBO esCueProductBO = getEsCueProductData(afterData.getProductId());
        if (ObjectUtil.isNull(esCueProductBO)) {
            log.error("球杆商品新增异常ID:{}", afterData.getProductId());
            return;
        }
        EsSearchUtil.esSave(afterData.getProductId(), EsIndexEnum.CUE_PRODUCT, esCueProductBO);
    }

    @Override
    protected void processUpdateInternal(CanalBinLogResult<CueProductBO> result) {
        log.info("球杆商品修改:{}", result.getDatabaseName());
        CueProductBO afterData = result.getAfterData();
        EsCueProductBO esCueProductBO = getEsCueProductData(afterData.getProductId());
        if (ObjectUtil.isNull(esCueProductBO)) {
            log.error("球杆商品修改异常ID:{}", afterData.getProductId());
            return;
        }
        EsSearchUtil.esUpdate(afterData.getProductId(), EsIndexEnum.CUE_PRODUCT, esCueProductBO);
    }

    /**
     * 获取球杆商品数据
     *
     * @param productId 商品ID
     * @return 球杆商品数据
     */
    private EsCueProductBO getEsCueProductData(Long productId) {
        return cueProductFeignClient.getEsCueProduct(productId);
    }
}