package com.chick_mood.data.database

import androidx.room.*
import kotlinx.coroutines.flow.Flow
import com.chick_mood.data.model.UserConfigEntry

/**
 * 用户配置键值对数据访问对象
 *
 * 提供用户配置的数据库操作接口，包括配置的增删改查
 * 支持流式数据更新和配置版本管理
 *
 * @author Claude
 * @date 2025-10-22
 */
@Dao
interface UserConfigEntryDao {

    /**
     * 插入或更新用户配置
     * 使用Replace策略，如果配置已存在则更新，不存在则插入
     *
     * @param userConfig 用户配置对象
     * @return 受影响的行数
     */
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun insertOrUpdateUserConfig(userConfig: UserConfigEntry): Long

    /**
     * 更新用户配置
     *
     * @param userConfig 要更新的用户配置
     * @return 受影响的行数
     */
    @Update
    suspend fun updateUserConfig(userConfig: UserConfigEntry): Int

    /**
     * 根据配置键获取用户配置
     *
     * @param configKey 配置键
     * @return 用户配置，如果不存在则返回null
     */
    @Query("SELECT * FROM user_config_entries WHERE config_key = :configKey")
    suspend fun getUserConfig(configKey: String): UserConfigEntry?

    /**
     * 获取所有用户配置
     *
     * @return 所有用户配置的流式数据
     */
    @Query("SELECT * FROM user_config_entries")
    fun getAllUserConfigs(): Flow<List<UserConfigEntry>>

    /**
     * 获取用户昵称
     *
     * @return 用户昵称，如果未设置则返回null
     */
    @Query("SELECT config_value FROM user_config_entries WHERE config_key = :configKey")
    suspend fun getConfigValue(configKey: String): String?

    /**
     * 设置配置值
     *
     * @param configKey 配置键
     * @param configValue 配置值
     * @param updatedAt 更新时间
     */
    @Query("INSERT OR REPLACE INTO user_config_entries (config_key, config_value, updated_at) VALUES (:configKey, :configValue, :updatedAt)")
    suspend fun setConfigValue(configKey: String, configValue: String, updatedAt: Long = System.currentTimeMillis())

    // ==================== 便捷方法 ====================

    /**
     * 获取用户昵称
     */
    suspend fun getUserNickname(): String? {
        return getConfigValue(UserConfigEntry.KEY_USER_NICKNAME)
    }

    /**
     * 设置用户昵称
     */
    suspend fun setUserNickname(nickname: String) {
        setConfigValue(UserConfigEntry.KEY_USER_NICKNAME, nickname)
    }

    /**
     * 获取用户头像路径
     */
    suspend fun getUserAvatar(): String? {
        return getConfigValue(UserConfigEntry.KEY_USER_AVATAR)
    }

    /**
     * 设置用户头像路径
     */
    suspend fun setUserAvatar(avatarPath: String?) {
        setConfigValue(UserConfigEntry.KEY_USER_AVATAR, avatarPath ?: "")
    }

    /**
     * 获取应用版本号
     */
    suspend fun getAppVersion(): String? {
        return getConfigValue(UserConfigEntry.KEY_APP_VERSION)
    }

    /**
     * 设置应用版本号
     */
    suspend fun setAppVersion(version: String) {
        setConfigValue(UserConfigEntry.KEY_APP_VERSION, version)
    }

    /**
     * 获取首次使用时间
     */
    suspend fun getFirstUseTime(): Long? {
        return getConfigValue(UserConfigEntry.KEY_FIRST_USE_TIME)?.toLongOrNull()
    }

    /**
     * 设置首次使用时间
     */
    suspend fun setFirstUseTime(timestamp: Long) {
        setConfigValue(UserConfigEntry.KEY_FIRST_USE_TIME, timestamp.toString())
    }

    /**
     * 获取使用天数
     */
    suspend fun getUsageDays(): Int? {
        return getConfigValue(UserConfigEntry.KEY_USAGE_DAYS)?.toIntOrNull()
    }

    /**
     * 增加使用天数
     */
    suspend fun incrementUsageDays() {
        val currentDays = getUsageDays() ?: 0
        setConfigValue(UserConfigEntry.KEY_USAGE_DAYS, (currentDays + 1).toString())
    }

    /**
     * 初始化使用天数
     */
    suspend fun initializeUsageDays() {
        setConfigValue(UserConfigEntry.KEY_USAGE_DAYS, "1")
    }

    /**
     * 获取心情记录总数
     */
    suspend fun getTotalMoodRecords(): Int? {
        return getConfigValue(UserConfigEntry.KEY_TOTAL_MOOD_RECORDS)?.toIntOrNull()
    }

    /**
     * 设置心情记录总数
     */
    suspend fun setTotalMoodRecords(count: Int) {
        setConfigValue(UserConfigEntry.KEY_TOTAL_MOOD_RECORDS, count.toString())
    }

    /**
     * 增加心情记录计数
     */
    suspend fun incrementMoodRecordCount() {
        val currentCount = getTotalMoodRecords() ?: 0
        setConfigValue(UserConfigEntry.KEY_TOTAL_MOOD_RECORDS, (currentCount + 1).toString())
    }

    /**
     * 获取最后活跃时间
     */
    suspend fun getLastActiveTime(): Long? {
        return getConfigValue(UserConfigEntry.KEY_LAST_ACTIVE_TIME)?.toLongOrNull()
    }

    /**
     * 更新最后活跃时间
     */
    suspend fun updateLastActiveTime() {
        setConfigValue(UserConfigEntry.KEY_LAST_ACTIVE_TIME, System.currentTimeMillis().toString())
    }

    /**
     * 获取提醒设置
     */
    suspend fun getReminderTime(reminderType: String): String? {
        return getConfigValue(reminderType)
    }

    /**
     * 设置提醒时间
     */
    suspend fun setReminderTime(reminderType: String, time: String) {
        setConfigValue(reminderType, time)
    }

    /**
     * 获取是否启用了某项功能
     */
    suspend fun isFeatureEnabled(featureKey: String): Boolean {
        val value = getConfigValue(featureKey)
        return value.equals("1", ignoreCase = true) || value.equals("true", ignoreCase = true)
    }

    /**
     * 设置功能开关
     */
    suspend fun setFeatureEnabled(featureKey: String, enabled: Boolean) {
        setConfigValue(featureKey, if (enabled) "1" else "0")
    }

    // ==================== 批量操作 ====================

    /**
     * 批量插入配置
     */
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun insertConfigs(configs: List<UserConfigEntry>): List<Long>

    /**
     * 删除指定配置
     */
    @Query("DELETE FROM user_config_entries WHERE config_key = :configKey")
    suspend fun deleteUserConfig(configKey: String): Int

    /**
     * 清除所有用户配置
     */
    @Query("DELETE FROM user_config_entries")
    suspend fun clearAllUserConfigs(): Int

    /**
     * 获取配置更新时间
     */
    @Query("SELECT updated_at FROM user_config_entries WHERE config_key = :configKey")
    suspend fun getConfigUpdateTime(configKey: String): Long?

    /**
     * 获取所有配置键
     */
    @Query("SELECT DISTINCT config_key FROM user_config_entries")
    suspend fun getAllConfigKeys(): List<String>
}