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

import cn.com.ctop.common.module.entity.MailLog;
import cn.com.ctop.common.module.entity.Project;
import cn.com.ctop.common.module.entity.UserAllocation;
import cn.com.ctop.common.module.mapper.MailLogMapper;
import cn.com.ctop.common.module.mapper.UserAllocationMapper;
import cn.com.ctop.common.module.service.IProjectService;
import cn.com.ctop.common.module.utils.Check;
import cn.com.ctop.common.module.utils.CorpWexinUtils;
import cn.com.ctop.common.module.utils.SendMailUtil;
import cn.com.ctop.kuaishou.modules.batch.service.IAccountWarningService;
import cn.com.ctop.kuaishou.modules.report.mapper.KuaishouReportHourlyAccountMapper;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.List;

@Service
@Slf4j
public class AccountWarningServiceImpl implements IAccountWarningService {
    @Autowired
    private KuaishouReportHourlyAccountMapper hourlyAccountMapper;
    @Autowired
    private UserAllocationMapper userAllocationMapper;
    @Autowired
    private MailLogMapper mailLogMapper;
    @Autowired
    private IProjectService projectService;
    @Autowired
    private CorpWexinUtils corpWexinUtils;


    /**
     * 快手账户 出价预警
     *
     * @param accountId
     */
    @Override
    public void kuaiShouAccountWarning(Long accountId, String statDate, String anotherDay) {
        try {

            Integer maxHour = hourlyAccountMapper.selectMaxHour(accountId, statDate);
            if (Check.isNull(maxHour)) {
                return;
            }
            QueryWrapper<UserAllocation> userAllocationQueryWrapper = new QueryWrapper<>();
            userAllocationQueryWrapper.eq("account_id", accountId);
            userAllocationQueryWrapper.eq("media_id", 2);
            userAllocationQueryWrapper.orderByDesc("create_time");
            userAllocationQueryWrapper.last("limit 1");
            UserAllocation userAllocation = userAllocationMapper.selectOne(userAllocationQueryWrapper);
            if (Check.isNull(userAllocation)) {
                return;
            }
            if (userAllocation.getAccountStatus() == 1) {
                return;
            }
            Project project = projectService.getById(userAllocation.getProjectId());
            BigDecimal warningAmount = userAllocation.getWarningAmount();
            BigDecimal warningProportion = userAllocation.getWarningProportion();
            BigDecimal nowCost = hourlyAccountMapper.getCost(accountId, maxHour, statDate);
            if (maxHour != 0) {
                if (!Check.isNull(nowCost) && nowCost.compareTo(new BigDecimal(0)) != 0) {
                    BigDecimal lastHourCost = hourlyAccountMapper.getCost(accountId, maxHour - 1, statDate);
                    if (!Check.isNull(lastHourCost) && lastHourCost.compareTo(new BigDecimal(0)) != 0) {
                        BigDecimal subtract = nowCost.subtract(lastHourCost);
                        BigDecimal divide = nowCost.divide(lastHourCost, 2, RoundingMode.HALF_UP);
                        if (subtract.compareTo(warningAmount) > -1 && divide.compareTo(warningProportion) > -1) {
                            sendMessage(accountId, userAllocation.getAuthName(), maxHour, nowCost, userAllocation.getProjectId(), project.getProjectName());
                        }
                    }
                }
            }

            if (!Check.isNull(nowCost) && nowCost.compareTo(new BigDecimal(0)) != 0) {
                BigDecimal yesterdayHourCost = hourlyAccountMapper.getCost(accountId, maxHour, anotherDay);
                if (!Check.isNull(yesterdayHourCost) && yesterdayHourCost.compareTo(new BigDecimal(0)) != 0) {
                    BigDecimal subtract = nowCost.subtract(yesterdayHourCost);
                    BigDecimal divide = nowCost.divide(yesterdayHourCost, 2, RoundingMode.HALF_UP);
                    if (subtract.compareTo(warningAmount) > -1 && divide.compareTo(warningProportion) > -1) {
                        sendYesterdayMessage(accountId, userAllocation.getAuthName(), maxHour, nowCost, userAllocation.getProjectId(), project.getProjectName());
                    }
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    private void sendYesterdayMessage(Long accountId, String authName, Integer maxHour, BigDecimal nowCost, Long projectId, String projectName) {

        StringBuilder text = new StringBuilder();
        text.append("较昨日同时段消耗预警").append("<br/>")
                .append("您的项目：" + projectName + "下的，").append("<br/>")
                .append("账号：").append(accountId + "，").append("授权名称为：" + authName).append("<br/>")
                .append("相较于昨日 " + maxHour + "时").append("<br/>")
                .append("出现消耗暴涨，").append("消耗金额为：" + nowCost).append("<br/>")
                .append("请您及时查看！");


        QueryWrapper<MailLog> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("account_id", accountId);
        queryWrapper.eq("hour", maxHour);
        queryWrapper.eq("mail_type", 3);
        queryWrapper.orderByDesc("create_time");
        queryWrapper.last("limit 1");
        MailLog checkMailLog = mailLogMapper.selectOne(queryWrapper);
        if (Check.isNull(checkMailLog)) {
            List<String> mailList = mailLogMapper.selectMailList(projectId);
            String subject = "快手-较昨日同时段账户消耗预警";
            try {
                SendMailUtil.sendMail(mailList, subject, text.toString());
                MailLog mailLog = new MailLog();
                mailLog.setAccountId(accountId);
                mailLog.setMailType(3);
                mailLog.setHour(maxHour);
                mailLog.setContent(text.toString());
                mailLog.setSendEmil(JSON.toJSONString(mailList));
                mailLog.setSubject(subject);
                mailLogMapper.insert(mailLog);
            } catch (Exception e) {
                e.printStackTrace();
            }
            List<JSONObject> wexinIds = mailLogMapper.selectWeiXinIdList(projectId);
            corpWexinUtils.sendMessage(wexinIds, text.toString());
        }
    }


    private void sendMessage(Long accountId, String authName, Integer hour, BigDecimal amount, Long projectId, String projectName) {

        StringBuilder text = new StringBuilder();
        text.append("较上时段消耗预警").append("<br/>")
                .append("您的项目：" + projectName + " 下的").append("<br/>")
                .append("账号：").append(accountId + "，").append("授权名称为：" + authName).append("<br/>")
                .append(hour + " 时").append("相较于 " + (hour - 1) + " 时").append("<br/>")
                .append("出现消耗暴涨，").append("消耗金额为：" + amount).append("<br/>")
                .append("请您及时查看！");

        QueryWrapper<MailLog> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("account_id", accountId);
        queryWrapper.eq("hour", hour);
        queryWrapper.eq("mail_type", 2);
        queryWrapper.orderByDesc("create_time");
        queryWrapper.last("limit 1");
        MailLog checkMailLog = mailLogMapper.selectOne(queryWrapper);
        if (Check.isNull(checkMailLog)) {
            List<String> mailList = mailLogMapper.selectMailList(projectId);
            String subject = "快手-账户消耗预警";
            try {
                SendMailUtil.sendMail(mailList, subject, text.toString());
                MailLog mailLog = new MailLog();
                mailLog.setAccountId(accountId);
                mailLog.setMailType(2);
                mailLog.setHour(hour);
                mailLog.setContent(text.toString());
                mailLog.setSendEmil(JSON.toJSONString(mailList));
                mailLog.setSubject(subject);
                mailLogMapper.insert(mailLog);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        List<JSONObject> wexinIds = mailLogMapper.selectWeiXinIdList(projectId);
        corpWexinUtils.sendMessage(wexinIds, text.toString());

    }


}
