/**
 * Manual test script for cache middleware
 * Run with: node backend/test-cache.js
 */

const { getCacheMiddleware, invalidateCacheByPattern, getCacheStats, clearCache } = require('./middleware/cache');

console.log('Testing Cache Middleware\n');
console.log('=' .repeat(50));

// Test 1: Create mock request/response objects
console.log('\n1. Testing getCacheMiddleware...');
const mockReq = { originalUrl: '/api/streets?page=1' };
let responseSent = null;
const mockRes = {
  json: (data) => {
    responseSent = data;
    console.log('   Response sent:', JSON.stringify(data).substring(0, 50) + '...');
    return mockRes;
  }
};
const mockNext = () => console.log('   Next middleware called');

// First request - cache miss
console.log('\n   First request (should be cache miss):');
const middleware = getCacheMiddleware(60); // 60 second TTL
middleware(mockReq, mockRes, mockNext);

// Simulate response
mockRes.json({ streets: ['Main St', 'Elm St'], count: 2 });

// Test 2: Second request - should hit cache
console.log('\n   Second request (should be cache hit):');
responseSent = null;
const mockReq2 = { originalUrl: '/api/streets?page=1' };
const mockRes2 = {
  json: (data) => {
    responseSent = data;
    console.log('   Cached response returned:', JSON.stringify(data).substring(0, 50) + '...');
    return mockRes2;
  }
};
middleware(mockReq2, mockRes2, () => console.log('   Should NOT call next!'));

// Test 3: Cache statistics
console.log('\n2. Testing getCacheStats...');
const stats = getCacheStats();
console.log('   Cache stats:', JSON.stringify(stats, null, 2));

// Test 4: Pattern invalidation
console.log('\n3. Testing invalidateCacheByPattern...');
console.log('   Invalidating all /api/streets cache...');
invalidateCacheByPattern('/api/streets');
const statsAfterInvalidation = getCacheStats();
console.log('   Cache stats after invalidation:', JSON.stringify(statsAfterInvalidation, null, 2));

// Test 5: Different URL should not be in cache
console.log('\n4. Testing cache miss for different URL...');
const mockReq3 = { originalUrl: '/api/events?page=1' };
const mockRes3 = {
  json: (data) => {
    console.log('   New URL response sent');
    return mockRes3;
  }
};
middleware(mockReq3, mockRes3, () => console.log('   Next middleware called (cache miss)'));

// Test 6: Clear all cache
console.log('\n5. Testing clearCache...');
clearCache();
const statsAfterClear = getCacheStats();
console.log('   Cache stats after clear:', JSON.stringify(statsAfterClear, null, 2));

console.log('\n' + '='.repeat(50));
console.log('Cache middleware tests completed!');
console.log('\nIntegration points:');
console.log('  - GET /api/streets (5 min cache)');
console.log('  - GET /api/events (2 min cache)');
console.log('  - GET /api/posts (1 min cache)');
console.log('  - GET /api/rewards (10 min cache)');
console.log('  - GET /api/cache/stats (cache statistics)');
console.log('  - DELETE /api/cache (clear all cache)');
