package com.zt.plat.module.base.service.unitConversion;

import com.zt.plat.module.base.dal.dao.unitConversion.UnitConversionMapper;
import com.zt.plat.module.base.dal.dao.quantityUnitRelation.QuantityUnitRelationMapper;
import com.zt.plat.module.base.dal.dao.untInfo.UntInfoMapper;
import com.zt.plat.module.base.dal.dataobject.unitConversion.UnitConversionDO;
import com.zt.plat.module.base.dal.dataobject.quantityUnitRelation.QuantityUnitRelationDO;
import com.zt.plat.module.base.dal.dataobject.untInfo.UntInfoDO;
import com.zt.plat.module.base.util.UnitConversionUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import jakarta.annotation.Resource;
import java.math.BigDecimal;
import java.util.List;

/**
 * 单位转换辅助服务
 *
 * 为其他模块提供简单易用的单位转换方法
 * 支持按单位符号和单位名称进行转换
 *
 * @author 系统
 */
@Service
@Slf4j
public class UnitConversionHelperService {

    @Resource
    private UnitConversionMapper unitConversionMapper;

    @Resource
    private QuantityUnitRelationMapper quantityUnitRelationMapper;

    @Resource
    private UntInfoMapper untInfoMapper;

    /**
     * 按单位符号转换（推荐使用）
     *
     * @param value 待转换的值
     * @param srcSymbol 源单位符号（如: "kg", "m", "km"）
     * @param tgtSymbol 目标单位符号
     * @return 转换后的值
     */
    public BigDecimal convertBySymbol(BigDecimal value, String srcSymbol, String tgtSymbol) {
        return convertBySymbol(value, srcSymbol, tgtSymbol, 6);
    }

    /**
     * 按单位符号转换（推荐使用）
     *
     * @param value 待转换的值
     * @param srcSymbol 源单位符号（如: "kg", "m", "km"）
     * @param tgtSymbol 目标单位符号
     * @param precision 精度（小数位数）
     * @return 转换后的值
     */
    public BigDecimal convertBySymbol(BigDecimal value, String srcSymbol, String tgtSymbol, int precision) {
        log.debug("按符号转换: {} {} → {}", value, srcSymbol, tgtSymbol);

        // 加载数据
        List<UnitConversionDO> conversions = unitConversionMapper.selectList();
        List<QuantityUnitRelationDO> relations = quantityUnitRelationMapper.selectList();
        List<UntInfoDO> units = untInfoMapper.selectList();

        // 调用工具类
        UnitConversionUtil.ConversionResult result = UnitConversionUtil.convertBySymbol(
            value, srcSymbol, tgtSymbol, conversions, relations, units, precision
        );

        log.debug("转换结果: {} (策略: {})", result.getValue(), result.getStrategy());
        return result.getValue();
    }

    /**
     * 按单位名称转换
     *
     * @param value 待转换的值
     * @param srcName 源单位名称（如: "千克", "米", "千米"）
     * @param tgtName 目标单位名称
     * @return 转换后的值
     */
    public BigDecimal convertByName(BigDecimal value, String srcName, String tgtName) {
        return convertByName(value, srcName, tgtName, 6);
    }

    /**
     * 按单位名称转换
     *
     * @param value 待转换的值
     * @param srcName 源单位名称（如: "千克", "米", "千米"）
     * @param tgtName 目标单位名称
     * @param precision 精度（小数位数）
     * @return 转换后的值
     */
    public BigDecimal convertByName(BigDecimal value, String srcName, String tgtName, int precision) {
        log.debug("按名称转换: {} {} → {}", value, srcName, tgtName);

        // 加载数据
        List<UnitConversionDO> conversions = unitConversionMapper.selectList();
        List<QuantityUnitRelationDO> relations = quantityUnitRelationMapper.selectList();
        List<UntInfoDO> units = untInfoMapper.selectList();

        // 调用工具类
        UnitConversionUtil.ConversionResult result = UnitConversionUtil.convertByName(
            value, srcName, tgtName, conversions, relations, units, precision
        );

        log.debug("转换结果: {} (策略: {})", result.getValue(), result.getStrategy());
        return result.getValue();
    }

    /**
     * 按单位符号批量转换
     *
     * @param values 待转换的值列表
     * @param srcSymbol 源单位符号
     * @param tgtSymbol 目标单位符号
     * @return 转换后的值列表
     */
    public List<BigDecimal> batchConvertBySymbol(List<BigDecimal> values, String srcSymbol, String tgtSymbol) {
        return batchConvertBySymbol(values, srcSymbol, tgtSymbol, 6);
    }

    /**
     * 按单位符号批量转换
     *
     * @param values 待转换的值列表
     * @param srcSymbol 源单位符号
     * @param tgtSymbol 目标单位符号
     * @param precision 精度（小数位数）
     * @return 转换后的值列表
     */
    public List<BigDecimal> batchConvertBySymbol(List<BigDecimal> values, String srcSymbol, String tgtSymbol, int precision) {
        log.debug("批量按符号转换: {} 个值, {} → {}", values.size(), srcSymbol, tgtSymbol);

        // 加载数据
        List<UnitConversionDO> conversions = unitConversionMapper.selectList();
        List<QuantityUnitRelationDO> relations = quantityUnitRelationMapper.selectList();
        List<UntInfoDO> units = untInfoMapper.selectList();

        // 调用工具类
        List<UnitConversionUtil.ConversionResult> results = UnitConversionUtil.batchConvertBySymbol(
            values, srcSymbol, tgtSymbol, conversions, relations, units, precision
        );

        // 提取转换后的值
        return results.stream()
                .map(UnitConversionUtil.ConversionResult::getValue)
                .toList();
    }

    /**
     * 按单位名称批量转换
     *
     * @param values 待转换的值列表
     * @param srcName 源单位名称
     * @param tgtName 目标单位名称
     * @return 转换后的值列表
     */
    public List<BigDecimal> batchConvertByName(List<BigDecimal> values, String srcName, String tgtName) {
        return batchConvertByName(values, srcName, tgtName, 6);
    }

    /**
     * 按单位名称批量转换
     *
     * @param values 待转换的值列表
     * @param srcName 源单位名称
     * @param tgtName 目标单位名称
     * @param precision 精度（小数位数）
     * @return 转换后的值列表
     */
    public List<BigDecimal> batchConvertByName(List<BigDecimal> values, String srcName, String tgtName, int precision) {
        log.debug("批量按名称转换: {} 个值, {} → {}", values.size(), srcName, tgtName);

        // 加载数据
        List<UnitConversionDO> conversions = unitConversionMapper.selectList();
        List<QuantityUnitRelationDO> relations = quantityUnitRelationMapper.selectList();
        List<UntInfoDO> units = untInfoMapper.selectList();

        // 调用工具类
        List<UnitConversionUtil.ConversionResult> results = UnitConversionUtil.batchConvertByName(
            values, srcName, tgtName, conversions, relations, units, precision
        );

        // 提取转换后的值
        return results.stream()
                .map(UnitConversionUtil.ConversionResult::getValue)
                .toList();
    }

    /**
     * 按单位符号转换（返回完整结果）
     *
     * @param value 待转换的值
     * @param srcSymbol 源单位符号
     * @param tgtSymbol 目标单位符号
     * @param precision 精度（小数位数）
     * @return 转换结果（包含值、因子、策略等）
     */
    public UnitConversionUtil.ConversionResult convertBySymbolWithDetails(
            BigDecimal value, String srcSymbol, String tgtSymbol, int precision) {

        // 加载数据
        List<UnitConversionDO> conversions = unitConversionMapper.selectList();
        List<QuantityUnitRelationDO> relations = quantityUnitRelationMapper.selectList();
        List<UntInfoDO> units = untInfoMapper.selectList();

        // 调用工具类
        return UnitConversionUtil.convertBySymbol(
            value, srcSymbol, tgtSymbol, conversions, relations, units, precision
        );
    }

    /**
     * 按单位名称转换（返回完整结果）
     *
     * @param value 待转换的值
     * @param srcName 源单位名称
     * @param tgtName 目标单位名称
     * @param precision 精度（小数位数）
     * @return 转换结果（包含值、因子、策略等）
     */
    public UnitConversionUtil.ConversionResult convertByNameWithDetails(
            BigDecimal value, String srcName, String tgtName, int precision) {

        // 加载数据
        List<UnitConversionDO> conversions = unitConversionMapper.selectList();
        List<QuantityUnitRelationDO> relations = quantityUnitRelationMapper.selectList();
        List<UntInfoDO> units = untInfoMapper.selectList();

        // 调用工具类
        return UnitConversionUtil.convertByName(
            value, srcName, tgtName, conversions, relations, units, precision
        );
    }
}
