import 'dart:io';

import '/database/models/conversations.dart';
import '/database/models/image_message.dart';
import '/database/models/messages.dart';
import '/database/models/text_messages.dart';
import '/utils/storage/database.dart';

class MessagesRepository {
  static Future<List<Message>> getMessagesForThread(Conversation conversation) async {
    final db = await getDatabaseConnection();

    final List<Map<String, dynamic>> maps = await db.rawQuery(
      '''
      SELECT * FROM messages WHERE association_key IN (
        SELECT association_key FROM conversation_users WHERE conversation_id = ?
      )
      ORDER BY created_at DESC;
      ''',
      [conversation.id]
    );

    return List.generate(maps.length, (i) {
      if (maps[i]['data'] == null) {

        File file = File(maps[i]['file']);

        return ImageMessage(
          id: maps[i]['id'],
          symmetricKey: maps[i]['symmetric_key'],
          userSymmetricKey: maps[i]['user_symmetric_key'],
          file: file,
          senderId: maps[i]['sender_id'],
          senderUsername: maps[i]['sender_username'],
          associationKey: maps[i]['association_key'],
          createdAt: maps[i]['created_at'],
          failedToSend: maps[i]['failed_to_send'] == 1,
        );
      }

      return TextMessage(
        id: maps[i]['id'],
        symmetricKey: maps[i]['symmetric_key'],
        userSymmetricKey: maps[i]['user_symmetric_key'],
        text: maps[i]['data'],
        senderId: maps[i]['sender_id'],
        senderUsername: maps[i]['sender_username'],
        associationKey: maps[i]['association_key'],
        createdAt: maps[i]['created_at'],
        failedToSend: maps[i]['failed_to_send'] == 1,
      );
    });
  }
}