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

import cn.com.ctop.common.module.service.IMaterialAscriptionService;
import cn.com.ctop.common.module.utils.Check;
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 com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.util.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.math.BigDecimal;
import java.text.ParseException;
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
 * @version V1.0
 * @date 2020-12-17
 */
@Slf4j
@Service
public class KuaishouVideoEtlInfoServiceImpl extends ServiceImpl<KuaishouVideoEtlInfoMapper, KuaishouVideoEtlInfo> implements IKuaishouVideoEtlInfoService {
    @Autowired
    private IMaterialAscriptionService materialAscriptionService;
    @Resource
    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 clipId = null;
                            if (null != ascription) {
                                String 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);
                                }
                                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 != clipId) {
                                String companyName = kuaishouVideoEtlInfoMapper.getCompanyNameByUserId(clipId);
                                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 {
                            JSONObject ascription = materialAscriptionService.getDetailByCode(signature);
                            String clipId = null;
                            if (null != ascription) {
                                String 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);
                                }
                                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 != clipId) {
                                String companyName = kuaishouVideoEtlInfoMapper.getCompanyNameByUserId(clipId);
                                if (null != companyName && !companyName.trim().equals("")) {
                                    etlInfo.setCompanyName(companyName);
                                }
                            }
                            //只需要更新汇总数据
                            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);
        }
    }

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

    @Override
    public Result<Object> queryPageList(JSONObject request) throws ParseException {
        Integer pageNo = request.getInteger("pageNo");
        Integer pageSize = request.getInteger("pageSize");
        if (Check.isNull(pageNo)) {
            pageNo = 1;
        }
        if (Check.isNull(pageSize)) {
            pageSize = 10;
        }
        Long accountId = request.getLong("accountId");
        if (Check.isNull(accountId)) {
            return Result.error("未选择账户");
        }
        String startTime = request.getString("startTime");
        String endTime = request.getString("endTime");
        if (Check.isNull(startTime) || Check.isNull(endTime)) {
            endTime = DateUtils.getNowDate("yyyy-MM-dd");
            startTime = DateUtils.getLastDay(endTime, 1);
        }
        String sortCode = request.getString("sortCode");
        String sortType = request.getString("sortType");
        if (Check.isNull(sortCode)) {
            sortCode = "charge";
        }
        if (Check.isNull(sortType)) {
            sortType = "DESC";
        }
        Long total = kuaishouVideoEtlInfoMapper.getTotal(accountId,startTime,endTime);
        PageHelper.startPage(pageNo, pageSize, false);
        PageInfo pageInfo = new PageInfo(kuaishouVideoEtlInfoMapper.queryPageList(accountId, sortCode, sortType,startTime,endTime));
        pageInfo.setTotal(total);
        return Result.ok(pageInfo);
    }
}
