package cn.com.ctop.kuaishou.modules.report.service.impl;

import cn.com.ctop.common.module.service.IMaterialAscriptionService;
import cn.com.ctop.kuaishou.modules.batch.service.IKuaiShouReportDailyMaterialService;
import cn.com.ctop.kuaishou.modules.report.entity.KuaiShouReportDailyMaterial;
import cn.com.ctop.kuaishou.modules.report.entity.KuaishouProjectVideoEtlInfo;
import cn.com.ctop.kuaishou.modules.report.entity.KuaishouVideoEtlInfo;
import cn.com.ctop.kuaishou.modules.report.mapper.KuaishouVideoEtlInfoMapper;
import cn.com.ctop.kuaishou.modules.report.service.IKuaishouProjectVideoEtlInfoService;
import cn.com.ctop.kuaishou.modules.report.service.IKuaishouVideoEtlInfoService;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.util.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 快手视频信息清洗表(有效，爆款)
 * @author jeecg-boot
 * @date   2020-12-17
 * @version V1.0
 */
@Slf4j
@Service
public class KuaishouVideoEtlInfoServiceImpl extends ServiceImpl<KuaishouVideoEtlInfoMapper, KuaishouVideoEtlInfo> implements IKuaishouVideoEtlInfoService {
    @Autowired
    private KuaishouVideoEtlInfoMapper kuaishouVideoEtlInfoMapper;
    @Autowired
    private IKuaiShouReportDailyMaterialService dailyMaterialService;
    static ExecutorService executorService = Executors.newFixedThreadPool(100);
    @Override
    public void etlKuaishouVideoInfo(Date getDate) {
        String date = DateUtils.formatDate(getDate);
        //1:查询单当日视频信息
        List<KuaiShouReportDailyMaterial> materials = dailyMaterialService.getSignatureByDate(date);
        if(null!=materials&&!materials.isEmpty()){
            CountDownLatch countDownLatch= new CountDownLatch(materials.size());
            materials.forEach(material->{
                executorService.submit(()->{
                    try {
                        if(null == material.getSignature()||material.getSignature().trim().equals("")){
                            return;
                        }

                        String signature = material.getSignature();
                        KuaishouVideoEtlInfo etlInfo = this.getBySignature(signature);
                        KuaiShouReportDailyMaterial nowData = dailyMaterialService.getEtlDataByParams(signature,date,null);
                        String minDate = nowData.getStatDate();
                        Integer days = DateUtils.getdaysOfTwoDate(minDate,date);
                        if(null == etlInfo){
                            //第一次查询的数据
                            etlInfo = new KuaishouVideoEtlInfo(nowData);
                            BigDecimal totalCost = etlInfo.getTotalCost();
                            JSONObject ascription =  materialAscriptionService.getDetailByCode(signature);
                            String planId = null;
                            if(null!=ascription){
                                planId = ascription.getString("planId");
                                if(null!=planId&&!planId.trim().equals("")){
                                    etlInfo.setPlanId(planId);
                                }
                                String planName =  ascription.getString("planName");
                                if(null!=planName&&!planName.trim().equals("")){
                                    etlInfo.setPlanName(planName);
                                }
                                String clipId = ascription.getString("clipId");
                                if(null!=clipId&&!clipId.trim().equals("")){
                                    etlInfo.setClipId(clipId);
                                }
                                String clipName = ascription.getString("clipName");
                                if(null!=clipName&&!clipName.trim().equals("")){
                                    etlInfo.setClipName(clipName);
                                }
                                String shotId = ascription.getString("shotId");
                                if(null!=shotId&&!shotId.trim().equals("")){
                                    etlInfo.setShotId(shotId);
                                }
                                String shotName = ascription.getString("shotName");
                                if(null!=shotName&&!shotName.trim().equals("")){
                                    etlInfo.setShotName(shotName);
                                }
                            }
                            if(null!=planId){
                                String companyName = kuaishouVideoEtlInfoMapper.getCompanyNameByUserId(planId);
                                if (null!=companyName&&!companyName.trim().equals("")){
                                    etlInfo.setCompanyName(companyName);
                                }
                            }
                            //计算投放总天数
                            if(days <= 7){
                                etlInfo.setSingleWeekCost(nowData.getCharge());
                            }
                            if(days <= 14){
                                etlInfo.setTwoWeekCost(nowData.getCharge());
                            }
                            if(days <= 28){
                                etlInfo.setFourWeekCost(nowData.getCharge());
                            }
                            //计算是否有效，爆款
                            if(totalCost.compareTo(new BigDecimal("5000"))>0){
                                //此刻成为有效
                                etlInfo.setEffectDate(date);
                                etlInfo.setEffectDayNum(days);
                            }
                            if(totalCost.compareTo(new BigDecimal("50000"))>0){
                                //此刻成为爆款
                                etlInfo.setFaddishDate(date);
                                etlInfo.setFaddishDayNum(days);
                            }
                            etlInfo.setCreateTime(new Date());
                            etlInfo.setUpdateTime(new Date());
                            this.save(etlInfo);
                        }else{
                            //只需要更新汇总数据
                            etlInfo.setTotalCost(nowData.getCharge());
                            etlInfo.setAclick(nowData.getAclick());
                            etlInfo.setBclick(nowData.getBclick());
                            etlInfo.setPhotoClick(nowData.getPhotoClick());
                            etlInfo.setPhotoShow(nowData.getPhotoShow());
                            etlInfo.setUpdateTime(new Date());
                            BigDecimal totalCost = etlInfo.getTotalCost();
                            //计算投放总天数
                            if(days <= 7){
                                etlInfo.setSingleWeekCost(nowData.getCharge());
                            }
                            if(days <= 14){
                                etlInfo.setTwoWeekCost(nowData.getCharge());
                            }
                            if(days <= 28){
                                etlInfo.setFourWeekCost(nowData.getCharge());
                            }
                            if(null == etlInfo.getEffectDayNum()){
                                if(totalCost.compareTo(new BigDecimal("5000"))>0){
                                    //此刻成为有效
                                    etlInfo.setEffectDate(date);
                                    etlInfo.setEffectDayNum(days);
                                }
                            }
                            if(null == etlInfo.getFaddishDayNum()){
                                if(totalCost.compareTo(new BigDecimal("50000"))>0){
                                    //此刻成为爆款
                                    etlInfo.setFaddishDate(date);
                                    etlInfo.setFaddishDayNum(days);
                                }
                            }
                            this.updateById(etlInfo);
                        }
                    }catch (Exception e){

                    }finally {
                        countDownLatch.countDown();
                    }
                });
            });

            try {
                countDownLatch.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            log.info("{}数据获取完成",date);
        }
    }

    @Autowired
    private IKuaishouProjectVideoEtlInfoService kuaishouProjectVideoEtlInfoService;
    @Override
    public void etlKuaishouVideoInfoGroupByProjectId(Date getDate) {
        String date = DateUtils.formatDate(getDate);
        //1:查询单当日视频信息--以项目汇总
        List<KuaiShouReportDailyMaterial> materials = dailyMaterialService.getSignatureByDateGroupByProjectId(date);
        if(null!=materials&&!materials.isEmpty()){
            CountDownLatch countDownLatch= new CountDownLatch(materials.size());
            materials.forEach(material->{
                executorService.submit(()->{
                    try {
                        if(null == material.getSignature()||material.getSignature().trim().equals("")){
                            return;
                        }
                        if(null == material.getProjectId()||material.getProjectId() == 0){
                            return;
                        }

                        String signature = material.getSignature();
                        Long projectId = material.getProjectId();
                        KuaishouProjectVideoEtlInfo etlInfo = kuaishouProjectVideoEtlInfoService.getByProjectVideoEtlInfoByParams(signature,projectId);
                        KuaiShouReportDailyMaterial nowData = dailyMaterialService.getEtlDataByParams(signature,date,projectId);
                        String minDate = nowData.getStatDate();
                        Integer days = DateUtils.getdaysOfTwoDate(minDate,date);
                        if(null == etlInfo){
                            //第一次查询的数据
                            etlInfo = new KuaishouProjectVideoEtlInfo(nowData,projectId);
                            JSONObject ascription =  materialAscriptionService.getDetailByCode(signature);
                            String planId = null;
                            if(null!=ascription){
                                planId = ascription.getString("planId");
                                if(null!=planId&&!planId.trim().equals("")){
                                    etlInfo.setPlanId(planId);
                                }
                                String planName =  ascription.getString("planName");
                                if(null!=planName&&!planName.trim().equals("")){
                                    etlInfo.setPlanName(planName);
                                }
                                String clipId = ascription.getString("clipId");
                                if(null!=clipId&&!clipId.trim().equals("")){
                                    etlInfo.setClipId(clipId);
                                }
                                String clipName = ascription.getString("clipName");
                                if(null!=clipName&&!clipName.trim().equals("")){
                                    etlInfo.setClipName(clipName);
                                }
                                String shotId = ascription.getString("shotId");
                                if(null!=shotId&&!shotId.trim().equals("")){
                                    etlInfo.setShotId(shotId);
                                }
                                String shotName = ascription.getString("shotName");
                                if(null!=shotName&&!shotName.trim().equals("")){
                                    etlInfo.setShotName(shotName);
                                }
                            }
                            if(null!=planId){
                                String companyName = kuaishouVideoEtlInfoMapper.getCompanyNameByUserId(planId);
                                if (null!=companyName&&!companyName.trim().equals("")){
                                    etlInfo.setCompanyName(companyName);
                                }
                            }
                            //计算投放总天数
                            if(days <= 7){
                                etlInfo.setSingleWeekCost(nowData.getCharge());
                            }
                            if(days <= 14){
                                etlInfo.setTwoWeekCost(nowData.getCharge());
                            }
                            if(days <= 28){
                                etlInfo.setFourWeekCost(nowData.getCharge());
                            }
                            etlInfo.setCreateTime(new Date());
                            etlInfo.setUpdateTime(new Date());
                            kuaishouProjectVideoEtlInfoService.save(etlInfo);
                        }else{
                            //只需要更新汇总数据
                            etlInfo.setTotalCost(nowData.getCharge());
                            etlInfo.setAclick(nowData.getAclick());
                            etlInfo.setBclick(nowData.getBclick());
                            etlInfo.setPhotoClick(nowData.getPhotoClick());
                            etlInfo.setPhotoShow(nowData.getPhotoShow());
                            etlInfo.setUpdateTime(new Date());
                            //计算投放总天数
                            if(days <= 7){
                                etlInfo.setSingleWeekCost(nowData.getCharge());
                            }
                            if(days <= 14){
                                etlInfo.setTwoWeekCost(nowData.getCharge());
                            }
                            if(days <= 28){
                                etlInfo.setFourWeekCost(nowData.getCharge());
                            }
                            kuaishouProjectVideoEtlInfoService.updateById(etlInfo);
                        }
                    }catch (Exception e){

                    }finally {
                        countDownLatch.countDown();
                    }
                });
            });

            try {
                countDownLatch.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            log.info("{}数据获取完成",date);
        }
    }

    @Autowired
    private IMaterialAscriptionService materialAscriptionService;
    @Override
    public KuaishouVideoEtlInfo getBySignature(String signature) {
        QueryWrapper<KuaishouVideoEtlInfo> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("video_code",signature).last("limit 1");
        return this.getOne(queryWrapper);
    }
}
