package com.github.wxiaoqi.security.admin.biz;

import com.ace.cache.annotation.Cache;
import com.ace.cache.annotation.CacheClear;
import com.github.wxiaoqi.security.admin.dto.BaseUserMemberVO;
import com.github.wxiaoqi.security.admin.dto.UserMemberDTO;
import com.github.wxiaoqi.security.admin.vo.AppUserVo;
import com.github.wxiaoqi.security.admin.vo.UserMemberVo;
import com.github.wxiaoqi.security.common.exception.BaseException;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.BeanUtilsBean;
import org.springframework.aop.framework.AopContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.task.TaskExecutor;
import org.springframework.stereotype.Service;
import com.github.wxiaoqi.security.admin.entity.BaseUserMember;
import com.github.wxiaoqi.security.admin.mapper.BaseUserMemberMapper;
import com.github.wxiaoqi.security.common.biz.BaseBiz;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import tk.mybatis.mapper.entity.Example;
import tk.mybatis.mapper.weekend.WeekendSqls;

import java.lang.reflect.InvocationTargetException;

import java.util.List;

/**
 * 用户会员表
 *
 * @author zjw
 * @email nishijjo@qq.com
 * @date 2019-06-18 19:38:56
 */
@Service
@Slf4j
@Transactional(rollbackFor = Exception.class)
public class BaseUserMemberBiz extends BaseBiz<BaseUserMemberMapper, BaseUserMember> {

    @Autowired
    AppUserDetailBiz detailBiz;

//    @Autowired
//    private TaskExecutor taskExecutor;
//
//    @Autowired
//    private UserMemberLevelBiz userMemberLevelBiz;
//
//    @Autowired
//    private AppUserLoginBiz appUserLoginBiz;

    //获取用户会员信息
    @Cache(key = "user:member{1}")
    public UserMemberVo getMemberInfoByUserId(Integer userId) {
        return mapper.getInfoByUserId(userId);
    }

    //更新会员信息
    @Override
    @CacheClear(key = "user:member{1.userId}")
    public void updateSelectiveById(BaseUserMember userMember) {
        super.updateSelectiveById(userMember);
    }


    //用户购买会员信息更新
    @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
    public void updUserMemberByUserId(UserMemberDTO userMemberDTO) throws Exception {
        if (userMemberDTO == null) {
            log.error("updUserMemberByUserId----参数为空");
            return;
        }
        Integer userId = userMemberDTO.getUserId();
        UserMemberVo userMemberVo = getMemberInfoByUserId(userId);
        BaseUserMember baseUserMember = new BaseUserMember();
        BeanUtils.copyProperties(baseUserMember, userMemberDTO);
        Integer freeDays = baseUserMember.getRentFreeDays();
        Integer totalNumber = baseUserMember.getTotalNumber() == null ? 0 : baseUserMember.getTotalNumber();
        if (freeDays == null || freeDays == 0) {
            freeDays = totalNumber;
        }
        Integer buyCount = 1;
        if (userMemberDTO.getBuyCount() != null) {
            buyCount = userMemberDTO.getBuyCount();
        }
        if (userMemberVo == null) {
            baseUserMember.setRentFreeDays(freeDays);
            baseUserMember.setBuyCount(buyCount);
            insertSelective(baseUserMember);
        } else {
            Integer discount = userMemberVo.getDiscount() == null ? 0 : userMemberVo.getDiscount();
            Integer discount1 = baseUserMember.getDiscount() == null ? 0 : baseUserMember.getDiscount();
            if (discount < discount1) {
                baseUserMember.setDiscount(discount);
            }
            Integer level = userMemberVo.getMemberLevel() == null ? 0 : userMemberVo.getMemberLevel();
            Integer level1 = baseUserMember.getMemberLevel() == null ? 0 : baseUserMember.getMemberLevel();
            if (level > level1) {
                baseUserMember.setMemberLevel(level);
            }
            baseUserMember.setId(userMemberVo.getId());
            totalNumber += userMemberVo.getTotalNumber() == null ? 0 : userMemberVo.getTotalNumber();
            freeDays += userMemberVo.getRentFreeDays() == null ? 0 : userMemberVo.getRentFreeDays();
            baseUserMember.setBuyCount(userMemberVo.getBuyCount() + buyCount);
            baseUserMember.setTotalNumber(totalNumber);
            baseUserMember.setRentFreeDays(freeDays);
            getMyBiz().updateSelectiveById(baseUserMember);
        }
        AppUserVo userVo = detailBiz.getUserInfoById(userId);
        if (userVo != null && (userVo.getIsMember() == null || userVo.getIsMember() == 0)) {
            AppUserVo userVo1 = new AppUserVo();
            userVo1.setId(userVo.getId());
            userVo1.setUserid(userId);
            userVo1.setIsMember(1);
            detailBiz.updUuserInfoById(userVo1);
        }

    }

    /**
     * //
     *
     * @param userId
     * @param days
     * @param type;1-用户锁定下单；2-购买下单;3-取消订单
     * @return
     */
    public int upMemberDays(Integer userId, Integer days, Integer type) {
        int num = -1;
        UserMemberVo userMemberVo = getMemberInfoByUserId(userId);
        if (userMemberVo != null) {
            days = days == null ? 0 : days;
            Integer freeDays = userMemberVo.getRentFreeDays() == null ? 0 : userMemberVo.getRentFreeDays();
            // Integer lockDays=userMemberVo.getLockDays()==null?userMemberVo.getLockDays():0;
            Integer totalNumber = userMemberVo.getTotalNumber() == null ? 0 : userMemberVo.getTotalNumber();
            BaseUserMember baseUserMember = new BaseUserMember();
            baseUserMember.setId(userMemberVo.getId());
            baseUserMember.setUserId(userId);
            if (type == 1) {
                /*if((freeDays-lockDays)>0&&(freeDays-lockDays)>=days){
                    baseUserMember.setLockDays(lockDays+days);
                    updateSelectiveById(baseUserMember);
                    num=freeDays-(lockDays+days);
                }*/
                if (freeDays > 0 && freeDays >= days) {
                    freeDays = freeDays - days;
                    baseUserMember.setRentFreeDays(freeDays);
                    Integer payCount = userMemberVo.getPayCount() == null ? 0 : userMemberVo.getPayCount();
                    if (days > 0) {
                        payCount = payCount + 1;
                    }
                    baseUserMember.setPayCount(payCount);
                    getMyBiz().updateSelectiveById(baseUserMember);
                    num = freeDays;
                }
            } else if (type == 2) {
                    /*Integer payCount=userMemberVo.getPayCount()==null?0:userMemberVo.getPayCount();
                    payCount=payCount+1;
                    freeDays=(freeDays-days)>0?(freeDays-days):0;
                    lockDays=lockDays>0?(lockDays-days)>0?(lockDays-days):0:0;
                    baseUserMember.setRentFreeDays(freeDays);
                    baseUserMember.setPayCount(payCount);
                    baseUserMember.setLockDays(lockDays);
                    updateSelectiveById(baseUserMember);
                    num=freeDays-lockDays;*/
                /*Integer payCount=userMemberVo.getPayCount()==null?0:userMemberVo.getPayCount();
                if(days>0){
                    payCount=payCount+1;
                }
                baseUserMember.setPayCount(payCount);
                getMyBiz().updateSelectiveById(baseUserMember);*/
                num = freeDays;
            } else {
                /*lockDays=lockDays>0?(lockDays-days)>0?(lockDays-days):0:0;
                baseUserMember.setLockDays(lockDays);
                getMyBiz().updateSelectiveById(baseUserMember);
                num=freeDays-lockDays;*/
                freeDays = (freeDays + days) > 0 ? (freeDays + days) : 0;
                freeDays = freeDays > totalNumber ? totalNumber : freeDays;
                baseUserMember.setRentFreeDays(freeDays);
                getMyBiz().updateSelectiveById(baseUserMember);
                num = freeDays;
            }

        }
        return num;
    }

    private BaseUserMemberBiz getMyBiz() {
        return AopContext.currentProxy() != null ? (BaseUserMemberBiz) AopContext.currentProxy() : this;
    }

    /**
     * 获取用户会员信息
     *
     * @param userId
     * @return
     */
    public BaseUserMemberVO findOneByUserId(Integer userId) {

        BaseUserMemberVO baseUserMemberVO = mapper.getBaseUserMemberVOByUserId(userId);
        if (baseUserMemberVO != null) {
            return baseUserMemberVO;
        }
        return new BaseUserMemberVO();

    }


    /**
     * 设置用户会员
     *
     * @param baseUserMemberVO
     */
    @Transactional(rollbackFor = Exception.class)
    public void UpdateUserMember(BaseUserMemberVO baseUserMemberVO) throws InvocationTargetException, IllegalAccessException {

        Example exa = Example.builder(BaseUserMember.class).where(
                WeekendSqls.<BaseUserMember>custom()
                        .andEqualTo(BaseUserMember::getUserId, baseUserMemberVO.getUserId())
        ).build();

        List<BaseUserMember> baseUserMembers = mapper.selectByExample(exa);

        BaseUserMember baseUserMember = new BaseUserMember();
        BeanUtilsBean.getInstance().copyProperties(baseUserMember, baseUserMemberVO);

        if (baseUserMembers == null || baseUserMembers.size() == 0) {

            if (baseUserMemberVO.getMemberLevel() == null || baseUserMember.getValidTime() == null) return;
            baseUserMember.setCrtTime(System.currentTimeMillis());
            baseUserMember.setIsDel(0);
            baseUserMember.setPayCount(0);
            baseUserMember.setCardLeave(1);
            baseUserMember.setRecentRecharge(System.currentTimeMillis());
            Integer buyCount = baseUserMember.getBuyCount() == null ? 0 : baseUserMember.getBuyCount();
            baseUserMember.setBuyCount(buyCount + 1);
            insertSelective(baseUserMember);
            return;

        } else if (baseUserMembers.size() == 1) {
            if (baseUserMemberVO.getMemberLevel() == null || baseUserMember.getValidTime() == null) {
                baseUserMember.setTotalNumber(0);
                baseUserMember.setRentFreeDays(0);
            } else {
            }
            baseUserMember.setUpdTime(System.currentTimeMillis());
            baseUserMember.setBuyCount(baseUserMembers.get(0).getBuyCount() + 1);
            baseUserMember.setId(baseUserMembers.get(0).getId());
            mapper.updateByPrimaryKeySelective(baseUserMember);


        } else {
            throw new BaseException("Member purchase repeat!");
        }


    }

}