package com.chick_mood.data.database

import androidx.room.*
import androidx.paging.PagingSource
import kotlinx.coroutines.flow.Flow
import com.chick_mood.data.model.MoodRecord
import com.chick_mood.data.model.Emotion

/**
 * 心情记录数据访问对象
 *
 * 提供心情记录的数据库操作接口，包括增删改查和统计功能
 * 支持分页查询和流式数据更新
 *
 * @author Claude
 * @date 2025-10-22
 */
@Dao
interface MoodRecordDao {

    /**
     * 插入新的心情记录
     *
     * @param moodRecord 要插入的心情记录
     * @return 插入记录的行ID
     */
    @Insert
    suspend fun insertMoodRecord(moodRecord: MoodRecord): Long

    /**
     * 批量插入心情记录
     *
     * @param moodRecords 要插入的心情记录列表
     * @return 插入记录的行ID数组
     */
    @Insert
    suspend fun insertMoodRecords(moodRecords: List<MoodRecord>): List<Long>

    /**
     * 更新心情记录
     *
     * @param moodRecord 要更新的心情记录
     * @return 受影响的行数
     */
    @Update
    suspend fun updateMoodRecord(moodRecord: MoodRecord): Int

    /**
     * 删除心情记录
     *
     * @param moodRecord 要删除的心情记录
     * @return 受影响的行数
     */
    @Delete
    suspend fun deleteMoodRecord(moodRecord: MoodRecord): Int

    /**
     * 根据ID删除心情记录
     *
     * @param id 记录ID
     * @return 受影响的行数
     */
    @Query("DELETE FROM mood_records WHERE id = :id")
    suspend fun deleteMoodRecordById(id: Long): Int

    /**
     * 根据ID获取心情记录
     *
     * @param id 记录ID
     * @return 心情记录，如果不存在则返回null
     */
    @Query("SELECT * FROM mood_records WHERE id = :id")
    suspend fun getMoodRecordById(id: Long): MoodRecord?

    /**
     * 获取所有心情记录（按时间倒序）
     *
     * @return 心情记录列表，按创建时间倒序排列
     */
    @Query("SELECT * FROM mood_records ORDER BY timestamp DESC")
    fun getAllMoodRecords(): Flow<List<MoodRecord>>

    /**
     * 获取分页的心情记录（按时间倒序）
     *
     * @return PagingSource用于分页加载
     */
    @Query("SELECT * FROM mood_records ORDER BY timestamp DESC")
    fun getPagedMoodRecords(): PagingSource<Int, MoodRecord>

    /**
     * 获取最近的N条心情记录
     *
     * @param limit 记录数量限制
     * @return 心情记录列表，按时间倒序排列
     */
    @Query("SELECT * FROM mood_records ORDER BY timestamp DESC LIMIT :limit")
    suspend fun getRecentMoodRecords(limit: Int): List<MoodRecord>

    /**
     * 根据情绪类型获取心情记录
     *
     * @param emotion 情绪类型
     * @return 该情绪类型的心情记录列表，按时间倒序排列
     */
    @Query("SELECT * FROM mood_records WHERE emotion = :emotion ORDER BY timestamp DESC")
    suspend fun getMoodRecordsByEmotion(emotion: Emotion): List<MoodRecord>

    /**
     * 获取指定日期范围内的心情记录
     *
     * @param startDate 开始日期（时间戳）
     * @param endDate 结束日期（时间戳）
     * @return 日期范围内的心情记录列表，按时间倒序排列
     */
    @Query("SELECT * FROM mood_records WHERE timestamp BETWEEN :startDate AND :endDate ORDER BY timestamp DESC")
    suspend fun getMoodRecordsByDateRange(startDate: Long, endDate: Long): List<MoodRecord>

    /**
     * 获取今天的心情记录
     *
     * @param startOfDay 今天开始时间戳
     * @param endOfDay 今天结束时间戳
     * @return 今天的心情记录列表
     */
    @Query("SELECT * FROM mood_records WHERE timestamp BETWEEN :startOfDay AND :endOfDay ORDER BY timestamp DESC")
    suspend fun getTodayMoodRecords(startOfDay: Long, endOfDay: Long): List<MoodRecord>

    /**
     * 获取心情记录总数
     *
     * @return 心情记录总数
     */
    @Query("SELECT COUNT(*) FROM mood_records")
    suspend fun getMoodRecordCount(): Int

    /**
     * 根据情绪类型统计记录数量
     *
     * @return 情绪统计结果列表
     */
    @Query("SELECT emotion, COUNT(*) as count FROM mood_records GROUP BY emotion")
    suspend fun getMoodStatistics(): List<EmotionStatistic>

    /**
     * 获取最近的7天心情记录统计
     *
     * @param sevenDaysAgo 7天前的时间戳
     * @return 7天内的心情记录列表
     */
    @Query("SELECT * FROM mood_records WHERE timestamp >= :sevenDaysAgo ORDER BY timestamp DESC")
    suspend fun getRecentWeekMoodRecords(sevenDaysAgo: Long): List<MoodRecord>

    /**
     * 搜索心情记录（按文字内容）
     *
     * @param query 搜索关键词
     * @return 包含关键词的心情记录列表
     */
    @Query("SELECT * FROM mood_records WHERE textContent LIKE '%' || :query || '%' ORDER BY timestamp DESC")
    suspend fun searchMoodRecords(query: String): List<MoodRecord>

    /**
     * 获取心情强度平均值
     *
     * @param emotion 情绪类型（可选）
     * @return 平均心情强度值
     */
    @Query("SELECT AVG(moodIntensity) FROM mood_records WHERE (:emotion IS NULL OR emotion = :emotion)")
    suspend fun getAverageIntensity(emotion: Emotion? = null): Float?

    /**
     * 清除所有心情记录
     *
     * @return 删除的记录数量
     */
    @Query("DELETE FROM mood_records")
    suspend fun clearAllMoodRecords(): Int

    /**
     * 删除指定日期之前的记录
     *
     * @param beforeDate 日期时间戳
     * @return 删除的记录数量
     */
    @Query("DELETE FROM mood_records WHERE timestamp < :beforeDate")
    suspend fun deleteOldMoodRecords(beforeDate: Long): Int
}

/**
 * 情绪统计数据类
 * 用于Room查询结果映射
 *
 * @author Claude
 * @date 2025-10-22
 */
data class EmotionStatistic(
    /**
     * 情绪类型
     */
    val emotion: Emotion,

    /**
     * 该情绪类型的记录数量
     */
    val count: Int
)