package com.its.wthr.openApi.arpltnInforInqireService;

import lombok.extern.slf4j.Slf4j;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

@Slf4j
public class ArpltnInforInqire {

    public String lookUpApi(StringBuilder urlBuilder) {
        String result = "";
        HttpURLConnection conn = null;
        try {
            URL url = new URL(urlBuilder.toString());
            conn = (HttpURLConnection) url.openConnection();
            conn.setConnectTimeout(20000);
            conn.setReadTimeout(20000);
            conn.setRequestMethod("GET");
            conn.setRequestProperty("Content-type", "application/json");

            log.info("ArpltnInforInqire.lookUpApi: Response code, {}.", conn.getResponseCode());

            BufferedReader rd;
            if (conn.getResponseCode() >= 200 && conn.getResponseCode() <= 300) {
                rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            } else {
                rd = new BufferedReader(new InputStreamReader(conn.getErrorStream()));
            }

            StringBuilder sb = new StringBuilder();
            String line;
            while ((line = rd.readLine()) != null) {
                sb.append(line);
            }
            rd.close();
            conn.disconnect();
            result = sb.toString();
        } catch (MalformedURLException e) {
            log.error("ArpltnInforInqire.lookUpApi: MalformedURLException Error: {}", e.getMessage());
        } catch (IOException e) {
            log.error("ArpltnInforInqire.lookUpApi: IOException Error: {}", e.getMessage());
        }
        catch (Exception e) {
            log.error("ArpltnInforInqire.lookUpApi: Exception Error: {}", e.getMessage());
        }
        finally {
            if (conn != null) {
                conn.disconnect();
            }
        }
        return result;
    }

    /**
     * 항목별 Grade 값 의미
     * 적용 항목명 : khaiGrade, so2Grade, coGrade, o3Grade, no2Grade, pm10Grade, pm25Grade, pm25Grade1h, pm25Grade1h
     * @param grade
     * @return
     */
    public String getGradeDesc(String grade) {
        if (grade == null) {
            return "-";
        }
        String value = grade.trim();
        if ("1".equals(value)) {
            return "좋음";
        }
        if ("2".equals(value)) {
            return "보통";
        }
        if ("3".equals(value)) {
            return "나쁨";
        }
        if ("4".equals(value)) {
            return "매우나쁨";
        }
        return "-";
    }
    /**
     * 요청의 응답코드에 대한 오류메시지를 구한다.
     * @param errorCode
     * @return
     */
    public String getErrorMessage(String errorCode) {
        String errorMessage = errorCode + ": 알수없는 오류코드";
        int error = -99;
        try {
            error = Integer.parseInt(errorCode);
        } catch (NumberFormatException e) {
            return errorMessage;
        }
        switch(error) {
            case  0: errorMessage = error + ": NORMAL_SERVICE, 정상"; break;
            case  1: errorMessage = error + ": APPLICATION_ERROR, 어플리케이션 에러"; break;
            case  2: errorMessage = error + ": DB_ERROR, 데이터베이스 에러"; break;
            case  3: errorMessage = error + ": NODATA_ERROR, 데이터없음 에러"; break;
            case  4: errorMessage = error + ": HTTP_ERROR, HTTP 에러"; break;
            case  5: errorMessage = error + ": SERVICETIME_OUT, 서비스 연결실패 에러"; break;
            case 10: errorMessage = error + ": INVALID_REQUEST_PARAMETER_ERROR, 잘못된 요청 파라메터 에러"; break;
            case 11: errorMessage = error + ": NO_MANDATORY_REQUEST_PARAMETERS_ERROR, 필수요청 파라메터가 없음"; break;
            case 12: errorMessage = error + ": NO_OPENAPI_SERVICE_ERROR, 해당 오픈 API 서비스가 없거나 폐기됨"; break;
            case 20: errorMessage = error + ": SERVICE_ACCESS_DENIED_ERROR, 서비스 접근거부"; break;
            case 22: errorMessage = error + ": LIMITED_NUMBER_OF_SERVICE_REQUESTS_EXCEEDS_ERROR, 서비스 요청제한횟수 초과에러"; break;
            case 30: errorMessage = error + ": SERVICE_KEY_IS_NOT_REGISTERED_ERROR, 등록되지 않은 서비스키"; break;
            case 31: errorMessage = error + ": DEADLINE_HAS_EXPIRED_ERROR, 기한만료된 서비스키"; break;
            case 32: errorMessage = error + ": UNREGISTERED_IP_ERROR, 등록되지 않은 IP"; break;
            case 34: errorMessage = error + ": UNREGISTERED_REPORT, 보고서가 등록 되지 않음"; break;
            default: errorMessage = error + ": 알수없는 오류코드"; break;
        }
        return errorMessage;
    }

}
