package com.madeu.crm.callLog.service;

import java.util.HashMap;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;

import lombok.extern.slf4j.Slf4j;

/**
 * GoodARS CTI API 연동 서비스
 *
 * 연동 서버: ars.goodars.co.kr
 * 고객사 ID(CPID): application.properties에 설정
 */
@Slf4j
@Service
public class GoodArsService {

    @Value("${goodars.cpid:5000036030017}")
    private String arsCpid;

    @Value("${goodars.base-url:http://ars.goodars.co.kr/LINK/MADEU}")
    private String arsBaseUrl;

    @Value("${goodars.base-url-ssl:https://ars.goodars.co.kr/LINK/MADEU}")
    private String arsBaseUrlSsl;

    private final RestTemplate restTemplate = new RestTemplate();

    /**
     * 아웃바운드 전화 발신
     *
     * @param loginCid 상담원 전화번호 (내선번호)
     * @param sendCid  매장 대표번호
     * @param userCid  고객 전화번호
     * @return 성공 여부 ("SUCCESS" = 성공)
     */
    public HashMap<String, Object> makeOutboundCall(String loginCid, String sendCid, String userCid) {
        log.debug("makeOutboundCall START - loginCid:{}, sendCid:{}, userCid:{}", loginCid, sendCid, userCid);

        HashMap<String, Object> result = new HashMap<>();

        try {
            String url = UriComponentsBuilder.fromHttpUrl(arsBaseUrl + "/wid_outcall.asp")
                    .queryParam("CPID", arsCpid)
                    .queryParam("LOGINCID", loginCid)
                    .queryParam("SENDCID", sendCid)
                    .queryParam("USERCID", userCid.replaceAll("[^0-9]", ""))
                    .toUriString();

            log.debug("makeOutboundCall URL: {}", url);

            String response = restTemplate.getForObject(url, String.class);
            log.debug("makeOutboundCall response: {}", response);

            if ("SUCCESS".equals(response)) {
                result.put("success", true);
                result.put("msgDesc", "전화 발신 중입니다.");
            } else {
                result.put("success", false);
                result.put("msgDesc", "전화 발신에 실패하였습니다. (" + response + ")");
            }
        } catch (Exception e) {
            log.error("makeOutboundCall error", e);
            result.put("success", false);
            result.put("msgDesc", "전화 발신 중 오류가 발생하였습니다.");
        }

        log.debug("makeOutboundCall END");
        return result;
    }

    /**
     * 녹음 파일 URL 생성
     *
     * @param recordNo CTI 레코드 번호
     * @return 녹음 파일 URL
     */
    public String getRecordFileUrl(String recordNo) {
        return UriComponentsBuilder.fromHttpUrl(arsBaseUrl + "/wid_file.asp")
                .queryParam("CPID", arsCpid)
                .queryParam("SN", recordNo)
                .toUriString();
    }

    /**
     * 전화 돌려주기 (Push)
     *
     * @param loginCid 상담원 전화번호
     * @param pushCid  전달받을 상담원 전화번호
     * @return 성공 여부
     */
    public HashMap<String, Object> pushCall(String loginCid, String pushCid) {
        log.debug("pushCall START - loginCid:{}, pushCid:{}", loginCid, pushCid);

        HashMap<String, Object> result = new HashMap<>();

        try {
            String url = UriComponentsBuilder.fromHttpUrl(arsBaseUrlSsl + "/wid_push.asp")
                    .queryParam("CPID", arsCpid)
                    .queryParam("LOGINCID", loginCid)
                    .queryParam("PUSHCID", pushCid)
                    .toUriString();

            log.debug("pushCall URL: {}", url);

            String response = restTemplate.getForObject(url, String.class);
            log.debug("pushCall response: {}", response);

            if ("1".equals(response)) {
                result.put("success", true);
                result.put("msgDesc", "전화가 연결되었습니다.");
            } else {
                result.put("success", false);
                result.put("msgDesc", "연결에 실패하였습니다.");
            }
        } catch (Exception e) {
            log.error("pushCall error", e);
            result.put("success", false);
            result.put("msgDesc", "전화 연결 중 오류가 발생하였습니다.");
        }

        log.debug("pushCall END");
        return result;
    }
}
