package cn.wisenergy.service.app.impl;

import cn.wisenergy.common.utils.DateUtil;
import cn.wisenergy.common.utils.R;
import cn.wisenergy.mapper.AccountMapper;
import cn.wisenergy.mapper.LastAccountMapper;
import cn.wisenergy.mapper.TradeRecordMapper;
import cn.wisenergy.model.app.AccountInfo;
import cn.wisenergy.model.app.LastMonthAccount;
import cn.wisenergy.model.app.TradeRecord;
import cn.wisenergy.model.enums.TradeRecordEnum;
import cn.wisenergy.model.vo.*;
import cn.wisenergy.service.app.WalletService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

/**
 * @author 86187
 */
@Service
@Slf4j
public class WalletServiceImpl implements WalletService {
    private static final String PATTERN = "yyyy-MM";

    @Autowired
    private AccountMapper accountMapper;

    @Autowired
    private TradeRecordMapper tradeRecordMapper;

    @Autowired
    private LastAccountMapper lastAccountMapper;


    @Override
    public R<MoneyPackageVo> getMoneyPackage(String userId) {
        log.info("shop-mall[]WalletServiceImpl[]getMoneyPackage[]input.param.userId:" + userId);
        if (StringUtils.isBlank(userId)) {
            return R.error("入参为空!");
        }

        Date date = new Date();
        String yearMonth = DateUtil.convertDateToStr(date, PATTERN);

        //1、获取用户账户信息
        AccountInfo accountInfo = accountMapper.getByUserIdAndTime(userId, yearMonth);
        if (null == accountInfo) {
            return R.error("用户账户信息不存在!");
        }
        MoneyPackageVo moneyPackageVo = new MoneyPackageVo();
        moneyPackageVo.setUserId(accountInfo.getUserId());
        moneyPackageVo.setMoneyIncome(accountInfo.getEarningsMonth());
        moneyPackageVo.setTotalIncome(accountInfo.getEarningsTotal());
        moneyPackageVo.setCurrentMoneyCan(accountInfo.getExtractMoney());

        return R.ok(moneyPackageVo);
    }

    @Override
    public R<WithdrawalAmountVo> getWithdrawalAmount(String userId) {
        log.info("shop-mall[]WalletServiceImpl[]getWithdrawalAmount[]input.param.userId:" + userId);
        if (StringUtils.isBlank(userId)) {
            return R.error("入参为空!");
        }

        Date date = new Date();
        String yearMonth = DateUtil.convertDateToStr(date, PATTERN);

        WithdrawalAmountVo withdrawalAmountVo = new WithdrawalAmountVo();
        withdrawalAmountVo.setUserId(userId);
        withdrawalAmountVo.setWithdrawRule("这是一条规则!");

        //1、获取用户账户信息
        AccountInfo accountInfo = accountMapper.getByUserIdAndTime(userId, yearMonth);
        if (null == accountInfo) {
            withdrawalAmountVo.setCurrentMoneyCan(new BigDecimal(0));
        } else {
            withdrawalAmountVo.setCurrentMoneyCan(accountInfo.getExtractMoney());
        }

        //2、 获取上月未提现
        Calendar cal = Calendar.getInstance();
        cal.setTime(new Date());
        cal.add(Calendar.MONTH, -1);
        Date lastDate = cal.getTime();
        String lastMonthTime = DateUtil.convertDateToStr(lastDate, PATTERN);
        LastMonthAccount lastMonthAccount = lastAccountMapper.getByUserIdAndTime(userId, lastMonthTime);
        if (null == lastMonthAccount) {
            withdrawalAmountVo.setLastMoneyNot(new BigDecimal(0));
        } else {
            withdrawalAmountVo.setLastMoneyNot(lastMonthAccount.getExtractMoney());
        }
        return R.ok(withdrawalAmountVo);
    }

    @Override
    public R<List<AccumulatedIncomeVo>> showIncomeRecord(String userId) {
        log.info("shop-mall[]WalletServiceImpl[]showIncomeRecord[]input.param.userId:" + userId);
        if (StringUtils.isBlank(userId)) {
            return R.error("入参为空!");
        }

        //获取包括本月在内的六个月的收益
        List<AccumulatedIncomeVo> list = tradeRecordMapper.getSixMonthIncome(userId);
        return R.ok(list);
    }

    @Override
    public R<MoneyPackageDetailVo> queryIncomeDetail(String userId) {
        log.info("shop-mall[]WalletServiceImpl[]queryIncomeDetail[]input.param.userId:" + userId);
        if (StringUtils.isBlank(userId)) {
            return R.error("入参为空!");
        }

        Date date = new Date();
        String yearMonth = DateUtil.convertDateToStr(date, PATTERN);
        //获取当月账户信息
        AccountInfo accountInfo = accountMapper.getByUserIdAndTime(userId, yearMonth);
        if (null == accountInfo) {
            return R.error("账户信息为空!");
        }

        MoneyPackageDetailVo detailVo = new MoneyPackageDetailVo();
        detailVo.setUserId(userId);

        //获取培育奖信息
        BigDecimal earningsMonth = new BigDecimal(0);
        TradeRecord trade = tradeRecordMapper.getByUserIdAndTypeAndStatus(userId, TradeRecordEnum.CULTIVATING_PRIZE.getCode(),
                new Date(), 0);
        if (null != trade) {
            earningsMonth = accountInfo.getEarningsMonth().add(trade.getMoney());
        } else {
            earningsMonth = accountInfo.getEarningsMonth();
        }
        detailVo.setTotalIncome(earningsMonth);

        //获取本月交易记录
        List<TradeRecord> list = getTradeRecordList(userId);
        List<IncomeDetailVo> incomeDetailVos = new ArrayList<>();
        for (TradeRecord tradeRecord : list) {
            IncomeDetailVo incomeDetailVo = new IncomeDetailVo();
            String typeName = TradeRecordEnum.getByCode(tradeRecord.getTradeType());

            incomeDetailVo.setTypeName(typeName);
            incomeDetailVo.setMoney(tradeRecord.getMoney());
            incomeDetailVo.setIncomeTime(tradeRecord.getCreateTime());
            incomeDetailVos.add(incomeDetailVo);
        }

        detailVo.setList(incomeDetailVos);

        return R.ok(detailVo);
    }

    @Override
    public R<List<WithdrawalRecordVo>> getWithdrawalRecord(String userId, String yearMonth) {
        log.info("shop-mall[]WalletServiceImpl[]queryIncomeDetail[]input.param.yearMonth:" + yearMonth);
        if (StringUtils.isBlank(yearMonth)) {
            return R.error("入参为空!");
        }

        Date date = DateUtil.convertStrToDate(yearMonth, PATTERN);
        List<WithdrawalRecordVo> list = tradeRecordMapper.getWithdrawalRecord(userId, date);
        return R.ok(list);
    }

    private List<TradeRecord> getTradeRecordList(String userId) {
        List<TradeRecord> list = new ArrayList<>();
        Date date = new Date();
        //获取返佣、月度肥料、培育奖、最大进步奖、运营中心补贴类型交易记录
        //获取返佣本月交易记录
        List<TradeRecord> orderRebate = tradeRecordMapper.getRebateList(userId, date);
        if (!CollectionUtils.isEmpty(orderRebate)) {
            list.addAll(orderRebate);
        }

        //获取月度肥料本月交易记录
        TradeRecord monthFertilizer = tradeRecordMapper.getByUserIdAndType(userId,
                TradeRecordEnum.MONTHLY_FERTILIZER.getCode(), date);
        if (null != monthFertilizer) {
            list.add(monthFertilizer);
        }

        //获取培育奖本月交易记录
        TradeRecord trainRecord = tradeRecordMapper.getByUserIdAndType(userId,
                TradeRecordEnum.CULTIVATING_PRIZE.getCode(), date);
        if (null != trainRecord) {
            list.add(trainRecord);
        }

        //获取最大进步奖本月交易记录
        TradeRecord prizeRecord = tradeRecordMapper.getByUserIdAndType(userId,
                TradeRecordEnum.PROGRESS_PRIZE.getCode(), date);
        if (null != prizeRecord) {
            list.add(prizeRecord);
        }

        //获取运营中心补贴本月交易记录
        TradeRecord centerRecord = tradeRecordMapper.getByUserIdAndType(userId,
                TradeRecordEnum.RUN_CENTER_SUBSIDY.getCode(), date);
        if (null != centerRecord) {
            list.add(centerRecord);
        }
        return list;
    }
}