package policy.rule.action;

import java.math.BigDecimal;

import foundation.dao.DataWriter;
import policy.OrderEvent;
import policy.rule.CheckLevel;
import policy.rule.CheckResult;
import policy.rule.OrderCalculator;
import policy.rule.RuleAction;

public class DiscountQtyTotalQtyCheck extends RuleAction {

	public static String remark = "买赠数量在订单总数量中的占比不能高于 50%";
	
	public DiscountQtyTotalQtyCheck() {
		super();
	}

	@Override
	public void createBoard(OrderCalculator calculator, CheckResult result) {
		//1. 买赠数量
		BigDecimal discountQty = calculator.getDiscountQty();
		
		//2. 订单总数量
		BigDecimal totalQty = calculator.getTotalQty();
		
		//3. 计算结果
		BigDecimal rate = OrderCalculator.divide(discountQty, totalQty);
		boolean success = rate.compareTo(meta.getRateValue()) <= 0;
		
		result.setSuccess(success);
		
		if (!success) {
			result.writeOneRemark("买赠数量在订单总数量中的占比:" + formatRate(rate));
		}
	}

	@Override
	public boolean check(OrderCalculator calculator, OrderEvent event, DataWriter dataWriter) {
		//1. 买赠数量
		BigDecimal discountQty = calculator.getDiscountQty();
		
		//2. 订单总数量
		BigDecimal totalQty = calculator.getTotalQty();
		
		//3. 计算结果
		BigDecimal rate = OrderCalculator.divide(discountQty, totalQty);
		boolean success = rate.compareTo(meta.getRateValue()) <= 0;
		
		BigDecimal value = meta.getValue();
		if(value == null ) {
			value = BigDecimal.ZERO;
		}
		value = value.setScale(2, BigDecimal.ROUND_HALF_UP);
		
		if (!success) {
			dataWriter.reportOneError("DiscountQtyTotalQtyCheck", "订单检查不通过:" + meta.getTitle() + value + meta.getUnit());
			dataWriter.reportOneError("DiscountQtyTotalQtyCheck", "     " + "买赠数量在订单总数量中的占比:" + formatRate(rate));
		}		
		
		if(CheckLevel.Info.equals(meta.getLevel())) {
			success = true;
		}
		
		return success;
	}

}