package com.zhyc.module.sale.service.impl;

import java.util.List;
import java.math.BigDecimal;
import java.math.RoundingMode;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.zhyc.common.annotation.DataScope; // 【新增】引入数据权限注解
import com.zhyc.module.sale.mapper.SxSheepSaleMapper;
import com.zhyc.module.sale.domain.SxSheepSale;
import com.zhyc.module.sale.service.ISxSheepSaleService;

/**
 * 羊只销售记录Service业务层处理
 *
 * @author ruoyi
 * @date 2025-08-19
 */
@Service
public class SxSheepSaleServiceImpl implements ISxSheepSaleService {
    @Autowired
    private SxSheepSaleMapper sxSheepSaleMapper;

    /**
     * 查询羊只销售记录
     *
     * @param id 羊只销售记录主键
     * @return 羊只销售记录
     */
    @Override
    public SxSheepSale selectSxSheepSaleById(Long id) {
        return sxSheepSaleMapper.selectSxSheepSaleById(id);
    }

    /**
     * 查询羊只销售记录列表
     * 【新增】添加数据权限过滤注解
     * deptAlias = "s": 对应 Mapper.xml 中表 sx_sheep_sale 的别名 s
     * userAlias = "s": 对应 Mapper.xml 中表 sx_sheep_sale 的别名 s
     *
     * @param sxSheepSale 羊只销售记录
     * @return 羊只销售记录
     */
    @Override
    @DataScope(deptAlias = "s", userAlias = "s")
    public List<SxSheepSale> selectSxSheepSaleList(SxSheepSale sxSheepSale) {
        return sxSheepSaleMapper.selectSxSheepSaleList(sxSheepSale);
    }

    /**
     * 新增羊只销售记录
     *
     * @param sxSheepSale 羊只销售记录
     * @return 结果
     */
    @Override
    public int insertSxSheepSale(SxSheepSale sxSheepSale) {
        // 1. 业务验证 (例如：销售日期不能为空，淘汰销售必须填写疾病类型等)
        validateSalesFields(sxSheepSale);

        // 2. 自动计算逻辑
        calculateSalesFields(sxSheepSale);

        // 3. 设置默认事件类型
        if (sxSheepSale.getEventType() == null) {
            sxSheepSale.setEventType("销售");
        }

        // 4. 处理耳号列表（多个耳号用逗号分隔）
        if (sxSheepSale.getBsManageTagsList() != null && !sxSheepSale.getBsManageTagsList().isEmpty()) {
            sxSheepSale.setBsManageTags(String.join(",", sxSheepSale.getBsManageTagsList()));
        }

        // 5. 调用Mapper插入数据
        return sxSheepSaleMapper.insertSxSheepSale(sxSheepSale);
    }

    /**
     * 修改羊只销售记录
     *
     * @param sxSheepSale 羊只销售记录
     * @return 结果
     */
    @Override
    public int updateSxSheepSale(SxSheepSale sxSheepSale) {
        // 1. 业务验证
        validateSalesFields(sxSheepSale);

        // 2. 自动计算逻辑
        calculateSalesFields(sxSheepSale);

        // 3. 处理耳号列表（多个耳号用逗号分隔）
        if (sxSheepSale.getBsManageTagsList() != null && !sxSheepSale.getBsManageTagsList().isEmpty()) {
            sxSheepSale.setBsManageTags(String.join(",", sxSheepSale.getBsManageTagsList()));
        }

        // 4. 调用Mapper更新数据
        return sxSheepSaleMapper.updateSxSheepSale(sxSheepSale);
    }

    /**
     * 批量删除羊只销售记录
     *
     * @param ids 需要删除的羊只销售记录主键
     * @return 结果
     */
    @Override
    public int deleteSxSheepSaleByIds(Long[] ids) {
        return sxSheepSaleMapper.deleteSxSheepSaleByIds(ids);
    }

    /**
     * 删除羊只销售记录信息
     *
     * @param id 羊只销售记录主键
     * @return 结果
     */
    @Override
    public int deleteSxSheepSaleById(Long id) {
        return sxSheepSaleMapper.deleteSxSheepSaleById(id);
    }

    /**
     * 【新增】根据耳号查询羊只信息
     */
    @Override
    public SxSheepSale selectSheepInfoByTag(String bsManageTags) {
        return sxSheepSaleMapper.selectSheepInfoByTag(bsManageTags);
    }

    /**
     * 【新增】自动计算总价、平均体重、平均单只价格
     */
    private void calculateSalesFields(SxSheepSale sxSheepSale) {
        String pricingMethod = sxSheepSale.getPricingMethod();
        BigDecimal unitPrice = sxSheepSale.getUnitPrice();

        // 获取羊只数量
        int sheepCount = 1;
        if (sxSheepSale.getBsManageTagsList() != null && !sxSheepSale.getBsManageTagsList().isEmpty()) {
            sheepCount = sxSheepSale.getBsManageTagsList().size();
        } else if (sxSheepSale.getBsManageTags() != null && !sxSheepSale.getBsManageTags().isEmpty()) {
            // 如果前端没有传递列表，但有逗号分隔的字符串，也计算数量
            sheepCount = sxSheepSale.getBsManageTags().split(",").length;
        }

        if ("按个体".equals(pricingMethod)) {
            // 总价 = 单价 * 数量
            if (unitPrice != null) {
                sxSheepSale.setTotalPrice(unitPrice.multiply(new BigDecimal(sheepCount)));
            }
            // 平均单只价格就是单价
            sxSheepSale.setAvgPricePerSheep(unitPrice);

        } else if ("按体重".equals(pricingMethod)) {
            BigDecimal totalWeight = sxSheepSale.getTotalWeight();
            // 总价 = 单价 * 总重量
            if (unitPrice != null && totalWeight != null) {
                sxSheepSale.setTotalPrice(unitPrice.multiply(totalWeight));
            }
            // 平均体重 = 总重量 / 数量
            if (totalWeight != null && sheepCount > 0) {
                sxSheepSale.setAvgWeight(totalWeight.divide(new BigDecimal(sheepCount), 2, RoundingMode.HALF_UP));
            }
            // 平均单只价格 = 总价 / 数量
            if (sxSheepSale.getTotalPrice() != null && sheepCount > 0) {
                sxSheepSale.setAvgPricePerSheep(sxSheepSale.getTotalPrice().divide(new BigDecimal(sheepCount), 2, RoundingMode.HALF_UP));
            }
        }
        // 可以添加其他计价方式的逻辑
    }

    /**
     * 【新增】业务字段验证
     */
    private void validateSalesFields(SxSheepSale sxSheepSale) {
        // 验证销售日期不能为空
        if (sxSheepSale.getSaleDate() == null) {
            throw new RuntimeException("销售日期不能为空！");
        }

        String saleType = sxSheepSale.getSaleType();
        // 如果销售类别是"淘汰销售"或"淘汰屠宰"，则疾病类型和班组不能为空
        if ("淘汰销售".equals(saleType) || "淘汰屠宰".equals(saleType)) {
            if (sxSheepSale.getDiseaseType() == null) {
                throw new RuntimeException("淘汰销售或淘汰屠宰必须选择疾病类型！");
            }
            if (sxSheepSale.getGroupCode() == null) {
                throw new RuntimeException("淘汰销售或淘汰屠宰必须选择班组！");
            }
        }
        // 如果疾病类型是"病残羊"，则次要原因不能为空
        if ("病残羊".equals(sxSheepSale.getDiseaseType())) {
            if (sxSheepSale.getSecondaryReason() == null || sxSheepSale.getSecondaryReason().trim().isEmpty()) {
                throw new RuntimeException("疾病类型为病残羊时，必须填写次要原因！");
            }
        }
    }
}