
package com.heyu.api.data.service.bussiness;


import com.alibaba.fastjson.JSON;
import com.heyu.api.data.constants.ApiConstants;
import com.heyu.api.data.constants.RedisConstans;
import com.heyu.api.data.dao.calca.CalcaTokenDao;
import com.heyu.api.data.dao.calca.CalcaTokenFaceDao;
import com.heyu.api.data.dto.AccountDTO;
import com.heyu.api.data.dto.CalcaTokenFaceListResp;
import com.heyu.api.data.dto.CalcaTokenListResp;
import com.heyu.api.data.dto.TokenDTO;
import com.heyu.api.data.entity.calca.CalcaAccountEntity;
import com.heyu.api.data.entity.calca.CalcaTokenEntity;
import com.heyu.api.data.entity.calca.CalcaTokenFaceEntity;
import com.heyu.api.data.service.calca.CalcaAccountService;
import com.heyu.api.data.service.calca.CalcaTokenFaceService;
import com.heyu.api.data.service.calca.CalcaTokenService;
import com.heyu.api.data.utils.R;
import com.heyu.api.data.utils.RedisUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

@Service
@Slf4j
public class RedisSettingService {

    @Autowired
    private RedisUtils redisUtils;

    @Autowired
    private CalcaTokenService calcaTokenService;



    @Autowired
    private CalcaTokenFaceService calcaTokenFaceService;

    @Autowired
    private CalcaAccountService calcaAccountService;


    @Autowired
    private CalcaTokenDao calcaTokenDao;

    @Autowired
    private CalcaTokenFaceDao calcaTokenFaceDao;


    public R insertDataAndUpdateRedisData(CalcaTokenEntity calcaTokenEntity) {
        calcaTokenService.insertCalcaToken(calcaTokenEntity);
        addTokenInfoToRedis(calcaTokenEntity.getToken());
        return R.ok();
    }

    public void deleteTokenInfo(String token) {
        log.info("token:{}信息 ,已经从redis删除", token);
        redisUtils.delete(ApiConstants.TOKEN_INFO + token);
    }

    public  void addTokenInfoToRedis(String token) {
        List<CalcaTokenListResp> calcaTokenListResps  = getTokenInfo(token);
        for (CalcaTokenListResp calcaTokenListResp : calcaTokenListResps) {
            TokenDTO tokenDTO = new TokenDTO();
            tokenDTO.setUserName(calcaTokenListResp.getUserName());
            tokenDTO.setMinutesVisitLimit(calcaTokenListResp.getMinutesVisitLimit());
            List<String> faces = new ArrayList<>();
            for (CalcaTokenFaceListResp calcaTokenFaceListResp : calcaTokenListResp.getFaceList()) {
                faces.add(calcaTokenFaceListResp.getFace());
            }
            tokenDTO.setFaces(faces);
            String key = ApiConstants.TOKEN_INFO + token;
            log.info("token info 存储到redis中，key:{}，存储的对象是:{}", key, JSON.toJSONString(tokenDTO));
            redisUtils.set(key, JSON.toJSONString(tokenDTO), RedisConstans.SECOND_OF_ONE_DAY);
        }


    }



    public List<CalcaTokenListResp> getTokenInfo(String token) {
        List<CalcaTokenListResp> ds = new ArrayList<>();
        List<CalcaTokenEntity> calcaTokenEntities = calcaTokenDao.selectCalcaTokenByToken(token);
        for (CalcaTokenEntity entity : calcaTokenEntities) {

            // 封装参数
            CalcaTokenListResp calcaTokenListResp = new CalcaTokenListResp();

            calcaTokenListResp.setAvailable(entity.getAvailable());
            calcaTokenListResp.setCreateTime(entity.getCreateTime());
            calcaTokenListResp.setToken(entity.getToken());
            calcaTokenListResp.setUserName(entity.getUserName());
            calcaTokenListResp.setMinutesVisitLimit(entity.getMinutesVisitLimit());


            List<CalcaTokenFaceEntity> calcaTokenFaceEntities = calcaTokenFaceDao.selectCalcaTokenFaceByToken(entity.getToken());


            List<CalcaTokenFaceListResp> calcaTokenFaceListResps = new ArrayList<>();
            for (CalcaTokenFaceEntity calcaTokenFaceEntity : calcaTokenFaceEntities) {
                CalcaTokenFaceListResp calcaTokenFaceListResp = new CalcaTokenFaceListResp();
                calcaTokenFaceListResp.setFace(calcaTokenFaceEntity.getFace());
                calcaTokenFaceListResp.setCreateTime(calcaTokenFaceEntity.getCreateTime());
                calcaTokenFaceListResps.add(calcaTokenFaceListResp);
            }
            calcaTokenListResp.setFaceList(calcaTokenFaceListResps);

            ds.add(calcaTokenListResp);
        }
        return ds;
    }

    /**
     * 绑定token 并将数据同步到redis
     *
     * @param calcaTokenFaceEntity
     * @return
     */
    public void insertCalcaTokenFaceAndSynRedisData(CalcaTokenFaceEntity calcaTokenFaceEntity) {
        calcaTokenFaceService.insertCalcaTokenFace(calcaTokenFaceEntity);
        addTokenInfoToRedis(calcaTokenFaceEntity.getToken());
    }

    public void updateCalcaTokenFaceAndSynRedisData(CalcaTokenFaceEntity entity) {
        calcaTokenFaceService.updateCalcaTokenFaceById(entity);
        addTokenInfoToRedis(entity.getToken());
    }


    public void  addAccountInfoToRedis(String token) {

        List<CalcaTokenEntity> calcaTokenEntities = calcaTokenDao.selectCalcaTokenByToken(token);
        for (CalcaTokenEntity entity : calcaTokenEntities) {
            CalcaAccountEntity calcaAccountEntity = calcaAccountService.selectCalcaAccountByUserName(entity.getUserName());
            AccountDTO accountDTO = new AccountDTO();
            accountDTO.setAmount(calcaAccountEntity.getCurrentAmount());
            accountDTO.setUserName(calcaAccountEntity.getUserName());
            accountDTO.setMinutesVisitLimit(accountDTO.getMinutesVisitLimit());
            String accountInfoKey = ApiConstants.ACCOUNT_INFO + entity.getUserName();
            redisUtils.set(accountInfoKey, JSON.toJSONString(accountDTO), RedisConstans.SECOND_OF_ONE_DAY);
            log.info("设置account info 值到redis 成功key :{}:{}", accountInfoKey, JSON.toJSONString(accountDTO));
        }
    }
}
