package dev.lions.unionflow.server.repository;

import dev.lions.unionflow.server.entity.Message;
import io.quarkus.hibernate.orm.panache.PanacheRepositoryBase;
import jakarta.enterprise.context.ApplicationScoped;

import java.util.List;
import java.util.UUID;

/**
 * Repository pour Message
 *
 * @author UnionFlow Team
 * @version 1.0
 * @since 2026-03-16
 */
@ApplicationScoped
public class MessageRepository implements PanacheRepositoryBase<Message, UUID> {

    /**
     * Trouve tous les messages d'une conversation (non supprimés)
     */
    public List<Message> findByConversation(UUID conversationId, int limit) {
        return find(
            "conversation.id = ?1 AND isDeleted = false AND (actif IS NULL OR actif = true) ORDER BY dateCreation DESC",
            conversationId
        )
        .page(0, limit)
        .list();
    }

    /**
     * Compte les messages non lus d'une conversation pour un membre
     */
    public long countUnreadByConversationAndMember(UUID conversationId, UUID membreId) {
        // Pour simplifier, on compte les messages SENT/DELIVERED (pas READ)
        // et dont le sender n'est PAS le membre en question
        return count(
            "conversation.id = ?1 AND sender.id != ?2 AND status IN ('SENT', 'DELIVERED') AND isDeleted = false",
            conversationId,
            membreId
        );
    }

    /**
     * Marque tous les messages d'une conversation comme lus pour un membre
     */
    public int markAllAsReadByConversationAndMember(UUID conversationId, UUID membreId) {
        return update(
            "status = 'READ', readAt = CURRENT_TIMESTAMP WHERE conversation.id = ?1 AND sender.id != ?2 AND status != 'READ' AND isDeleted = false",
            conversationId,
            membreId
        );
    }

    /**
     * Trouve le dernier message d'une conversation
     */
    public Message findLastByConversation(UUID conversationId) {
        return find(
            "conversation.id = ?1 AND isDeleted = false ORDER BY dateCreation DESC",
            conversationId
        )
        .firstResult();
    }
}
