package com.rosetta.messenger.database

import androidx.room.*
import kotlinx.coroutines.flow.Flow

/**
 * Entity для blacklist (заблокированные пользователи)
 */
@Entity(
    tableName = "blacklist",
    indices = [
        Index(value = ["account", "public_key"], unique = true)
    ]
)
data class BlacklistEntity(
    @PrimaryKey(autoGenerate = true)
    val id: Long = 0,
    
    @ColumnInfo(name = "public_key")
    val publicKey: String,          // Публичный ключ заблокированного пользователя
    
    @ColumnInfo(name = "account")
    val account: String             // Мой публичный ключ
)

/**
 * DAO для работы с blacklist
 */
@Dao
interface BlacklistDao {
    
    /**
     * Добавить пользователя в blacklist
     */
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun blockUser(blacklist: BlacklistEntity)
    
    /**
     * Удалить пользователя из blacklist
     */
    @Query("DELETE FROM blacklist WHERE public_key = :publicKey AND account = :account")
    suspend fun unblockUser(publicKey: String, account: String)
    
    /**
     * Проверить, заблокирован ли пользователь
     */
    @Query("SELECT COUNT(*) > 0 FROM blacklist WHERE public_key = :publicKey AND account = :account")
    suspend fun isUserBlocked(publicKey: String, account: String): Boolean
    
    /**
     * Наблюдать за статусом блокировки пользователя (Flow)
     */
    @Query("SELECT COUNT(*) > 0 FROM blacklist WHERE public_key = :publicKey AND account = :account")
    fun observeUserBlocked(publicKey: String, account: String): Flow<Boolean>
    
    /**
     * Получить все заблокированные аккаунты для данного пользователя
     */
    @Query("SELECT * FROM blacklist WHERE account = :account")
    fun getBlockedUsers(account: String): Flow<List<BlacklistEntity>>
    
    /**
     * Получить список всех заблокированных публичных ключей
     */
    @Query("SELECT public_key FROM blacklist WHERE account = :account")
    suspend fun getBlockedPublicKeys(account: String): List<String>

    /** Удалить все записи blacklist для аккаунта */
    @Query("DELETE FROM blacklist WHERE account = :account")
    suspend fun deleteAllByAccount(account: String)
}
