package com.yc.ship.module.trade.service.smsSendconfig;

import cn.hutool.core.date.DateUtil;
import com.yc.ship.module.system.api.notify.NotifyMessageSendApi;
import com.yc.ship.module.system.api.notify.dto.NotifySendSingleToUserReqDTO;
import com.yc.ship.module.trade.controller.admin.smsSendconfig.vo.SmsSendconfigQueryRespVO;
import com.yc.ship.module.trade.dal.mysql.smsSendconfig.MessageSendMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;

import javax.annotation.Resource;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


/**
 * 短信发送配置 Service 实现类
 *
 * @author 管理员
 */
@Service
@Validated
@Slf4j
public class MessageSendServiceImpl implements MessageSendService {


    @Resource
    private NotifyMessageSendApi notifyMessageSendApi;

    @Resource
    private MessageSendMapper messageSendMapper;


    /***
     * 【您的留位订单即将过期】
     * 您的留位订单【{orderNo}】（{routeName}/{boatName}/{startTime}）将在今日24:00自动取消。后期如有新订单，均需录入锁位单，如因此造成相应损失，需自行承担。如需保留，请及时补全游客名单进行锁位。
     * 提示：如在开航前7天内取消，将按退改规则扣损。如有疑问，欢迎致电：6334888。
     */
    @Override
    public void sendMsg1() {
        List<SmsSendconfigQueryRespVO> smsSendconfigQueryRespVOS = messageSendMapper.querySendList1(8);
        smsSendconfigQueryRespVOS.forEach(smsSendconfigQueryRespVO -> {
            try {
                Map map = new HashMap();
                map.put("orderNo", smsSendconfigQueryRespVO.getOrderNo());
                map.put("routeName", smsSendconfigQueryRespVO.getRouteName());
                map.put("boatName", smsSendconfigQueryRespVO.getShipName());
                map.put("startTime", smsSendconfigQueryRespVO.getStartTime());
                NotifySendSingleToUserReqDTO reqDTO = new NotifySendSingleToUserReqDTO();
                reqDTO.setTemplateParams(map);
                reqDTO.setTemplateCode("sendmsg_cd_1");
                reqDTO.setUserId(Long.parseLong(smsSendconfigQueryRespVO.getSellerId()));
                notifyMessageSendApi.sendSingleMessageToAdmin(reqDTO);
            } catch (Exception e) {
                log.error("发送短信异常", e);
            }
        });

    }

    /***
     * 【留位】（开航前22天中午12:00）
     * 您的留位订单【{orderNo}】（{routeName}/{boatName}/{startTime}）即将过期。如需保留，请及时补全游客名单进行锁位。
     */
    @Override
    public void sendMsg2() {
        List<SmsSendconfigQueryRespVO> smsSendconfigQueryRespVOS = messageSendMapper.querySendList1(22);
        smsSendconfigQueryRespVOS.forEach(smsSendconfigQueryRespVO -> {
            try {
                Map map = new HashMap();
                map.put("orderNo", smsSendconfigQueryRespVO.getOrderNo());
                map.put("routeName", smsSendconfigQueryRespVO.getRouteName());
                map.put("boatName", smsSendconfigQueryRespVO.getShipName());
                map.put("startTime", smsSendconfigQueryRespVO.getStartTime());
                NotifySendSingleToUserReqDTO reqDTO = new NotifySendSingleToUserReqDTO();
                reqDTO.setTemplateParams(map);
                reqDTO.setTemplateCode("sendmsg_cd_2");
                reqDTO.setUserId(Long.parseLong(smsSendconfigQueryRespVO.getSellerId()));
                notifyMessageSendApi.sendSingleMessageToAdmin(reqDTO);
            } catch (Exception e) {
                log.error("发送短信异常", e);
            }
        });

    }

    /***
     * 【留位】开航前8天提醒 中午12：00
     * 您的留位订单【{orderNo}】（{routeName}/{boatName}/{startTime}）将在今日24:00自动取消。
     * 后期如有新订单，均需录入锁位单，如因此造成相应损失，需自行承担。如需保留，请及时补全游客名单进
     */
    @Override
    public void sendMsg3() {
        List<SmsSendconfigQueryRespVO> smsSendconfigQueryRespVOS = messageSendMapper.querySendList1(8);
        smsSendconfigQueryRespVOS.forEach(smsSendconfigQueryRespVO -> {
            try {
                Map map = new HashMap();
                map.put("orderNo", smsSendconfigQueryRespVO.getOrderNo());
                map.put("routeName", smsSendconfigQueryRespVO.getRouteName());
                map.put("boatName", smsSendconfigQueryRespVO.getShipName());
                map.put("startTime", smsSendconfigQueryRespVO.getStartTime());
//                Date lastDate = DateUtil.offsetDay(DateUtil.parse(smsSendconfigQueryRespVO.getStartTime()), -4);
//                map.put("lastTime", DateUtil.format(lastDate, "yyyy-MM-dd"));
                NotifySendSingleToUserReqDTO reqDTO = new NotifySendSingleToUserReqDTO();
                reqDTO.setTemplateParams(map);
                reqDTO.setTemplateCode("sendmsg_cd_4");
                reqDTO.setUserId(Long.parseLong(smsSendconfigQueryRespVO.getSellerId()));
                notifyMessageSendApi.sendSingleMessageToAdmin(reqDTO);
            } catch (Exception e) {
                log.error("发送短信异常", e);
            }
        });

    }

    /***
     * 【锁定】开航前2天00:00仍未付款
     * 订单【{orderNo}】（{routeName}/{boatName}/{startTime}）已临近出发。
     * 请在24小时内完成支付，逾期系统将自动取消订单，游轮舱位无法保留。
     * 为避免影响行程，敬请尽快处理。
     * 如有疑问，欢迎致电：6334888。
     */

    @Override
    public void sendMsg4() {
        List<SmsSendconfigQueryRespVO> smsSendconfigQueryRespVOS = messageSendMapper.querySendList2(2);
        smsSendconfigQueryRespVOS.forEach(smsSendconfigQueryRespVO -> {
            try {
                Map map = new HashMap();
                map.put("orderNo", smsSendconfigQueryRespVO.getOrderNo());
                map.put("routeName", smsSendconfigQueryRespVO.getRouteName());
                map.put("boatName", smsSendconfigQueryRespVO.getShipName());
                map.put("startTime", smsSendconfigQueryRespVO.getStartTime());
                NotifySendSingleToUserReqDTO reqDTO = new NotifySendSingleToUserReqDTO();
                reqDTO.setTemplateParams(map);
                reqDTO.setTemplateCode("sendmsg_cd_5");
                reqDTO.setUserId(Long.parseLong(smsSendconfigQueryRespVO.getSellerId()));
                notifyMessageSendApi.sendSingleMessageToAdmin(reqDTO);
            } catch (Exception e) {
                log.error("发送短信异常", e);
            }
        });

    }

    /***
     * 【锁定】开航前8天提醒中午12：00
     * 订单【{orderNo}】（{routeName}/{boatName}/{startTime}）已临近出发，请及时完成以下事项：
     * 1.付款：请尽快付款以锁定游轮舱位；
     * 2.接站信息确认：如已预约接站，请在3日内与游客确认信息准确，如需更改请于{jzTime}中午12点前完成更改。
     * 如因信息缺失、错误或未在规定时间内提交而影响接站安排，将无法正常提供接站服务，敬请留意。如有疑问，欢迎致电：6334888。
     */
    @Override
    public void sendMsg5() {
        List<SmsSendconfigQueryRespVO> smsSendconfigQueryRespVOS = messageSendMapper.querySendList2(8);
        smsSendconfigQueryRespVOS.forEach(smsSendconfigQueryRespVO -> {
            try {
                Map map = new HashMap();
                map.put("orderNo", smsSendconfigQueryRespVO.getOrderNo());
                map.put("routeName", smsSendconfigQueryRespVO.getRouteName());
                map.put("boatName", smsSendconfigQueryRespVO.getShipName());
                map.put("startTime", smsSendconfigQueryRespVO.getStartTime());
                Date lastDate = DateUtil.offsetDay(DateUtil.parse(smsSendconfigQueryRespVO.getStartTime()), -4);
                map.put("jzTime4", DateUtil.format(lastDate, "yyyy-MM-dd"));
                NotifySendSingleToUserReqDTO reqDTO = new NotifySendSingleToUserReqDTO();
                reqDTO.setTemplateParams(map);
                reqDTO.setTemplateCode("sendmsg_cd_6");
                reqDTO.setUserId(Long.parseLong(smsSendconfigQueryRespVO.getSellerId()));
                notifyMessageSendApi.sendSingleMessageToAdmin(reqDTO);
            } catch (Exception e) {
                log.error("发送短信异常", e);
            }
        });

    }

    /***
     * 【锁定】开航前14天中午12：00
     * 订单【{orderNo}】（{routeName}/{boatName}/{startTime}）已临近出发，请及时完成以下事项：
     * 1.付款：请尽快付款以锁定游轮舱位；
     * 2.接站信息确认：如已预约接站，请及时与游客确认信息准确，并于${jzTime7}中午12点前完成登记。如因信息缺失、错误或未在规定时间内提交而影响接站安排，将无法正常提供接站服务，敬请留意。
     * 如有疑问，欢迎致电：6334888。
     */
    @Override
    public void sendMsg6() {
        List<SmsSendconfigQueryRespVO> smsSendconfigQueryRespVOS = messageSendMapper.querySendList2(14);
        smsSendconfigQueryRespVOS.forEach(smsSendconfigQueryRespVO -> {
            try {
                Map map = new HashMap();
                map.put("orderNo", smsSendconfigQueryRespVO.getOrderNo());
                map.put("routeName", smsSendconfigQueryRespVO.getRouteName());
                map.put("boatName", smsSendconfigQueryRespVO.getShipName());
                map.put("startTime", smsSendconfigQueryRespVO.getStartTime());
                Date lastDate = DateUtil.offsetDay(DateUtil.parse(smsSendconfigQueryRespVO.getStartTime()), -7);
                map.put("jzTime7", DateUtil.format(lastDate, "yyyy-MM-dd"));
                NotifySendSingleToUserReqDTO reqDTO = new NotifySendSingleToUserReqDTO();
                reqDTO.setTemplateParams(map);
                reqDTO.setTemplateCode("sendmsg_cd_8");
                reqDTO.setUserId(Long.parseLong(smsSendconfigQueryRespVO.getSellerId()));
                notifyMessageSendApi.sendSingleMessageToAdmin(reqDTO);
            } catch (Exception e) {
                log.error("发送短信异常", e);
            }
        });

    }



    /***
     * 【锁定】开航前22天中午12：00
     * 订单【{orderNo}】（{routeName}/{boatName}/{startTime}）已临近出发，请及时完成以下事项：
     * 1.付款：请尽快付款以锁定游轮舱位；
     * 2.接站信息确认：如已预约接站，请及时与游客确认信息准确，并于${jzTime7}中午12点前完成登记。如因信息缺失、错误或未在规定时间内提交而影响接站安排，将无法正常提供接站服务，敬请留意。
     * 如有疑问，欢迎致电：6334888。
     */
    @Override
    public void sendMsg8() {
        List<SmsSendconfigQueryRespVO> smsSendconfigQueryRespVOS = messageSendMapper.querySendList2(22);
        smsSendconfigQueryRespVOS.forEach(smsSendconfigQueryRespVO -> {
            try {
                Map map = new HashMap();
                map.put("orderNo", smsSendconfigQueryRespVO.getOrderNo());
                map.put("routeName", smsSendconfigQueryRespVO.getRouteName());
                map.put("boatName", smsSendconfigQueryRespVO.getShipName());
                map.put("startTime", smsSendconfigQueryRespVO.getStartTime());
                Date lastDate = DateUtil.offsetDay(DateUtil.parse(smsSendconfigQueryRespVO.getStartTime()), -7);
                map.put("jzTime7", DateUtil.format(lastDate, "yyyy-MM-dd"));
                NotifySendSingleToUserReqDTO reqDTO = new NotifySendSingleToUserReqDTO();
                reqDTO.setTemplateParams(map);
                reqDTO.setTemplateCode("sendmsg_cd_9");
                reqDTO.setUserId(Long.parseLong(smsSendconfigQueryRespVO.getSellerId()));
                notifyMessageSendApi.sendSingleMessageToAdmin(reqDTO);
            } catch (Exception e) {
                log.error("发送短信异常", e);
            }
        });

    }

    /***
     * 【出发】开航前7天中午12点
     * 尊敬的游客，您预订的 {boatName}（{routeName}）将于{startTime}启航。如您已预约免费接站服务，请在3日内向预订旅行社补充或确认接站信息。
     * 如因信息缺失、错误或未在规定时间内提交而影响接站安排，将无法正常提供接站服务，敬请留意。
     * 如需协助，请致电[400-696-0666]。祝您旅途愉快！
     */
    @Override
    public void sendMsg9() {
        List<SmsSendconfigQueryRespVO> smsSendconfigQueryRespVOS = messageSendMapper.querySendList2(7);
        smsSendconfigQueryRespVOS.forEach(smsSendconfigQueryRespVO -> {
            try {
                Map map = new HashMap();
                map.put("routeName", smsSendconfigQueryRespVO.getRouteName());
                map.put("boatName", smsSendconfigQueryRespVO.getShipName());
                map.put("startTime", smsSendconfigQueryRespVO.getStartTime());
                NotifySendSingleToUserReqDTO reqDTO = new NotifySendSingleToUserReqDTO();
                reqDTO.setTemplateParams(map);
                reqDTO.setTemplateCode("sendmsg_cd_10");
                reqDTO.setUserId(Long.parseLong(smsSendconfigQueryRespVO.getSellerId()));
                notifyMessageSendApi.sendSingleMessageToAdmin(reqDTO);
            } catch (Exception e) {
                log.error("发送短信异常", e);
            }
        });

    }

    /***
     * 出团前1天上午8点
     * 尊敬的游客，您预订的 {boatName}（{routeName}）将于明日启航。如您已预约免费接站服务，请再次确认您的接站信息。接站时间为登船日当天[宜昌：08:00-20:00；重庆：09:00-20:00]。工作人员届时将在出站口附近迎接，站点指引等更多信息请参阅长江行游轮小程序，工作人员将提前与您电话联系，请您注意接听。
     * 请您务必携带预订时填写的有效身份证件。如行程临时变更，请及时致电[400-696-0666]。
     * 祝您旅途愉快！
     */
    @Override
    public void sendMsg10() {
        List<SmsSendconfigQueryRespVO> smsSendconfigQueryRespVOS = messageSendMapper.querySendList2(1);
        smsSendconfigQueryRespVOS.forEach(smsSendconfigQueryRespVO -> {
            try {
                Map map = new HashMap();
                map.put("orderNo", smsSendconfigQueryRespVO.getOrderNo());
                map.put("routeName", smsSendconfigQueryRespVO.getRouteName());
                map.put("boatName", smsSendconfigQueryRespVO.getShipName());
                map.put("startTime", smsSendconfigQueryRespVO.getStartTime());
                NotifySendSingleToUserReqDTO reqDTO = new NotifySendSingleToUserReqDTO();
                reqDTO.setTemplateParams(map);
                reqDTO.setTemplateCode("sendmsg_cd_11");
                reqDTO.setUserId(Long.parseLong(smsSendconfigQueryRespVO.getSellerId()));
                notifyMessageSendApi.sendSingleMessageToAdmin(reqDTO);
            } catch (Exception e) {
                log.error("发送短信异常", e);
            }
        });

    }
}