package com.madeu.batch;

import com.madeu.dao.web.webkakao.WebKakaoSqlMapDAO;
import com.madeu.dao.web.webuser.WebUserSqlMapDAO;
import com.popbill.api.KakaoService;
import com.popbill.api.PopbillException;
import com.popbill.api.kakao.KakaoButton;
import com.popbill.api.kakao.KakaoReceiver;
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.HashMap;
import java.util.List;
import java.util.Map;

@Slf4j
@Component
public class KakaoSendBatch {

    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 WebKakaoSqlMapDAO webKakaoSqlMapDAO;

    @Autowired
    private KakaoService kakaoService;

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

        try {

            // SMS 환경설정 정보 호출

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

            HashMap<String, Object> kakaoParamMap = new HashMap<String, Object>();
            kakaoParamMap.put("state", "R");

            // 템플릿 코드별
            List<Map<String, Object>> kakaoListMap = webKakaoSqlMapDAO.selectListKakaoTemplate(kakaoParamMap);
            int kakaoListMapSize = kakaoListMap.size();

            for(int i=0; i<kakaoListMapSize; i++) {
                String sender		= String.valueOf(kakaoListMap.get(i).get("sender")).replaceAll("-", "");
                String orgSender	= String.valueOf(kakaoListMap.get(i).get("sender"));
                String templateCode = String.valueOf(kakaoListMap.get(i).get("templateCode"));

                HashMap<String, Object> kakaoParamMap2 = new HashMap<String, Object>();
                kakaoParamMap2.put("state", "R");
                kakaoParamMap2.put("sender", orgSender);
                kakaoParamMap2.put("templateCode", templateCode);

                log.debug("state        : " + kakaoParamMap2.get("state"));
                log.debug("sender       : " + kakaoParamMap2.get("sender"));
                log.debug("templateCode : " + kakaoParamMap2.get("templateCode"));

                List<Map<String, Object>> kakaoListMap2 = webKakaoSqlMapDAO.selectListKakaoState(kakaoParamMap2);
                int kakaoListMap2Size = kakaoListMap2.size();
                log.debug("갯수                                          : " + kakaoListMap2Size);

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

                    String muKakaoId = String.valueOf(kakaoListMap2.get(j).get("muKakaoId"));
                    kakaoParamMap.put("muKakaoId", muKakaoId);

                    webKakaoSqlMapDAO.updateKakaoState(kakaoParamMap);
                }

                // G => 카카오톡 전송
                // 카카오톡 설정 정보 호출
                // 카카오톡 수신정보 배열, 최대 1000건
                // 승인된 알림톡 템플릿 코드는 ListATStemplate API, GetATSTemplateMgtURL API, 또는 팝빌사이트에서 확인 가능합니다.


                KakaoReceiver[] receivers = new KakaoReceiver[kakaoListMap2Size];

                for (int j = 0; j < kakaoListMap2Size; j++) {

                    String muKakaoId = String.valueOf(kakaoListMap2.get(j).get("muKakaoId"));
                    String receiver = String.valueOf(kakaoListMap2.get(j).get("receiver")).replaceAll("-", "");
                    String userName = String.valueOf(kakaoListMap2.get(j).get("userName"));
                    String content = String.valueOf(kakaoListMap2.get(j).get("content"));
                    templateCode = String.valueOf(kakaoListMap2.get(j).get("templateCode"));

                    log.debug("===== kakao INPUT START ====");
                    log.debug("muKakaoId   :" + muKakaoId);
                    log.debug("sender      :" + sender);
                    log.debug("receiver    :" + receiver);
                    log.debug("userName    :" + userName);
                    log.debug("content     :" + content);
                    log.debug("templateCode:" + templateCode);
                    log.debug("==== kakao INPUT END   ====");


                    KakaoReceiver msg = new KakaoReceiver();
                    msg.setReceiverNum(receiver);    // 수신번호
                    msg.setReceiverName(userName);   // 수신자명
                    msg.setMessage(content);         // 알림톡 템플릿 내용


                    // 같은 템플릿끼리 receivers에 담겨야함
                    receivers[j] = msg;
                }

                String receiptNum = "미전송";

                if (kakaoListMap2Size > 0) {
                    // 예약전송일시, 형태(yyyyMMddHHmmss)
                    String sndDT = "";

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

                    // 알림톡 버튼정보를 템플릿 신청시 기재한 버튼정보와 동일하게 전송하는 경우 null 처리.
                    KakaoButton[] btns = null;

                    // 대체문자 전송유형, 공백-미전송, C-알림톡 내용전송, A-대체문자 내용 전송
                    String altSendType = "";

                    String content = String.valueOf(kakaoListMap2.get(0).get("content"));

                    try {
                        receiptNum = kakaoService.sendATS(corpNum, templateCode, sender, altSendType, receivers, sndDT,
                                userId, requestNum, btns);

                    } catch (PopbillException e) {
                        log.debug("오류 코드   :" + e.getCode());
                        log.debug("오류 메시지 :" + e.getMessage());
                    }
                }
                // G => Y 전송
                for (int j = 0; j < kakaoListMap2Size; j++) {
                    kakaoParamMap = new HashMap<String, Object>();
                    kakaoParamMap.put("oldState", "G");
                    kakaoParamMap.put("chgState", "Y");
                    kakaoParamMap.put("sendDateYn", "Y");
                    kakaoParamMap.put("receiptNum", receiptNum);
                    kakaoParamMap.put("modId", "BatchSystem");

                    String muKakaoId = String.valueOf(kakaoListMap2.get(j).get("muKakaoId"));
                    kakaoParamMap.put("muKakaoId", muKakaoId);

                    webKakaoSqlMapDAO.updateKakaoState(kakaoParamMap);
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
            log.error("Exception KakaoSendBatch - run", e);
        }

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