//package cokr.xit.biz.iup.service;
//
//import cokr.xit.biz.iup._legacy.DoznVO;
//import com.fasterxml.jackson.databind.ObjectMapper;
//import com.google.gson.FieldNamingPolicy;
//import com.google.gson.Gson;
//import com.google.gson.GsonBuilder;
//import egovframework.com.cmm.util.StringUtil;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//
//import java.io.*;
//import java.net.HttpURLConnection;
//import java.net.URL;
//import java.net.URLEncoder;
//import java.util.ArrayList;
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//
//public class DoznSender
//{
//    private final Logger logger = LoggerFactory.getLogger(super.getClass());
//
//    public static int CALL_FAIL_REPEAT_COUNT = 1;
//
//    public static String PROXY_USE_YN = null;
//    public static String PROXY_IP = null;
//    public static int PROXY_PORT = 0;
//
//    public static int CALL_CONNECTION_TIMEOUT = 8000;
//
//    private ObjectMapper objectMapper = null;
//
//    private String API_HOST = null;
//    private String BILLER_CODE = null;
//    private String AUTHORIZATION = null;
//
//    public DoznSender() {
//        getObjectMapper();
//        this.logger.debug("DoznSender init");
//    }
//
//    public DoznSender(String api_host, String biller_code, String authorization)
//    {
//        getObjectMapper();
//        this.API_HOST = api_host;
//        this.BILLER_CODE = biller_code;
//        this.AUTHORIZATION = authorization;
//
//        this.logger.debug("DoznSender init");
//    }
//
//    public ObjectMapper getObjectMapper()
//    {
//        if (this.objectMapper == null) {
//            this.objectMapper = new ObjectMapper();
//        }
//        return this.objectMapper;
//    }
//
//    public String makeQuerystring(Map<String, Object> params)
//            throws IOException
//    {
//        if (params == null) return null;
//        if (params.size() == 0) return null;
//        StringBuffer sb = new StringBuffer();
//        for (String key : params.keySet()) {
//            if (sb.length() > 0) sb.append("&");
//            sb.append(key + "=" + encodeString(params.get(key)));
//        }
//        return sb.toString();
//    }
//
//    public String encodeString(Object value) throws IOException {
//        return URLEncoder.encode(String.valueOf(value), "UTF-8");
//    }
//
//    private Map<String, Object> parseRespData(String plaindata)
//            throws IOException
//    {
//        return ((Map)getObjectMapper().readValue(plaindata, Map.class));
//    }
//
//    private void setResponse(Response resp) throws IOException {
//        if (resp == null) return;
//        if ((resp.status != -1) && (resp.plaindata != null)) {
//            Map respMap = parseRespData(resp.plaindata);
//            if (respMap.get("res_code") != null) {
//                resp.res_code = ((String)respMap.get("res_code"));
//            }
//            if (respMap.get("message") != null) {
//                resp.message = ((String)respMap.get("message"));
//            }
//            if (respMap.get("data") != null) {
//                resp.data = respMap.get("data");
//            }
//            if (respMap.size() > 0)
//                resp.plaindata = null;
//        }
//    }
//
//    private HttpURLConnection getConnection(String address)
//            throws IOException
//    {
//        URL url = new URL(address);
//        return ((HttpURLConnection)url.openConnection());
//    }
//
//    public Response callGenerateUrl(Map<String, Object> params)
//    {
//        String uri = "/external/inquiry-payment/one-time/url/" + this.BILLER_CODE;
//        try
//        {
//            HashMap someParam = new HashMap();
//            someParam.put("some_param", params.get("org_cd"));
//
//            HashMap parameters = new HashMap();
//            parameters.put("biller_user_key", params.get("data_id"));
//            parameters.put("expire_at", params.get("pay_expires_dt"));
//            parameters.put("parameters", someParam);
//
//            HashMap sendParams = new HashMap();
//            sendParams.put("data", parameters);
//
//            String querystring = this.objectMapper.writeValueAsString(sendParams);
//
//            Response resp = sendData(uri, "POST", "application/json; charset=utf-8", querystring, "N");
//            setResponse(resp);
//
//            return resp;
//        } catch (IOException e) {
//            this.logger.error("callGenerateUrl {}", e);
//        }
//        return null;
//    }
//
//    public Response callReGenerateUrl(Map<String, Object> params)
//    {
//        String uri = "/external/inquiry-payment/one-time/url/re/" + this.BILLER_CODE;
//        try
//        {
//            HashMap someParam = new HashMap();
//            someParam.put("some_param", params.get("org_cd"));
//
//            HashMap parameters = new HashMap();
//            parameters.put("biller_user_key", params.get("data_id"));
//            parameters.put("expire_at", params.get("pay_expires_dt"));
//            parameters.put("parameters", someParam);
//
//            HashMap sendParams = new HashMap();
//            sendParams.put("data", parameters);
//
//            String querystring = this.objectMapper.writeValueAsString(sendParams);
//
//            Response resp = sendData(uri, "POST", "application/json; charset=utf-8", querystring, "N");
//            setResponse(resp);
//
//            return resp;
//        } catch (IOException e) {
//            this.logger.error("callReGenerateUrl {}", e);
//        }
//        return null;
//    }
//
//    public Response sendData(String uri, String method, String contentType, String querystring, String fullUrlYn)
//    {
//        int respCode;
//        HttpURLConnection conn = null;
//        OutputStreamWriter out = null;
//
//        InputStream is = null;
//        BufferedReader br = null;
//
//        Response resp = new Response(this);
//        try
//        {
//            String address = "";
//
//            if ("N".equals(fullUrlYn)) {
//                if ((this.API_HOST == null) || (this.API_HOST.length() < 5)) {
//                    throw new IOException("API_URL is null!");
//                }
//                if ((uri == null) || (uri.isEmpty())) {
//                    throw new IOException("URI is null!");
//                }
//
//                address = this.API_HOST + uri;
//            }
//            else {
//                if ((uri == null) || (uri.isEmpty())) {
//                    throw new IOException("URI is null!");
//                }
//
//                address = uri;
//            }
//
//            this.logger.debug("DoznSender uri: " + address);
//
//            if ((contentType == null) || (contentType.length() == 0)) {
//                contentType = "application/json; charset=utf-8";
//            }
//
//            conn = getConnection(address);
//
//            conn.setDefaultUseCaches(false);
//            conn.setDoInput(true);
//            conn.setDoOutput(true);
//            conn.setRequestMethod(method);
//            conn.setRequestProperty("Content-Type", contentType);
//
//            if (this.AUTHORIZATION != null) {
//                conn.setRequestProperty("Authorization", this.AUTHORIZATION);
//            }
//
//            conn.setConnectTimeout(CALL_CONNECTION_TIMEOUT);
//            conn.setReadTimeout(CALL_CONNECTION_TIMEOUT);
//            conn.connect();
//
//            if ((querystring != null) && (querystring.length() > 0)) {
//                this.logger.debug("DoznSender querystring[" + querystring + "]");
//                out = new OutputStreamWriter(conn.getOutputStream(), "UTF-8");
//                out.write(querystring);
//                out.flush();
//            }
//
//            respCode = conn.getResponseCode();
//            System.out.println("respCode:" + respCode);
//
//            if (respCode >= 400)
//            {
//                is = conn.getErrorStream();
//            }
//            else is = conn.getInputStream();
//
//            br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
//
//            String line = null;
//            StringBuffer bf = new StringBuffer();
//            while ((line = br.readLine()) != null) {
//                bf.append(line.trim());
//            }
//            if (respCode != 200) {
//                this.logger.warn("DoznSender HTTP status: " + respCode);
//            }
//            this.logger.debug("DoznSender RESPONSE: " + bf.toString());
//
//            resp.status = respCode;
//            resp.plaindata = bf.toString();
//            return resp;
//        }
//        catch (IOException e) {
//            this.logger.error("DoznSender sendData {}", e.toString());
//            if ((querystring != null) && (querystring.length() > 0) &&
//                    (!(uri.endsWith("S510")))) {
//                this.logger.warn(">>> DoznSender querystring: " + querystring);
//            }
//
//            resp.status = -1;
//            resp.message = e.getLocalizedMessage();
//            return resp;
//        }
//        finally {
//            if (conn != null) { conn.disconnect(); conn = null; }
//            if (out != null) { try { out.close(); } catch (IOException e) { this.logger.error("sendData finally {}", e); } out = null; }
//            if (br != null) { try { br.close(); } catch (IOException e) { this.logger.error("sendData finally {}", e); } br = null; }
//            if (is != null) { try { is.close(); } catch (IOException e) { this.logger.error("sendData finally {}", e); } is = null;
//            }
//        }
//    }
//
//    public String simpleResponse(DoznVO doznVO)
//    {
//        Map respData = new HashMap();
//        DoznVO resultVO = new DoznVO();
//        Response resp = new Response(this);
//
//        if ((StringUtil.evl(doznVO.getApiType(), "").equals("NOTICE")) && (doznVO.getResCode().equals("OK")))
//        {
//            HashMap hashMap = new HashMap();
//            hashMap.put("biller_user_key", doznVO.getBillerUserKey());
//            hashMap.put("title", doznVO.getTitle());
//            hashMap.put("amount", doznVO.getAmount());
//
//            hashMap.put("expire_type", doznVO.getExpireType());
//            hashMap.put("pay_expire_date", doznVO.getPayExpireDate());
//
//            HashMap detail = new HashMap();
//            List elements = new ArrayList();
//            List details = new ArrayList();
//            detail.put("item_type", "TEXT");
//
//            elements.add("상세 통행료 : " + doznVO.getDetailPasngChrgeSm());
//            elements.add("상세 부가통행료 : " + doznVO.getDetailAdiPasngChrgeSm());
//            detail.put("elements", elements);
//
//            details.add(detail);
//            hashMap.put("details", details);
//            respData.put("result", hashMap);
//        }
//        else {
//            respData = null;
//        }
//
//        this.logger.debug("getResCode:" + doznVO.getResCode());
//        this.logger.debug("getMessage:" + doznVO.getMessage());
//
//        resp.res_code = doznVO.getResCode();
//        resp.message = doznVO.getMessage();
//        resp.data = respData;
//
//        String result = new Gson().toJson(resp).replace("\"status\":0,", "");
//
//        this.logger.debug("return :" + result);
//        return result;
//    }
//
//    public DoznVO getData(String data)
//    {
//        Gson gson = new GsonBuilder()
//                .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
//                .create();
//
//        String result = data.replace(" ", "").replace("\n", "").replace("\r", "").replace("\"data\":", "");
//
//        return ((DoznVO)gson.fromJson(result.substring(1, result.length() - 1), DoznVO.class));
//    }
//
//    public DoznVO callBillsInfoUrl(String request, String uri) throws Exception
//    {
//        try {
//            Response resp = sendData(uri, "POST", "application/json; charset=utf-8", request, "Y");
//            setResponse(resp);
//
//            DoznVO result = new DoznVO();
//
//            this.logger.debug("res_code:" + resp.res_code);
//            this.logger.debug("message:" + resp.message);
//
//            result.setResCode(resp.res_code);
//            result.setMessage(resp.message);
//
//            if ((!(result.getResCode().equals("OK"))) || (!(result.getMessage().equals("성공")))) {
//                result.setErrMsg(result.getMessage());
//            }
//
//            return result;
//        } catch (IOException e) {
//            this.logger.error("callBillsInfoUrl {}", e);
//        }
//
//        return null;
//    }
//}