package pwc.taxtech.atms.service.impl;

import org.nutz.lang.Strings;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import pwc.taxtech.atms.common.CommonConstants;
import pwc.taxtech.atms.dao.MailQueueMapper;
import pwc.taxtech.atms.dpo.EnterpriseAccountSetOrgDto;
import pwc.taxtech.atms.dto.MailMto;
import pwc.taxtech.atms.entity.MailQueue;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@Service
public class CommonServiceImpl {

    private static final Logger logger = LoggerFactory.getLogger(CommonServiceImpl.class);

    @Autowired
    private MailQueueMapper mailQueueMapper;

    public void sendMail(MailMto mailmto) {
        logger.debug("enter sendMail");
        mailmto.setFrom(CommonConstants.MailFrom);
        doSendMail(mailmto);
    }

    private void doSendMail(MailMto mailmto) {
        logger.debug("doSendMail start");
        // @See below C# codes
        // string sql = @"INSERT INTO [MailMaster].[dbo].[MAILQUEUE]
        // ([APPCODE],[ORGANISATION],[SUBJECT],[SUBMITBY],[SUBMITDATE],[POSTEDFLAG],[SENDDATE],[IMMEDIATEFLAG],[MTO],[MFROM],[CC],[BCC],[CONTENT],[ENCODE],[REPLYTO])"
        // + "VALUES
        // ('Apex','PricewaterhouseCoopers',@Subject,'System',@Date,'N',@Date,'Y',@To,@From,@CC,@BCC,@Content,'UTF-8','')";
        // SqlParameter[] param =
        // {
        // new SqlParameter("Subject", mail.Subject),
        // new SqlParameter("Date", DateTime.Now),
        // new SqlParameter("To", mail.To),
        // new SqlParameter("From", mail.From),
        // new SqlParameter("CC", mail.CC ?? String.Empty),
        // new SqlParameter("BCC", mail.BCC ?? String.Empty),
        // new SqlParameter("Content", mail.Content)
        // };

        MailQueue record = new MailQueue();
        record.setAppcode("Apex");
        record.setOrganisation("PricewaterhouseCoopers");
        record.setSubject(mailmto.getSubject());
        record.setSubmitby("System");
        record.setSubmitdate(new Date());
        record.setPostedflag("N");
        record.setSenddate(new Date());
        record.setImmediateflag("Y");
        record.setMto(mailmto.getTo());
        record.setMfrom(mailmto.getFrom());
        record.setCc(Strings.sBlank(mailmto.getCc()));
        record.setBcc(Strings.sBlank(mailmto.getBcc()));
        record.setContent(mailmto.getContent());
        record.setEncode("UTF-8");
        record.setReplyto("");
        mailQueueMapper.insert(record);
        logger.debug("doSendMail end");

    }

    public boolean isOrganizationDateTimeOverlap(List<EnterpriseAccountSetOrgDto> list) {
        for (int i = list.size() - 1; i >= 0; i--) {
            list.get(i).setOverlapList(new ArrayList<>());
            for (int j = i - 1; j >= 0; j--) {
                if (isDateTimeOverlap(list.get(i).getEffectiveDate(), list.get(i).getExpiredDate(),
                        list.get(j).getEffectiveDate(), list.get(j).getExpiredDate())) {
                    list.get(i).getOverlapList().add(list.get(j));
                }
            }
        }
        return (list.stream().anyMatch(s -> s.getOverlapList() != null && !s.getOverlapList().isEmpty()));
    }

    private boolean isDateTimeOverlap(Date start1, Date end1, Date compareStart1, Date compareEnd1) {
        // 判断时间范围是否重叠
        long start = start1.getTime();
        long end = end1.getTime();
        long compareStart = compareStart1.getTime();
        long compareEnd = compareEnd1.getTime();

        return (start <= compareEnd && end >= compareStart);
    }

}