package com.brilliance.isc.common.transaction.newcheck.liaall;

import com.brilliance.isc.common.liaall.service.LiaallService;
import com.brilliance.isc.common.liaall.vo.LiaallVo;
import com.brilliance.isc.common.liaallr.vo.LiaallrVo;
import com.brilliance.isc.common.transaction.newcheck.AbstractModuleValidator;
import com.brilliance.isc.common.transaction.newcheck.ValidResult;
import com.brilliance.isc.common.transaction.newcheck.Validate;
import com.brilliance.isc.common.util.Utils;
import com.brilliance.mda.runtime.mda.impl.Argument;
import com.brilliance.mda.runtime.mda.util.Dates;
import com.brilliance.mda.runtime.mda.util.MdaUtils;
import com.brilliance.mda.runtime.mda.util.Strings;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.math.BigDecimal;
import java.util.Date;
@Component
public class LiaallrValidator extends AbstractModuleValidator<LiaallrVo> {

    @Autowired
    private LiaallService liaallService;

    @Validate(path ="liaall.liaallr.%s.amt")
    public ValidResult checkAmt(LiaallrVo liaallrVo){
        String id;
        Argument<String> idBox = new Argument<String>();
        String type;
        Argument<String> typeBox = new Argument<String>();
        String cur;
        Argument<String> curBox = new Argument<String>();
        BigDecimal allamt;
        Argument<BigDecimal> allamtBox = new Argument<BigDecimal>();
        liaallService.getReductionInfo(idBox, typeBox, curBox, allamtBox);
        id = idBox.value;
        type = typeBox.value;
        cur = curBox.value;
        allamt = allamtBox.value;
        if( ! MdaUtils.isEmpty(id) ) {
            BigDecimal amt = new BigDecimal("0");
            LiaallVo liaallVo = (LiaallVo)getParent();
            for(int i = 0; i < liaallVo.getLiaallr().size(); i++) {
                amt = amt.add(liaallVo.getLiaallr().get(i).getNewamt());
            }
            if(MdaUtils.compareTo(amt.negate(), allamt) > 0) {
                return ValidResult.build(false, Strings.formatText("The sum of the change amounts exceeds to contract amount of $1 $2.",liaallrVo.getCur(), Utils.fmtAmount(allamt,liaallrVo.getCur())));
            }
        }
        return null;
    }


    @Validate(path="liaall.liaallr.%s.matdat")
    public ValidResult checkMatdat(LiaallrVo liaallrVo){
        if (liaallrVo.getMatdat() != null) {
            LiaallVo liaallVo = (LiaallVo)getParent();
            Date expdat = liaallVo.getRec().getExpdat();
            if (expdat != null) {
                if(Dates.diff(liaallrVo.getMatdat(),expdat) >= 0 && liaallrVo.getOldamt().compareTo(BigDecimal.ZERO) == 0 ) {
                    return ValidResult.build(false, Strings.formatText("The change date has to be before the expiry date $1.", Utils.fmtDate(expdat)));
                }
            }
        }
        return null;
    }

}
