"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.SendMessageCommandHandler = void 0;
const Logger_1 = require("../../Services/Logger");
const uuid_1 = require("uuid");
class SendMessageCommandHandler {
    constructor(chatRepository) {
        this.chatRepository = chatRepository;
    }
    async execute(command) {
        try {
            // Validate message is non-empty string
            if (typeof command.message !== 'string' || !command.message.trim()) {
                throw new Error('Message must be a non-empty string');
            }
            const chat = await this.chatRepository.findById(command.chatId);
            if (!chat) {
                throw new Error('Chat not found');
            }
            // Check if user is member of this chat
            if (!chat.users.includes(command.userId)) {
                throw new Error('User is not a member of this chat');
            }
            // Create message
            const message = {
                id: (0, uuid_1.v4)(),
                date: new Date(),
                userid: command.userId,
                text: command.message.trim()
            };
            // Manage message history (keep last 10 per user, up to 2 weeks)
            let updatedMessages = [...chat.messages, message];
            updatedMessages = this.pruneMessages(updatedMessages);
            // Update chat
            await this.chatRepository.update(command.chatId, {
                messages: updatedMessages,
                lastActivity: new Date()
            });
            (0, Logger_1.logAuth)('Message sent successfully', command.userId, {
                chatId: command.chatId,
                messageLength: command.message.length,
                totalMessages: updatedMessages.length
            });
            return message;
        }
        catch (error) {
            (0, Logger_1.logError)('SendMessageCommandHandler error', error);
            return null;
        }
    }
    pruneMessages(messages) {
        const twoWeeksAgo = new Date(Date.now() - 14 * 24 * 60 * 60 * 1000);
        // Remove messages older than 2 weeks
        let prunedMessages = messages.filter(msg => new Date(msg.date) > twoWeeksAgo);
        // Group by user and keep last 10 messages per user
        const messagesByUser = new Map();
        prunedMessages.forEach(msg => {
            if (!messagesByUser.has(msg.userid)) {
                messagesByUser.set(msg.userid, []);
            }
            messagesByUser.get(msg.userid).push(msg);
        });
        // Keep only last 10 messages per user
        const finalMessages = [];
        messagesByUser.forEach((userMessages, userId) => {
            const last10 = userMessages.slice(-10);
            finalMessages.push(...last10);
        });
        // Sort by date
        return finalMessages.sort((a, b) => new Date(a.date).getTime() - new Date(b.date).getTime());
    }
}
exports.SendMessageCommandHandler = SendMessageCommandHandler;
//# sourceMappingURL=SendMessageCommandHandler.js.map