package com.github.libretube.util

import com.github.libretube.api.RetrofitInstance
import com.github.libretube.constants.PreferenceKeys
import java.net.URI
import java.net.URLDecoder
import java.nio.charset.StandardCharsets
import java.util.*
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch

object ProxyHelper {
    private fun getImageProxyUrl(): String? {
        val url = PreferenceHelper.getString(PreferenceKeys.IMAGE_PROXY_URL, "")
        return if (url != "") url else null
    }

    private fun setImageProxyUrl(url: String) {
        PreferenceHelper.putString(PreferenceKeys.IMAGE_PROXY_URL, url)
    }

    fun fetchProxyUrl() {
        CoroutineScope(Dispatchers.IO).launch {
            runCatching {
                RetrofitInstance.api.getConfig().imageProxyUrl?.let {
                    setImageProxyUrl(it)
                }
            }
        }
    }

    fun rewriteUrl(url: String?): String? {
        url ?: return null

        val proxyUrl = getImageProxyUrl()
        proxyUrl ?: return url

        runCatching {
            val originalUri = URI(url)
            val newUri = URI(
                originalUri.scheme.lowercase(Locale.US),
                URI(proxyUrl).authority,
                originalUri.path,
                originalUri.query,
                originalUri.fragment
            )
            return URLDecoder.decode(newUri.toString(), StandardCharsets.UTF_8.toString())
        }
        return url
    }
}
