const { MeiliSearch } = require('meilisearch');

// Cấu hình Meilisearch client
const client = new MeiliSearch({
  host: 'http://localhost:7700',
  apiKey: 'YOUR_MASTER_KEY_HERE', // Thay bằng master key của bạn
});

// Tên index
const INDEX_NAME = 'videos';

// Khởi tạo và cấu hình index
async function setupMeilisearch() {
  try {
    console.log('🔧 Setting up Meilisearch...');

    // Tạo hoặc lấy index
    const index = client.index(INDEX_NAME);

    // Cấu hình searchable attributes
    await index.updateSearchableAttributes([
      'topic',
      'category',
      'theme',
      'colors',
      'tags',
      'searchableText',
      'originalName',
      'filename'
    ]);

    // Cấu hình filterable attributes
    await index.updateFilterableAttributes([
      'category',
      'theme',
      'colors',
      'tags'
    ]);

    // Cấu hình sortable attributes
    await index.updateSortableAttributes([
      'uploadedAt',
      'size'
    ]);

    console.log('✅ Meilisearch setup completed!');
    return index;
  } catch (error) {
    console.error('❌ Error setting up Meilisearch:', error);
    throw error;
  }
}

// Sync tất cả videos từ server lên Meilisearch
async function syncVideosToMeilisearch() {
  try {
    console.log('🔄 Syncing videos to Meilisearch...');

    // Lấy tất cả metadata từ server
    const response = await fetch('http://localhost:3000/meilisearch/update');
    const data = await response.json();

    const index = client.index(INDEX_NAME);
    
    // Upload documents lên Meilisearch
    const result = await index.addDocuments(data.documents);
    
    console.log(`✅ Synced ${data.count} videos to Meilisearch`);
    console.log('Task UID:', result.taskUid);

    return result;
  } catch (error) {
    console.error('❌ Error syncing videos:', error);
    throw error;
  }
}

// Tìm kiếm videos
async function searchVideos(query, options = {}) {
  try {
    const index = client.index(INDEX_NAME);
    const results = await index.search(query, options);
    return results;
  } catch (error) {
    console.error('❌ Error searching videos:', error);
    throw error;
  }
}

// Ví dụ: Tìm kiếm với filters
async function exampleSearches() {
  console.log('\n📚 Example searches:\n');

  // 1. Tìm kiếm basic
  console.log('1. Basic search for "nature":');
  const result1 = await searchVideos('nature');
  console.log(`   Found ${result1.hits.length} results`);

  // 2. Tìm kiếm với filter theme
  console.log('\n2. Search for dark theme videos:');
  const result2 = await searchVideos('', {
    filter: ['theme = dark']
  });
  console.log(`   Found ${result2.hits.length} results`);

  // 3. Tìm kiếm với filter colors
  console.log('\n3. Search for videos with blue color:');
  const result3 = await searchVideos('', {
    filter: ['colors = blue']
  });
  console.log(`   Found ${result3.hits.length} results`);

  // 4. Tìm kiếm kết hợp
  console.log('\n4. Search "landscape" with dark theme and blue color:');
  const result4 = await searchVideos('landscape', {
    filter: ['theme = dark AND colors = blue']
  });
  console.log(`   Found ${result4.hits.length} results`);

  // 5. Tìm kiếm và sắp xếp
  console.log('\n5. All videos sorted by upload date (newest first):');
  const result5 = await searchVideos('', {
    sort: ['uploadedAt:desc'],
    limit: 5
  });
  console.log(`   Found ${result5.hits.length} results`);
}

// Main function
async function main() {
  try {
    // Setup Meilisearch
    await setupMeilisearch();

    // Sync videos
    await syncVideosToMeilisearch();

    // Run example searches
    await exampleSearches();

  } catch (error) {
    console.error('Error:', error);
  }
}

// Export functions
module.exports = {
  setupMeilisearch,
  syncVideosToMeilisearch,
  searchVideos,
  client,
  INDEX_NAME
};

// Chạy nếu file được execute trực tiếp
if (require.main === module) {
  main();
}
