package ru.forbion.f7cloud.feature.files

import okhttp3.MediaType.Companion.toMediaType
import okhttp3.Request
import okhttp3.RequestBody.Companion.toRequestBody
import ru.forbion.f7cloud.core.auth.AuthSession
import ru.forbion.f7cloud.core.auth.OcsUserResolver
import ru.forbion.f7cloud.core.network.NetworkFactory
import ru.forbion.f7cloud.core.network.davFileUrl

/**
 * Нативная работа с текстовыми/markdown-файлами по WebDAV — быстро, без тяжёлого веб-редактора
 * (веб Text грузил весь Files UI). Просто GET текста и PUT при сохранении.
 */
class MarkdownRepository {
    private fun client(session: AuthSession) =
        NetworkFactory.newAuthedClient(session.username, session.appPassword, session.trustAllCerts)

    private fun url(session: AuthSession, relativePath: String): String {
        val userId = session.davUserId ?: OcsUserResolver.resolveDavUserId(session)
        return davFileUrl(session.serverUrl, userId, relativePath)
    }

    fun load(session: AuthSession, relativePath: String): String {
        val request = Request.Builder().url(url(session, relativePath)).header("Accept", "*/*").get().build()
        client(session).newCall(request).execute().use { response ->
            if (!response.isSuccessful || response.body == null) {
                error("Не удалось загрузить файл (HTTP ${response.code})")
            }
            return response.body!!.string()
        }
    }

    fun save(session: AuthSession, relativePath: String, content: String) {
        val media = "text/markdown; charset=utf-8".toMediaType()
        val request = Request.Builder()
            .url(url(session, relativePath))
            .put(content.toRequestBody(media))
            .build()
        client(session).newCall(request).execute().use { response ->
            if (response.code !in 200..299 && response.code != 204) {
                error("Не удалось сохранить (HTTP ${response.code})")
            }
        }
    }
}
