package com.madeu.batch;

import com.madeu.dao.web.websms.WebSmsSqlMapDAO;
import com.madeu.dao.web.webuser.WebUserSqlMapDAO;
import com.popbill.api.MessageService;
import com.popbill.api.PopbillException;
import com.popbill.api.message.Message;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Slf4j
@Component
public class LmsSendBatch {

    private static String corpNum; // 팝빌회원 사업자번호
    private static String userId; // 팝빌회원 아이디
    private static String senderName; // 발신자명

    @Value("${popbill.corp-num}")
    public void setCorpNum(String value){
        corpNum = value;
    }

    @Value("${popbill.user-id}")
    public void setUserId(String value){
        userId = value;
    }

    @Value("${popbill.sender-nm}")
    public void setSenderName(String value){
        senderName = value;
    }

    @Autowired
    private WebSmsSqlMapDAO webSmsSqlMapDAO;

    @Autowired
    private MessageService messageService;

    //https://blog.naver.com/lovemema/140200056062
//    @Scheduled(cron = "0 0/5 * * * *") // 5분마다 실행
//    @Scheduled(fixedDelay = 300000) // 5분마다
    public void go() {
        log.debug("******************LmsSendBatch START **********************************");

        try {

            // SMS 환경설정 정보 호출

            log.debug("corpNum      :" + corpNum);
            log.debug("userId       :" + userId);
            log.debug("senderName   :" + senderName);


            HashMap<String, Object> smsParamMap = new HashMap<String, Object>();
            smsParamMap.put("state", "R");
            smsParamMap.put("type", "L");
            List<Map<String, Object>> smsListMap = webSmsSqlMapDAO.selectListSmsTime(smsParamMap);
            int smsListMapSize = smsListMap.size();

            for (int i = 0; i < smsListMapSize; i++) {

                String sender      = String.valueOf(smsListMap.get(i).get("sender")).replaceAll("-", "");
                String orgSender   = String.valueOf(smsListMap.get(i).get("sender"));
                String title       = String.valueOf(smsListMap.get(i).get("title"));
                String content     = String.valueOf(smsListMap.get(i).get("content"));

                HashMap<String, Object> smsParamMap2 = new HashMap<String, Object>();
                smsParamMap2.put("state", "R");
                smsParamMap2.put("type", "L");
                smsParamMap2.put("sender", orgSender);
                smsParamMap2.put("title", title);
                smsParamMap2.put("content", content);
                
                List<Map<String, Object>> smsListMap2 = webSmsSqlMapDAO.selectListSmsState(smsParamMap2);
                int smsListMap2Size = smsListMap2.size();
                log.debug("갯수                                          : " + smsListMap2Size);

                // R => G
                for (int j = 0; j < smsListMap2Size; j++) {
                    smsParamMap2 = new HashMap<String, Object>();
                    smsParamMap2.put("oldState", "R");
                    smsParamMap2.put("chgState", "G");
                    smsParamMap2.put("sendDateYn", "N");
                    smsParamMap2.put("type", "L");
                    smsParamMap2.put("modId", "BatchSystem");

                    String muSmsId = String.valueOf(smsListMap2.get(j).get("muSmsId"));
                    smsParamMap2.put("muSmsId", muSmsId);

                    webSmsSqlMapDAO.updateSmsState(smsParamMap2);
                }

                // G => SMS 전송
                Message[] messages = new Message[smsListMap2Size];
                for (int j = 0; j < smsListMap2Size; j++) {
                    // 전송요청번호
                    // 파트너가 전송 건에 대해 관리번호를 구성하여 관리하는 경우 사용.
                    // 1~36자리로 구성. 영문, 숫자, 하이픈(-), 언더바(_)를 조합하여 팝빌 회원별로 중복되지 않도록 할당.
                    String muSmsId     = String.valueOf(smsListMap2.get(j).get("muSmsId"));
                    String receiver    = String.valueOf(smsListMap2.get(j).get("receiver")).replaceAll("-", "");
                    String userName    = String.valueOf(smsListMap2.get(j).get("userName"));
                    String type        = String.valueOf(smsListMap2.get(j).get("type"));

                    log.debug("===== LMS INPUT START ====");
                    log.debug("type        :" + type);
                    log.debug("muSmsId     :" + muSmsId);
                    log.debug("sender      :" + sender);
                    log.debug("receiver    :" + receiver);
                    log.debug("userName    :" + userName);
                    log.debug("content     :" + content);
                    log.debug("===== LMS INPUT END   ====");

                    Message msg = new Message();
                    msg.setSender(sender);                //발신번호
                    msg.setSenderName(senderName);        //발신자명
                    msg.setReceiver(receiver);            //수신번호
                    msg.setReceiverName(userName);        //수신자명
                    msg.setSubject(title);                //문자제목
                    msg.setContent(content);              //메시지내용

                    messages[j] = msg;
                }
                String receiptNum = "미전송";

                if (smsListMap2Size > 0) {
                    // 예약전송일시, null 처리시 즉시전송
                    Date reserveDT = null;
                    // 광고문자 전송여부
                    Boolean adsYN = false;

                    // 전송요청번호
                    // 파트너가 전송 건에 대해 관리번호를 구성하여 관리하는 경우 사용.
                    // 1~36자리로 구성. 영문, 숫자, 하이픈(-), 언더바(_)를 조합하여 팝빌 회원별로 중복되지 않도록 할당.
                    String requestNum = "";

                    try {
                        receiptNum = messageService.sendLMS(corpNum, sender, title, content, messages, reserveDT, adsYN, userId, requestNum);
                    } catch (PopbillException e) {
                        log.debug("오류 코드   :" + e.getCode());
                        log.debug("오류 메시지 :" + e.getMessage());
                    }
                }

                // G => Y 전송
                for (int j = 0; j < smsListMap2Size; j++) {
                    smsParamMap2 = new HashMap<String, Object>();
                    smsParamMap2.put("oldState", "G");
                    smsParamMap2.put("chgState", "Y");
                    smsParamMap2.put("sendDateYn", "Y");
                    smsParamMap2.put("type", "L");
                    smsParamMap2.put("receiptNum", receiptNum);
                    smsParamMap2.put("modId", "BatchSystem");

                    String muSmsId = String.valueOf(smsListMap2.get(j).get("muSmsId"));
                    smsParamMap2.put("muSmsId", muSmsId);

                    webSmsSqlMapDAO.updateSmsState(smsParamMap2);
                }
            }

        } catch (Exception e) {
            log.debug("Exception LmsSendBatch - run" + e.getMessage());
        }

        log.debug("******************LmsSendBatch END **********************************");
    }
}