package com.fizz.business.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fizz.business.dto.SegmentDTO;
import com.fizz.business.mapper.SegmentMapper;
import com.fizz.business.vo.SegmentParamVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
@Slf4j
public class SegmentService {

    @Resource
    private SegmentMapper segmentMapper;
    private final ObjectMapper objectMapper = new ObjectMapper(); // 用于JSON转换

    /**
     * 保存完整的段数据，包含插入和更新逻辑。
     * 对应 C++ 的 saveTotalSegment() 方法。
     *
     * @param segment 待保存的段数据对象
     */
    public void saveTotalSegment(SegmentDTO segment) {
        if (segment == null || segment.getEnCoilID() == null || segment.getEnCoilID().isEmpty()) {
            log.warn("警告: Coil ID 为空，无法保存数据。");
            return;
        }

        // 1. 将动态的 Map 数据转换为 JSON 字符串（存平均值）
        Map<String, BigDecimal> totalValuesAvg = new HashMap<>();
        segment.getTotalValues().forEach((key, segValue) -> {
            totalValuesAvg.put(key + "_avg", segValue.getAverage());
        });

        try {
            // 使用 Jackson ObjectMapper 将 Map 转换为 JSON 字符串
            String jsonString = objectMapper.writeValueAsString(totalValuesAvg);
            segment.setTotalValuesJson(jsonString);
        } catch (JsonProcessingException e) {
            log.warn("转换 JSON 失败: " + e.getMessage());
            return;
        }

        // 2. 先执行删除，再插入，以避免重复数据（与 C++ 逻辑保持一致）
        QueryWrapper<SegmentDTO> deleteWrapper = new QueryWrapper<>();
        deleteWrapper.eq("en_coil_id", segment.getEnCoilID())
                .eq("seg_no", segment.getSegNo());
        segmentMapper.delete(deleteWrapper);

        // 3. 执行插入操作，MyBatis-Plus 会自动处理 totalValuesJson 字段的保存
        segmentMapper.insert(segment);

        log.info("段数据保存成功。钢卷号: " + segment.getEnCoilID() + ", 段号: " + segment.getSegNo());
    }

    public List<SegmentParamVO> queryParamByEnCoilId(String enCoilID, String paramField) {
        if (enCoilID == null || paramField == null) {
            throw new IllegalArgumentException("参数不能为空");
        }
        return segmentMapper.queryParamByEnCoilId(enCoilID, paramField);
    }

}