package com.jxy.marketall.task;

import com.jxy.common.core.text.Convert;
import com.jxy.common.core.utils.DateUtils;
import com.jxy.common.core.utils.StringUtils;
import com.jxy.common.redis.service.RedisService;
import com.jxy.marketall.dto.*;
import com.jxy.marketall.entity.ExchangeBalance;
import com.jxy.marketall.entity.Utxos;
import com.jxy.marketall.mapper.BTCNewV2Mapper;
import com.jxy.marketall.mapper.Utxos2ndMapper;
import com.jxy.marketall.mapper.UtxosMapper;
import com.jxy.marketall.vo.QueryVo;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;

import java.math.BigDecimal;
import java.util.*;


/**
 * @Description TODO
 * @Date 2022/7/26 17:03
 * @Author 杜懿
 */
@Configuration
@EnableScheduling
public class ExchangeBalanceTask {

    @Autowired
    private BTCNewV2Mapper btcNewV2Mapper;
    @Autowired
    private RedisService redisService;

    @Scheduled(cron = "0 0/1 * * * ?")
    public void BTCExchangeBalanceData(){

        List<ExchangeBalance> ebList = btcNewV2Mapper.getBTCExchangeBalance();
        ebList.sort((e1,e2) -> e1.getDate().compareTo(e2.getDate()));
        //根据日期补齐数据
        if(ebList.size() > 1){
            ebList = addDayDate(ebList);
        }

        Map<String,List<DateStringDto>> map = new HashMap<>();
        ebList.stream().forEach(e -> {
            DateStringDto dto = new DateStringDto();
            dto.setDate(e.getDate());
            dto.setValue(e.getEbalance() == 0? null:Convert.toStr(e.getEbalance()));
            if(!map.containsKey("all")){
                List<DateStringDto> list = new ArrayList<>();
                list.add(dto);
                map.put("all",list);
            }else{
                map.get("all").add(dto);
            }

            DateStringDto dto1 = new DateStringDto();
            dto1.setDate(e.getDate());
            dto1.setValue(e.getEbalance1() == 0? null:Convert.toStr(e.getEbalance1()));
            if(!map.containsKey(e.getEtag1())){
                List<DateStringDto> list1 = new ArrayList<>();
                list1.add(dto1);
                map.put(e.getEtag1(),list1);
            }else{
                map.get(e.getEtag1()).add(dto1);
            }

            DateStringDto dto2 = new DateStringDto();
            dto2.setDate(e.getDate());
            dto2.setValue(e.getEbalance2() == 0? null:Convert.toStr(e.getEbalance2()));
            if(!map.containsKey(e.getEtag2())){
                List<DateStringDto> list2 = new ArrayList<>();
                list2.add(dto1);
                map.put(e.getEtag2(),list2);
            }else{
                map.get(e.getEtag2()).add(dto2);
            }

            DateStringDto dto3 = new DateStringDto();
            dto3.setDate(e.getDate());
            dto3.setValue(e.getEbalance3() == 0? null:Convert.toStr(e.getEbalance3()));
            if(!map.containsKey(e.getEtag3())){
                List<DateStringDto> list3 = new ArrayList<>();
                list3.add(dto3);
                map.put(e.getEtag3(),list3);
            }else{
                map.get(e.getEtag3()).add(dto3);
            }

            DateStringDto dto4 = new DateStringDto();
            dto4.setDate(e.getDate());
            dto4.setValue(e.getEbalance4() == 0? null:Convert.toStr(e.getEbalance4()));
            if(!map.containsKey(e.getEtag4())){
                List<DateStringDto> list4 = new ArrayList<>();
                list4.add(dto4);
                map.put(e.getEtag4(),list4);
            }else{
                map.get(e.getEtag4()).add(dto4);
            }

            DateStringDto dto5 = new DateStringDto();
            dto5.setDate(e.getDate());
            dto5.setValue(e.getEbalance5() == 0? null:Convert.toStr(e.getEbalance5()));
            if(!map.containsKey(e.getEtag5())){
                List<DateStringDto> list5 = new ArrayList<>();
                list5.add(dto5);
                map.put(e.getEtag5(),list5);
            }else{
                map.get(e.getEtag5()).add(dto5);
            }
            DateStringDto dto6 = new DateStringDto();
            dto6.setDate(e.getDate());
            dto6.setValue(e.getEbalance6() == 0? null:Convert.toStr(e.getEbalance6()));
            if(!map.containsKey(e.getEtag6())){
                List<DateStringDto> list6 = new ArrayList<>();
                list6.add(dto6);
                map.put(e.getEtag6(),list6);
            }else{
                map.get(e.getEtag6()).add(dto6);
            }
            DateStringDto dto7 = new DateStringDto();
            dto7.setDate(e.getDate());
            dto7.setValue(e.getEbalance7() == 0? null:Convert.toStr(e.getEbalance7()));
            if(!map.containsKey(e.getEtag7())){
                List<DateStringDto> list7 = new ArrayList<>();
                list7.add(dto7);
                map.put(e.getEtag7(),list7);
            }else{
                map.get(e.getEtag7()).add(dto7);
            }
            DateStringDto dto8 = new DateStringDto();
            dto8.setDate(e.getDate());
            dto8.setValue(e.getEbalance8() == 0? null:Convert.toStr(e.getEbalance8()));
            if(!map.containsKey(e.getEtag8())){
                List<DateStringDto> list8 = new ArrayList<>();
                list8.add(dto8);
                map.put(e.getEtag8(),list8);
            }else{
                map.get(e.getEtag8()).add(dto8);
            }
            DateStringDto dto9 = new DateStringDto();
            dto9.setDate(e.getDate());
            dto9.setValue(e.getEbalance9() == 0? null:Convert.toStr(e.getEbalance9()));
            if(!map.containsKey(e.getEtag9())){
                List<DateStringDto> list9 = new ArrayList<>();
                list9.add(dto9);
                map.put(e.getEtag9(),list9);
            }else{
                map.get(e.getEtag9()).add(dto9);
            }
            DateStringDto dto10 = new DateStringDto();
            dto10.setDate(e.getDate());
            dto10.setValue(e.getEbalance10() == 0? null:Convert.toStr(e.getEbalance10()));
            if(!map.containsKey(e.getEtag10())){
                List<DateStringDto> list10 = new ArrayList<>();
                list10.add(dto10);
                map.put(e.getEtag10(),list10);
            }else{
                map.get(e.getEtag10()).add(dto10);
            }

        });



        //BinanceUS暂时无数据 可以删除
        map.remove("BinanceUS");
        Set<String> keys = map.keySet();

        if(keys.size() > 0){
            redisService.deleteObject("BTCExchangeBalanceMap");
            redisService.setCacheMap("BTCExchangeBalanceMap",map);
            redisService.deleteObject("BTCExchanges");
            redisService.setCacheSet("BTCExchanges",keys);
        }
    }

    @Scheduled(cron = "0 0/1 * * * ?")
    public void ETHExchangeBalanceData(){

        List<ExchangeBalance> ebList = btcNewV2Mapper.getETHExchangeBalance();

        ebList.sort((e1,e2) -> e1.getDate().compareTo(e2.getDate()));
        //根据日期补齐数据
        if(ebList.size() > 1){
            ebList = addDayDate(ebList);
        }

        Map<String,List<DateStringDto>> map = new HashMap<>();

        ebList.stream().forEach(e -> {
            DateStringDto dto = new DateStringDto();
            dto.setDate(e.getDate());
            dto.setValue(e.getEbalance() == 0 ? null:Convert.toStr(e.getEbalance()));
            if(!map.containsKey("all")){
                List<DateStringDto> list = new ArrayList<>();
                list.add(dto);
                map.put("all",list);
            }else{
                map.get("all").add(dto);
            }

            DateStringDto dto1 = new DateStringDto();
            dto1.setDate(e.getDate());
            dto1.setValue(e.getEbalance1() == 0? null:Convert.toStr(e.getEbalance1()));
            if(!map.containsKey(e.getEtag1())){
                List<DateStringDto> list1 = new ArrayList<>();
                list1.add(dto1);
                map.put(e.getEtag1(),list1);
            }else{
                map.get(e.getEtag1()).add(dto1);
            }

            DateStringDto dto2 = new DateStringDto();
            dto2.setDate(e.getDate());
            dto2.setValue(e.getEbalance2() == 0? null:Convert.toStr(e.getEbalance2()));
            if(!map.containsKey(e.getEtag2())){
                List<DateStringDto> list2 = new ArrayList<>();
                list2.add(dto1);
                map.put(e.getEtag2(),list2);
            }else{
                map.get(e.getEtag2()).add(dto2);
            }

            DateStringDto dto3 = new DateStringDto();
            dto3.setDate(e.getDate());
            dto3.setValue(e.getEbalance3() == 0? null:Convert.toStr(e.getEbalance3()));
            if(!map.containsKey(e.getEtag3())){
                List<DateStringDto> list3 = new ArrayList<>();
                list3.add(dto3);
                map.put(e.getEtag3(),list3);
            }else{
                map.get(e.getEtag3()).add(dto3);
            }

            DateStringDto dto4 = new DateStringDto();
            dto4.setDate(e.getDate());
            dto4.setValue(e.getEbalance4() == 0? null:Convert.toStr(e.getEbalance4()));
            if(!map.containsKey(e.getEtag4())){
                List<DateStringDto> list4 = new ArrayList<>();
                list4.add(dto4);
                map.put(e.getEtag4(),list4);
            }else{
                map.get(e.getEtag4()).add(dto4);
            }

            DateStringDto dto5 = new DateStringDto();
            dto5.setDate(e.getDate());
            dto5.setValue(e.getEbalance5() == 0? null:Convert.toStr(e.getEbalance5()));
            if(!map.containsKey(e.getEtag5())){
                List<DateStringDto> list5 = new ArrayList<>();
                list5.add(dto5);
                map.put(e.getEtag5(),list5);
            }else{
                map.get(e.getEtag5()).add(dto5);
            }
            DateStringDto dto6 = new DateStringDto();
            dto6.setDate(e.getDate());
            dto6.setValue(e.getEbalance6() == 0? null:Convert.toStr(e.getEbalance6()));
            if(!map.containsKey(e.getEtag6())){
                List<DateStringDto> list6 = new ArrayList<>();
                list6.add(dto6);
                map.put(e.getEtag6(),list6);
            }else{
                map.get(e.getEtag6()).add(dto6);
            }
            DateStringDto dto7 = new DateStringDto();
            dto7.setDate(e.getDate());
            dto7.setValue(e.getEbalance7() == 0? null:Convert.toStr(e.getEbalance7()));
            if(!map.containsKey(e.getEtag7())){
                List<DateStringDto> list7 = new ArrayList<>();
                list7.add(dto7);
                map.put(e.getEtag7(),list7);
            }else{
                map.get(e.getEtag7()).add(dto7);
            }
            DateStringDto dto8 = new DateStringDto();
            dto8.setDate(e.getDate());
            dto8.setValue(e.getEbalance8() == 0? null:Convert.toStr(e.getEbalance8()));
            if(!map.containsKey(e.getEtag8())){
                List<DateStringDto> list8 = new ArrayList<>();
                list8.add(dto8);
                map.put(e.getEtag8(),list8);
            }else{
                map.get(e.getEtag8()).add(dto8);
            }
            DateStringDto dto9 = new DateStringDto();
            dto9.setDate(e.getDate());
            dto9.setValue(e.getEbalance9() == 0? null:Convert.toStr(e.getEbalance9()));
            if(!map.containsKey(e.getEtag9())){
                List<DateStringDto> list9 = new ArrayList<>();
                list9.add(dto9);
                map.put(e.getEtag9(),list9);
            }else{
                map.get(e.getEtag9()).add(dto9);
            }
            DateStringDto dto10 = new DateStringDto();
            dto10.setDate(e.getDate());
            dto10.setValue(e.getEbalance10() == 0? null:Convert.toStr(e.getEbalance10()));
            if(!map.containsKey(e.getEtag10())){
                List<DateStringDto> list10 = new ArrayList<>();
                list10.add(dto10);
                map.put(e.getEtag10(),list10);
            }else{
                map.get(e.getEtag10()).add(dto10);
            }

        });

        if(ebList.size() > 1){
            ebList = addDayDate(ebList);
        }

        //BinanceUS暂时无数据 可以删除
        map.remove("BinanceUS");
        Set<String> keys = map.keySet();

        if(keys.size() > 0){
            redisService.deleteObject("ETHExchangeBalanceMap");
            redisService.setCacheMap("ETHExchangeBalanceMap",map);
            redisService.deleteObject("ETHExchanges");
            redisService.setCacheSet("ETHExchanges",keys);
        }
    }

    public List<ExchangeBalance> addDayDate(List<ExchangeBalance> oldList){
        oldList.sort((e1,e2) -> e1.getDate().compareTo(e2.getDate()));
        Date sDate = oldList.get(0).getDate();
        Date eDate = DateUtils.addDays(DateUtils.parseDate(DateUtils.getDate()),-1);
        Long diff = DateUtils.getDateDiff(eDate, sDate) +1;
        List<ExchangeBalance> newList = new ArrayList<>();
        int eNum = oldList.size();
        int tempNum = 0;
        Date tempDate = null;
        for (int i =0;i< diff;i++){
            if(tempNum < eNum){
                tempDate = oldList.get(tempNum).getDate();

                if(sDate.compareTo(tempDate) < 0){//补缺失数据
                    ExchangeBalance tempDBD = newExchangeBalance(oldList.get(0),sDate);
                    newList.add(tempDBD);
                }
                if(sDate.compareTo(tempDate) == 0){//直接拿取原有数据.
                    newList.add(oldList.get(tempNum));
                    tempNum++;
                }
            }
            else if(tempNum > eNum && sDate.compareTo(eDate) <=0){
                ExchangeBalance tempDBD = newExchangeBalance(oldList.get(0),sDate);
                newList.add(tempDBD);
            }
            sDate = DateUtils.addDays(sDate, 1);
        }

        return newList;
    }

    public static ExchangeBalance newExchangeBalance(ExchangeBalance e,Date date){
        ExchangeBalance tempEB= new ExchangeBalance();
        tempEB.setEtag1(e.getEtag1());
        tempEB.setEtag2(e.getEtag2());
        tempEB.setEtag3(e.getEtag3());
        tempEB.setEtag4(e.getEtag4());
        tempEB.setEtag5(e.getEtag5());
        tempEB.setEtag6(e.getEtag6());
        tempEB.setEtag7(e.getEtag7());
        tempEB.setEtag8(e.getEtag8());
        tempEB.setEtag9(e.getEtag9());
        tempEB.setEtag10(e.getEtag10());
        tempEB.setEbalance(0);
        tempEB.setEbalance1(0);
        tempEB.setEbalance2(0);
        tempEB.setEbalance3(0);
        tempEB.setEbalance4(0);
        tempEB.setEbalance5(0);
        tempEB.setEbalance6(0);
        tempEB.setEbalance7(0);
        tempEB.setEbalance8(0);
        tempEB.setEbalance9(0);
        tempEB.setEbalance10(0);
        tempEB.setDate(date);
        return tempEB;
    }

}
