//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

package nc.impl.pu.m23.maintain.rule;

import nc.bs.framework.common.NCLocator;
import nc.impl.pubapp.pattern.rule.IRule;
import nc.pubitf.so.m30.api.ISaleOrderQueryAPI;
import nc.vo.pu.m21.entity.OrderItemVO;
import nc.vo.pu.m21.entity.OrderVO;
import nc.vo.pu.m23.entity.ArriveItemVO;
import nc.vo.pu.m23.entity.ArriveVO;
import nc.vo.pu.pub.util.BillQuery;
import nc.vo.pub.BusinessException;
import nc.vo.so.m30.entity.SaleOrderBVO;
import org.apache.commons.lang3.StringUtils;

import java.text.SimpleDateFormat;
import java.util.Date;

public class CheckBillDateRule  implements IRule<ArriveVO> {
    public CheckBillDateRule() {
    }
    // 日期格式化工具，使用Java标准库
    private static final SimpleDateFormat DATE_FORMATTER = new SimpleDateFormat("yyyy-MM-dd");

    public void process(ArriveVO[] vos) {


// 提取API服务实例到循环外，提升性能
          try{for (ArriveVO vo : vos) {
              // 校验到货单主信息是否存在
              if (vo == null || vo.getHVO() == null) {
                  throw new BusinessException("到货单主信息不能为空");
              }

              Date arriveMakeDate = vo.getHVO().getDmakedate().toDate();
              // 校验制单日期是否存在
              if (arriveMakeDate == null) {
                  throw new BusinessException("到货单制单日期不能为空");
              }

              // 遍历到货单明细
              ArriveItemVO[] itemVOs = vo.getBVO();
              if (itemVOs == null || itemVOs.length==0) {
                  continue; // 没有明细则跳过当前到货单处理
              }

              for (ArriveItemVO itemVO : itemVOs) {
                  // 校验明细必要字段
                  if (itemVO == null) {
                      throw new BusinessException("到货单明细不能为空");
                  }
                  String pkOrder = itemVO.getPk_order();
                  String pkOrderB = itemVO.getPk_order_b();
                  if (StringUtils.isEmpty(pkOrder) || StringUtils.isEmpty(pkOrderB)) {
                      throw new BusinessException("采购订单ID或订单明细ID不能为空");
                  }

                  try {
                      // 查询对应的销售订单
                      OrderVO[] orderVOs =new BillQuery<OrderVO>(OrderVO.class).query(new String[]{pkOrder});
                      if (orderVOs == null || orderVOs.length == 0) {
                          return;
//                          throw new BusinessException("未找到ID为" + pkOrder + "的采购订单");
                      }

                      // 获取订单明细
                      OrderVO o = orderVOs[0];
                      OrderItemVO[] orderItemVOs = o.getBVO();
                      if (orderItemVOs == null || orderItemVOs.length == 0) {
                          return;
//                          throw new BusinessException("采购订单" + pkOrder + "没有明细数据");
                      }

                      // 查找匹配的订单明细
                      boolean found = false;
                      for (OrderItemVO orderItem : orderItemVOs) {
                          if (orderItem != null && pkOrderB.equals(orderItem.getPk_order_b())) {
                              found = true;
                              Date expectArriveDate = orderItem.getDplanarrvdate().toDate();
                              if (expectArriveDate == null) {
                                  throw new BusinessException("采购订单明细" + pkOrderB + "的计划到货时间不能为空");
                              }

                              // 核心逻辑：只允许提前3天到货
                              // 1. 计算预计到货时间前3天的日期（最早允许的制单日期）
                              Date earliestAllowedDate = addDays(expectArriveDate, -3);

                              // 2. 判断规则
                              boolean isTooEarly = arriveMakeDate.before(earliestAllowedDate);
                              boolean isTooLate = arriveMakeDate.after(expectArriveDate);

                              if (isTooEarly || isTooLate) {
                                  String errorMsg;
                                  if (isTooEarly) {
                                      errorMsg = String.format(
                                              "到货单制单日期(%s)早于采购订单预计到货时间(%s)超过3天，不允许保存。最早允许制单日期为%s。订单编号：%s，明细行号：%s",
                                              formatDate(arriveMakeDate),
                                              formatDate(expectArriveDate),
                                              formatDate(earliestAllowedDate),
                                              o.getHVO().getVbillcode(),
                                              orderItem.getCrowno()
                                      );
                                  } else { // isTooLate
                                      errorMsg = String.format(
                                              "到货单制单日期(%s)晚于采购订单预计到货时间(%s)，不符合提前到货规则，不允许保存。订单编号：%s，明细行号：%s",
                                              formatDate(arriveMakeDate),
                                              formatDate(expectArriveDate),
                                              o.getHVO().getVbillcode(),
                                              orderItem.getCrowno()
                                      );
                                  }
                                  throw new BusinessException(errorMsg);
                              }
                              break; // 找到匹配明细后退出循环
                          }
                      }

                      if (!found) {
                          throw new BusinessException("未找到采购订单" + pkOrder + "中ID为" + pkOrderB + "的明细");
                      }

                  } catch (BusinessException e) {
                      // 直接抛出业务异常，中断流程
                      throw e;
                  } catch (Exception e) {
                      // 捕获其他异常并包装为业务异常
                      throw new BusinessException("校验采购订单与到货单时间关系时发生错误：" + e.getMessage(), e);
                  }
              }
          }

          } catch (Exception e) {
              throw new RuntimeException(e);
          }




    }

    // 自定义日期加减方法，替代DateUtils.addDays
    private static Date addDays(Date date, int days) {
        if (date == null) {
            return null;
        }
        long time = date.getTime() + (long) days * 24 * 60 * 60 * 1000;
        return new Date(time);
    }

    // 自定义日期格式化方法，替代DateUtils.format
    private static String formatDate(Date date) {
        if (date == null) {
            return "";
        }
        synchronized (DATE_FORMATTER) { // 解决线程安全问题
            return DATE_FORMATTER.format(date);
        }
    }


}
