package ru.forbion.f7cloud.feature.notes

import android.content.Context
import java.io.File
import java.security.MessageDigest

/**
 * Дисковый кэш списка заметок, ключуемый ETag коллекции (образец — CalendarEventsCache).
 * Формат файла: первая строка — ETag на момент загрузки, дальше сырой JSON массива заметок
 * (переиспользуем боевой парсер [Note.listFromJson], без хрупкого промежуточного маппинга).
 *
 * Даёт: (1) offline-отдачу списка при отсутствии сети; (2) быстрый рефреш через
 * `If-None-Match` — при 304 сеть не качает тело, читаем диск.
 */
class NotesCache(private val dir: File) {

    constructor(context: Context) : this(File(context.cacheDir, "notes_list"))

    data class Entry(val etag: String, val json: String)

    /** Кэш списка для аккаунта, если есть; иначе null. */
    fun get(accountKey: String): Entry? {
        val f = entryFile(accountKey)
        if (!f.isFile) return null
        return runCatching {
            val text = f.readText()
            val nl = text.indexOf('\n')
            if (nl <= 0) null else Entry(text.substring(0, nl), text.substring(nl + 1))
        }.getOrNull()
    }

    fun put(accountKey: String, etag: String, json: String) {
        if (etag.isBlank()) return
        runCatching {
            dir.mkdirs()
            entryFile(accountKey).writeText("$etag\n$json")
        }
    }

    fun clear(accountKey: String) {
        runCatching { entryFile(accountKey).delete() }
    }

    private fun entryFile(accountKey: String): File = File(dir, md5(accountKey) + ".json")

    private fun md5(s: String): String =
        MessageDigest.getInstance("MD5").digest(s.toByteArray())
            .joinToString("") { "%02x".format(it) }
}
