package com.example.smart119

import android.os.Handler
import android.os.Looper
import android.widget.Toast
import com.google.gson.Gson
import com.google.gson.JsonObject
import kotlin.math.*

object API_Helper {

    fun ETA_SEC_TO_STRING(duration:Int):String {
        var ret_string = "";
        val minutes = duration / 60 // 분 계산
        val seconds = duration % 60 // 초 계산
        if (duration < 60) {
            ret_string = "${seconds}초"
        }
        else {
            ret_string = "${minutes}분 ${seconds}초"
        }

        return ret_string
    }

    fun DISTANCE_FORMAT_METER_TO_KM(meters: String): String {
        val km = meters.toDoubleOrNull()?.div(1000) ?: return "Invalid input"
        return String.format("%.2f km", km)
    }


    fun lidar_levelState(level:Int): String {
        return when (level) {
            -1 -> "정보 없음"
            0 -> "원활"
            1 -> "보통"
            2 -> "약간 혼잡"
            3 -> "혼잡"
            4 -> "매우 혼잡"
            else -> "잘못된 레벨"
        }
    }
    fun lidar_levelState_Color(level:String):String {
        return when (level) {
            "정보 없음" -> "#87CEEB"
            "원활" -> "#4CAF50"
            "보통" -> "#FFEB3B"
            "약간 혼잡" -> "#FF9800"
            "혼잡" -> "#F44336"
            "매우 혼잡" -> "#B71C1C"
            else -> "#000000" // 잘못된 레벨
        }
    }

    fun make_findpath_param(org:String, dest:String, summary:Boolean = true):Map<String, String> {

        return mapOf(
            "origin" to "${org}", //126.705098, 37.412087 출발지 경도, 위도
            "destination" to "${dest}", //126.696239, 37.395276 도착지 경도, 위도
            "priority" to "DISTANCE", // 'RECOMMEND' : 추천경로, 'TIME' : 최단시간, 'DISTANCE' : 최단경로
            "car_type" to "1", //자동차 타입 '1' : 소형(예시) 승용차, 16인승 이하 승합차, 2.5 톤 미만 화물차), '2' : 중형, '3' : 대형, '4' : 대형 화물, '5' : 특수 화물, '6' : 경차, '7' : 이륜차
            "car_fuel" to "DIESEL", //연료 종류
            "car_hipass" to "true", // 하이패스 장착 여부
            "summary" to "${summary}", //요약 전달(true 요약정보 제공, false 미제공)
        )

        /*
        car_type : [1,
        */
    }

    fun make_getAddr_param(lon:String, lat:String):Map<String, String> {

        return mapOf(
            "x" to "${lon}", //126.705098,
            "y" to "${lat}" //37.395276
        )

        /*
        car_type : [1,
        */
    }

    fun make_addressHosp_param(
        Q0:String, // 광역시/도
        Q1:String, // 시군구
        QD:String, // 진료과
        QZ:String, // 병원분류코드
        QN:String, // 관련검색어
        page:String = "1", // 페이지
        row:String = "10", // 결과 개수
    ):JsonObject {
        var _param = mapOf(
            "Q0" to Q0,
            "Q1" to Q1,
            "QD" to QD,
            "QZ" to QZ,
            "QN" to QN,
            "page" to page,
            "row" to row,
        )
        val gson = Gson()
        val json = gson.toJsonTree(_param).asJsonObject
        return json
    }

    fun make_arroundHosp_param(
        lon:String,
        lat:String,
        page: String = "1",
        dgids:List<String> = emptyList(),
        row: String = "10",
        radius: String = "5"
    ): JsonObject {
        var order = "distance"
        var _param = mapOf(
            "lon" to lon, //126.696239 경도
            "lat" to lat, //37.395276 위도
            "radius" to radius, // 경/위도 기준 meter 단위 반경내의 병원
            "order" to order, // 정렬 기준 "distance" 고정
            "row" to row, // 결과 row 개수
            "page" to page, // 결과 page 번째
            "dgidIdName" to dgids, // 진료과에 대한 항목들
        )
        val gson = Gson()
        val json = gson.toJsonTree(_param).asJsonObject
        return json
    }

    fun make_arroundHosp_param2(
        lon:String,
        lat:String,
        emogemdv:String = "", // 필수
        prtcode:String = "", // 필수
        emogdesc:String = "", // 필수 아님
        radius: String = "3",
        row: String = "10",
        page: String = "1",
        emergency: String = "Y"
    ): JsonObject {
        var order = "distance"
        var _param = mapOf(
            "lon" to lon, //126.696239 경도
            "lat" to lat, //37.395276 위도
            "emogemdv" to emogemdv, // 의료기관번호
            "prtcode" to prtcode, // 진료과코드
            "emogdesc" to emogdesc, // 연관검색어
            "radius" to radius, // 반경(km단위, 숫자만 입력)
            "row" to row, // 행
            "page" to page, // 페이지
            "emergency" to emergency // 응급실 여부("Y", "N")
        )
        val gson = Gson()
        val json = gson.toJsonTree(_param).asJsonObject
        return json
    }

    fun make_detail_hosp_param(
        hpid: String
    ) :JsonObject {
        var _param = mapOf(
            "hpid" to hpid, // 병원 아이디
        )
        val gson = Gson()
        val json = gson.toJsonTree(_param).asJsonObject
        return json
    }

    fun calculateDistance(lat1: Double, lon1: Double, lat2: Double, lon2: Double): Double {
        val R = 6371.0 // 지구 반지름 (단위: km)

        val dLat = Math.toRadians(lat2 - lat1)
        val dLon = Math.toRadians(lon2 - lon1)

        val a = sin(dLat / 2) * sin(dLat / 2) +
                cos(Math.toRadians(lat1)) * cos(Math.toRadians(lat2)) *
                sin(dLon / 2) * sin(dLon / 2)

        val c = 2 * atan2(sqrt(a), sqrt(1 - a))

        return R * c // 거리 반환 (단위: km)
    }
}