package com.zehong.system.service.impl.tradeSettlement;

import com.zehong.common.core.exception.BusinessException;
import com.zehong.common.utils.SecurityUtils;
import com.zehong.system.domain.TAccount;
import com.zehong.system.domain.TCashOperate;
import com.zehong.system.domain.TTradeProject;
import com.zehong.system.mapper.TAccountMapper;
import com.zehong.system.mapper.TCashOperateMapper;
import com.zehong.system.mapper.TTradeProjectMapper;
import io.jsonwebtoken.lang.Collections;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

/**
 * @author geng
 * 交易结算
 */
@Component
public class SettlePayAmount {

    private static final Logger log = LoggerFactory.getLogger(SettlePayAmount.class);

    private TTradeProject tradeProject;

    @Resource
    private TAccountMapper tAccountMapper;

    @Resource
    private TTradeProjectMapper tTradeProjectMapper;

    @Resource
    private TCashOperateMapper cashOperateMapper;

    @Autowired
    private AutoSettlePendingPayment autoSettlePendingPayment;

    /**
     * 可用账户结算
     */
    public void settlePayAmount(TTradeProject tradeProject, TTradeProject tradeInfo){
        //对象已更新尾款值
        this.tradeProject = tradeInfo;
        this.tradeProject.setPayAmount(tradeProject.getPayAmount());
        //买方结算
        settleBuyerAbleAmount();
        //卖方结算
        settleSellerAbleAmount();
    }


    /**
     * 买方结算
     */
    private void settleBuyerAbleAmount() {
        TAccount account = getAccountInfo(this.tradeProject.getTradeDeptId());
        BigDecimal payAmount = this.tradeProject.getPayAmount();
        //判断买方可用额度是否足够支付本次金额
        if(account.getAbleAmount().compareTo(payAmount) == -1){
            throw new BusinessException("账户可用金额不足");
        }
        //更新可用额度
        updateAccount(account, payAmount.negate());
    }

    /**
     * 卖方结算
     */
    private void settleSellerAbleAmount() {
        TAccount account = getAccountInfo(this.tradeProject.getApplyDeptId());
        BigDecimal payAmount = this.tradeProject.getPayAmount();
        //更新可用额度
        updateAccount(account,payAmount);
        //卖方账户自动划拨如开启，自动结算本部门未付尾款
        autoSettlePendingPayment.autoSettlePendingPayment(payAmount,account,this.tradeProject.getApplyDeptId());
    }

    /**
     * 获取账户信息
     * @param deptId
     * @return
     */
    private TAccount getAccountInfo(Long deptId){
        TAccount tAccount = new TAccount();
        tAccount.setDeptId(deptId);
        List<TAccount> accounts =  tAccountMapper.selectTAccountList(tAccount);
        if(Collections.isEmpty(accounts)){
            log.error("交易部门资金账户不能为空，部门id:" + tradeProject.getApplyDeptId());
            throw new BusinessException("交易部门资金账户不能为空!");
        }
        return accounts.get(0);
    }


    /**
     * 更新账户可用金额
     * @param tAccount 账户信息
     * @param  amount 账户变动金额
     */
    private void updateAccount(TAccount tAccount,BigDecimal amount){
        if(amount.compareTo(BigDecimal.ZERO) == 0) return;
        tAccount.setAbleAmount(tAccount.getAbleAmount().add(amount));
        tAccount.setUpdateTime(new Date());
        tAccountMapper.updateTAccount(tAccount);
        //更新资金变动日志
        TCashOperate operate = new TCashOperate();
        operate.setOperateDeptId(tAccount.getDeptId());
        operate.setOperateAmount(amount.compareTo(BigDecimal.ZERO) == 1?amount:amount.abs());
        operate.setOperateTime(new Date());
        operate.setRelationDoc(this.tradeProject.getTradeId().toString());
        //1.交易单 2.借支单 3.外部采购单 4.借贷单
        operate.setDocumentType("1");
        operate.setOperateType(amount.compareTo(BigDecimal.ZERO) == 1 ? "1" : "2");
        operate.setOperatePersonId(SecurityUtils.getLoginUser().getUser().getUserId());
        cashOperateMapper.insertTCashOperate(operate);
    }

}
