package com.example.m20_gamepad.data

import android.content.Context
import androidx.datastore.core.DataStore
import androidx.datastore.preferences.core.Preferences
import androidx.datastore.preferences.core.edit
import androidx.datastore.preferences.core.intPreferencesKey
import androidx.datastore.preferences.core.stringPreferencesKey
import androidx.datastore.preferences.preferencesDataStore
import com.example.m20_gamepad.video.VideoCodec
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map

/** 应用级 DataStore 单例（由扩展属性 lazy 创建） */
private val Context.appSettingsDataStore: DataStore<Preferences> by preferencesDataStore(
    name = "m20_gamepad_settings"
)

/**
 * 设置仓库：封装 DataStore Preferences 读写。
 *
 * 通过 [settings] Flow 暴露当前配置快照，UI 层收集即可；
 * 修改单项调用对应 set 方法，写入后 Flow 自动推送新值。
 *
 * @param context 应用 Context（通常取自 [com.example.m20_gamepad.M20App]）
 */
class SettingsRepository(context: Context) {

    private val dataStore = context.applicationContext.appSettingsDataStore

    /** 当前设置项（初始发射默认值，随后跟随存储） */
    val settings: Flow<AppSettings> = dataStore.data.map { prefs ->
        AppSettings(
            robotHost = prefs[KEY_HOST] ?: AppSettings.DEFAULT_ROBOT_HOST,
            robotPort = prefs[KEY_PORT] ?: AppSettings.DEFAULT_ROBOT_PORT,
            rtspUrl = prefs[KEY_RTSP_URL] ?: AppSettings.DEFAULT_RTSP_URL,
            videoCodec = VideoCodec.entries.getOrElse(prefs[KEY_CODEC] ?: 0) { VideoCodec.AUTO },
            videoResizeMode = VideoResizeMode.entries.getOrElse(prefs[KEY_RESIZE_MODE] ?: 1) { VideoResizeMode.ZOOM }
        )
    }

    suspend fun setRobotHost(host: String) {
        dataStore.edit { it[KEY_HOST] = host.trim() }
    }

    suspend fun setRobotPort(port: Int) {
        dataStore.edit { it[KEY_PORT] = port.coerceIn(1, 65535) }
    }

    suspend fun setRtspUrl(url: String) {
        dataStore.edit { it[KEY_RTSP_URL] = url.trim() }
    }

    suspend fun setVideoCodec(codec: VideoCodec) {
        dataStore.edit { it[KEY_CODEC] = codec.ordinal }
    }

    /** 一次性写入全部设置（用于设置界面保存按钮） */
    suspend fun setAll(settings: AppSettings) {
        dataStore.edit { prefs ->
            prefs[KEY_HOST] = settings.robotHost.trim()
            prefs[KEY_PORT] = settings.robotPort.coerceIn(1, 65535)
            prefs[KEY_RTSP_URL] = settings.rtspUrl.trim()
            prefs[KEY_CODEC] = settings.videoCodec.ordinal
            prefs[KEY_RESIZE_MODE] = settings.videoResizeMode.ordinal
        }
    }

    companion object {
        private val KEY_HOST = stringPreferencesKey("robot_host")
        private val KEY_PORT = intPreferencesKey("robot_port")
        private val KEY_RTSP_URL = stringPreferencesKey("rtsp_url")
        private val KEY_CODEC = intPreferencesKey("video_codec")
        private val KEY_RESIZE_MODE = intPreferencesKey("video_resize_mode")
    }
}
