package dev.inmo.plaguposter.settings.exposed import dev.inmo.micro_utils.repos.KeyValueRepo import dev.inmo.micro_utils.repos.MapKeyValueRepo import dev.inmo.micro_utils.repos.cache.cache.FullKVCache import dev.inmo.micro_utils.repos.cache.full.FullKeyValueCacheRepo import dev.inmo.micro_utils.repos.cache.full.cached import dev.inmo.micro_utils.repos.exposed.keyvalue.ExposedKeyValueRepo import dev.inmo.micro_utils.repos.mappers.withMapper import dev.inmo.plaguposter.settings.repo.SettingsRepo import dev.inmo.tgbotapi.types.ChatId import kotlinx.coroutines.CoroutineScope import kotlinx.serialization.* import kotlinx.serialization.json.Json import org.jetbrains.exposed.sql.Database class ExposedSettingsRepo( parent: KeyValueRepo ) : SettingsRepo, KeyValueRepo by parent @OptIn(InternalSerializationApi::class) inline fun ExposedSettingsRepo( parent: KeyValueRepo, json: Json, serializer: KSerializer = T::class.serializer() ) = ExposedSettingsRepo( parent.withMapper( { chatId }, { json.encodeToString(serializer, this) }, { ChatId(this) }, { json.decodeFromString(serializer, this) } ) ) @OptIn(InternalSerializationApi::class) inline fun ExposedSettingsRepo( database: Database, json: Json, serializer: KSerializer = T::class.serializer(), tableName: String = "settings_${T::class.simpleName!!}" ) = ExposedSettingsRepo( ExposedKeyValueRepo( database, { long("chat_id") }, { text("settings") }, tableName ), json, serializer ) @OptIn(InternalSerializationApi::class) inline fun CachedExposedSettingsRepo( database: Database, json: Json, scope: CoroutineScope, serializer: KSerializer = T::class.serializer(), tableName: String = "settings_${T::class.simpleName!!}" ) = ExposedSettingsRepo( ExposedKeyValueRepo( database, { long("chat_id") }, { text("settings") }, tableName ).cached( FullKVCache(MapKeyValueRepo()), scope ), json, serializer ) @OptIn(InternalSerializationApi::class) inline fun SettingsRepo( parent: KeyValueRepo, json: Json, serializer: KSerializer = T::class.serializer() ) = ExposedSettingsRepo(parent, json, serializer) @OptIn(InternalSerializationApi::class) inline fun SettingsRepo( database: Database, json: Json, serializer: KSerializer = T::class.serializer(), tableName: String = "settings_${T::class.simpleName!!}" ) = ExposedSettingsRepo(database, json, serializer, tableName) @OptIn(InternalSerializationApi::class) inline fun CachedSettingsRepo( database: Database, json: Json, scope: CoroutineScope, serializer: KSerializer = T::class.serializer(), tableName: String = "settings_${T::class.simpleName!!}" ) = CachedExposedSettingsRepo(database, json, scope, serializer, tableName)