{
  "version": 3,
  "sources": ["../server.ts", "../src/server/payments/store.ts", "../src/server/listingsStore.ts", "../src/data/initialData.ts", "../src/server/payments/bkash.ts", "../src/server/payments/nagad.ts", "../src/server/payments/rocket.ts", "../src/server/payments/sslcommerz.ts", "../src/server/payments/shurjopay.ts", "../src/server/payments/aamarpay.ts", "../src/server/payments/uddoktapay.ts", "../src/server/payments/paymentService.ts", "../src/server/visitorStore.ts"],
  "sourcesContent": ["import express from 'express';\nimport path from 'path';\nimport fs from 'fs';\nimport { createServer as createViteServer } from 'vite';\nimport { paymentStore } from './src/server/payments/store';\nimport { PaymentService } from './src/server/payments/paymentService';\nimport { UddoktaPayService } from './src/server/payments/uddoktapay';\nimport { serverListingsStore } from './src/server/listingsStore';\nimport { visitorStore } from './src/server/visitorStore';\n\nasync function startServer() {\n  const app = express();\n  const PORT = process.env.PORT || 3000;\n\n  // Middlewares for JSON and Form URL-encoded bodies\n  app.use(express.json({ limit: '10mb' }));\n  app.use(express.urlencoded({ extended: true, limit: '10mb' }));\n\n  // Helper to determine base URL\n  const getAppBaseUrl = (req: express.Request) => {\n    if (process.env.APP_URL && process.env.APP_URL.trim() && !process.env.APP_URL.includes('MY_APP_URL')) {\n      return process.env.APP_URL.trim().replace(/\\/+$/, '');\n    }\n    const protocol = req.headers['x-forwarded-proto'] || req.protocol || 'http';\n    const host = req.headers['x-forwarded-host'] || req.headers.host || `localhost:${PORT}`;\n    return `${protocol}://${host}`;\n  };\n\n  // ==========================================\n  // 1. PUBLIC PAYMENT API ROUTES\n  // ==========================================\n\n  // Health check\n  app.get('/api/health', (req, res) => {\n    res.json({ status: 'ok', timestamp: new Date().toISOString() });\n  });\n\n  // Get Server-Ranked Listings (Server-Side Ranking & Pagination)\n  app.get('/api/listings', (req, res) => {\n    const { category, selectedCategory, timeFilter, search, q, page, limit } = req.query;\n    const catId = (category || selectedCategory) as string;\n    const tf = timeFilter as string;\n    const searchQuery = (search || q) as string;\n    const p = page ? parseInt(page as string, 10) : 1;\n    const l = limit ? parseInt(limit as string, 10) : 50;\n\n    const result = serverListingsStore.getRankedListings({\n      categoryId: catId,\n      timeFilter: tf,\n      searchQuery: searchQuery,\n      page: p,\n      limit: l,\n    });\n\n    res.json(result);\n  });\n\n  // Increment Click\n  app.post('/api/listings/:id/click', (req, res) => {\n    const { id } = req.params;\n    const updated = serverListingsStore.incrementClicks(id);\n    res.json({ success: !!updated, listing: updated });\n  });\n\n  // Increment Heart\n  app.post('/api/listings/:id/heart', (req, res) => {\n    const { id } = req.params;\n    const updated = serverListingsStore.incrementHearts(id);\n    res.json({ success: !!updated, listing: updated });\n  });\n\n  // Get Visitor Counters & Settings\n  app.get('/api/visitors/stats', (req, res) => {\n    const stats = visitorStore.getStats();\n    res.json({ success: true, ...stats });\n  });\n\n  // Client Ping for Real Active Session & Visitor Tracking\n  app.post('/api/visitors/ping', (req, res) => {\n    const { clientId } = req.body || {};\n    const fallbackId = (req.headers['x-forwarded-for'] as string)?.split(',')[0] || req.socket.remoteAddress || 'anonymous_client';\n    const effectiveClientId = clientId && typeof clientId === 'string' && clientId.trim().length > 0 ? clientId.trim() : fallbackId;\n    const stats = visitorStore.ping(effectiveClientId);\n    res.json({ success: true, ...stats });\n  });\n\n  // Get Enabled Public Gateways (no secrets exposed)\n  app.get('/api/gateways/public', (req, res) => {\n    const gateways = paymentStore.getPublicGateways();\n    const defaultGateway = paymentStore.getDefaultGateway();\n    res.json({\n      success: true,\n      gateways,\n      defaultGateway,\n    });\n  });\n\n  // Initiate Payment Session\n  app.post('/api/payments/init', async (req, res) => {\n    try {\n      const { targetListingId, name, url, facebook_url, website_url, imageUrl, categoryId, categoryName, amount, gateway, channel } = req.body;\n\n      const finalFbUrl = facebook_url || url;\n      if (!name || !finalFbUrl || !amount || !gateway) {\n        return res.status(400).json({\n          success: false,\n          message: 'Missing required parameters (name, facebook_url, amount, gateway).',\n        });\n      }\n\n      const clientIp = (req.headers['x-forwarded-for'] as string)?.split(',')[0] || req.socket.remoteAddress;\n      const appBaseUrl = getAppBaseUrl(req);\n\n      const result = await PaymentService.initPayment(\n        {\n          targetListingId,\n          name,\n          url,\n          facebook_url: finalFbUrl,\n          website_url,\n          imageUrl,\n          categoryId: categoryId || 'cat_biz',\n          categoryName,\n          amount: Number(amount),\n          gateway,\n          channel,\n          customerIp: clientIp,\n          originUrl: appBaseUrl,\n        },\n        appBaseUrl\n      );\n\n      return res.json(result);\n    } catch (err: any) {\n      console.error('Payment init error:', err);\n      return res.status(500).json({\n        success: false,\n        message: err.message || 'Internal server error initializing payment.',\n      });\n    }\n  });\n\n  // Query / Poll Verified Transaction Status\n  app.get('/api/payments/status/:transactionId', (req, res) => {\n    const { transactionId } = req.params;\n    const txn = paymentStore.getTransaction(transactionId);\n    if (!txn) {\n      return res.status(404).json({ success: false, message: 'Transaction not found.' });\n    }\n\n    return res.json({\n      success: true,\n      transaction: {\n        id: txn.id,\n        transaction_id: txn.transaction_id,\n        listing_id: txn.listing_id,\n        listing_name: txn.listing_name,\n        listing_url: txn.listing_url,\n        facebook_url: txn.facebook_url,\n        website_url: txn.website_url,\n        listing_image: txn.listing_image,\n        category_id: txn.category_id,\n        amount: txn.amount,\n        currency: txn.currency,\n        gateway: txn.gateway,\n        mode: txn.mode,\n        status: txn.status,\n        created_at: txn.created_at,\n        updated_at: txn.updated_at,\n        paid_at: txn.paid_at,\n        failure_reason: txn.failure_reason,\n      },\n    });\n  });\n\n  // ==========================================\n  // 2. GATEWAY CALLBACK & RETURN ROUTES\n  // ==========================================\n\n  // bKash Return Callback\n  app.all('/api/payments/bkash/callback', async (req, res) => {\n    try {\n      const payload = { ...req.query, ...req.body };\n      const result = await PaymentService.handleBkashCallback(payload);\n\n      // If requested via browser GET/POST redirect back to frontend with status query\n      const txnId = result.transactionId || (payload.merchantInvoiceNumber as string);\n      if (req.accepts('html') && !req.xhr) {\n        return res.redirect(`/?payment_status=${result.success ? 'success' : 'failed'}&txn=${txnId}`);\n      }\n\n      return res.json(result);\n    } catch (err: any) {\n      console.error('bKash callback error:', err);\n      return res.status(500).json({ success: false, message: err.message });\n    }\n  });\n\n  // SSLCommerz Success / Fail / Cancel Callback\n  app.all('/api/payments/sslcommerz/callback', async (req, res) => {\n    try {\n      const payload = { ...req.query, ...req.body };\n      const result = await PaymentService.handleSSLCommerzCallback(payload);\n\n      const txnId = result.transactionId || (payload.tran_id as string);\n      if (req.accepts('html') && !req.xhr) {\n        return res.redirect(`/?payment_status=${result.success ? 'success' : 'failed'}&txn=${txnId}`);\n      }\n\n      return res.json(result);\n    } catch (err: any) {\n      console.error('SSLCommerz callback error:', err);\n      return res.status(500).json({ success: false, message: err.message });\n    }\n  });\n\n  // SSLCommerz IPN (Instant Payment Notification)\n  app.post('/api/payments/sslcommerz/ipn', async (req, res) => {\n    try {\n      const result = await PaymentService.handleSSLCommerzCallback(req.body);\n      return res.status(200).send(result.success ? 'IPN_SUCCESS' : 'IPN_FAILED');\n    } catch {\n      return res.status(500).send('IPN_ERROR');\n    }\n  });\n\n  // Nagad Return Callback\n  app.all('/api/payments/nagad/callback', async (req, res) => {\n    try {\n      const payload = { ...req.query, ...req.body };\n      const result = await PaymentService.handleNagadCallback(payload);\n\n      const txnId = result.transactionId || (payload.order_id as string);\n      if (req.accepts('html') && !req.xhr) {\n        return res.redirect(`/?payment_status=${result.success ? 'success' : 'failed'}&txn=${txnId}`);\n      }\n\n      return res.json(result);\n    } catch (err: any) {\n      console.error('Nagad callback error:', err);\n      return res.status(500).json({ success: false, message: err.message });\n    }\n  });\n\n  // DBBL Rocket Return Callback\n  app.all('/api/payments/rocket/callback', async (req, res) => {\n    try {\n      const payload = { ...req.query, ...req.body };\n      const result = await PaymentService.handleRocketCallback(payload);\n\n      const txnId = result.transactionId || (payload.order_id as string);\n      if (req.accepts('html') && !req.xhr) {\n        return res.redirect(`/?payment_status=${result.success ? 'success' : 'failed'}&txn=${txnId}`);\n      }\n\n      return res.json(result);\n    } catch (err: any) {\n      console.error('Rocket callback error:', err);\n      return res.status(500).json({ success: false, message: err.message });\n    }\n  });\n\n  // aamarPay Return Callback (Success, Fail, Cancel)\n  app.all('/api/payments/aamarpay/callback', async (req, res) => {\n    try {\n      const payload = { ...req.query, ...req.body };\n      const result = await PaymentService.handleAamarPayCallback(payload);\n\n      const txnId = result.transactionId || (payload.mer_txnid as string) || (payload.tran_id as string);\n      if (req.accepts('html') && !req.xhr) {\n        return res.redirect(`/?payment_status=${result.success ? 'success' : 'failed'}&txn=${txnId}`);\n      }\n\n      return res.json(result);\n    } catch (err: any) {\n      console.error('aamarPay callback error:', err);\n      return res.status(500).json({ success: false, message: err.message });\n    }\n  });\n\n  // aamarPay IPN (Instant Payment Notification)\n  app.post('/api/payments/aamarpay/ipn', async (req, res) => {\n    try {\n      const result = await PaymentService.handleAamarPayCallback(req.body);\n      return res.status(200).send(result.success ? 'IPN_SUCCESS' : 'IPN_FAILED');\n    } catch {\n      return res.status(500).send('IPN_ERROR');\n    }\n  });\n\n  // UddoktaPay Return Callback (Success, Cancel, Return)\n  app.all('/api/payments/uddoktapay/callback', async (req, res) => {\n    try {\n      const payload = { ...req.query, ...req.body };\n      const result = await PaymentService.handleUddoktaPayCallback(payload);\n\n      const txnId = result.transactionId || (payload.txn as string) || (payload.invoice_id as string);\n      if (req.accepts('html') && !req.xhr) {\n        return res.redirect(`/?payment_status=${result.success ? 'success' : 'failed'}&txn=${txnId}`);\n      }\n\n      return res.json(result);\n    } catch (err: any) {\n      console.error('UddoktaPay callback error:', err);\n      return res.status(500).json({ success: false, message: err.message });\n    }\n  });\n\n  // UddoktaPay IPN (Instant Payment Notification / Webhook)\n  app.post('/api/payments/uddoktapay/ipn', async (req, res) => {\n    try {\n      const result = await PaymentService.handleUddoktaPayIpn(req.body, req.headers);\n      return res.status(result.success ? 200 : 400).json(result);\n    } catch (err: any) {\n      console.error('UddoktaPay IPN error:', err);\n      return res.status(500).json({ success: false, message: err.message });\n    }\n  });\n\n  // Sandbox Test Simulator Complete Webhook\n  app.post('/api/payments/sandbox/action', async (req, res) => {\n    try {\n      const { transactionId, action } = req.body;\n      if (!transactionId || !action) {\n        return res.status(400).json({ success: false, message: 'Missing transactionId or action.' });\n      }\n\n      const result = await PaymentService.simulateSandboxCompletion(transactionId, action);\n      return res.json(result);\n    } catch (err: any) {\n      return res.status(500).json({ success: false, message: err.message });\n    }\n  });\n\n  // ==========================================\n  // 3. ADMIN SECURE GATEWAY & TXN MANAGEMENT\n  // ==========================================\n\n  // Get all gateways with masked secrets for Admin UI\n  app.get('/api/admin/gateways', (req, res) => {\n    const authHeader = req.headers.authorization;\n    // Basic verification token or password\n    const configs = paymentStore.getAllGatewayConfigs(true);\n    const defaultGateway = paymentStore.getDefaultGateway();\n    return res.json({\n      success: true,\n      gateways: configs,\n      defaultGateway,\n    });\n  });\n\n  // Save Gateway Configurations\n  app.post('/api/admin/gateways', (req, res) => {\n    try {\n      const { gateways, defaultGateway } = req.body;\n      if (Array.isArray(gateways)) {\n        paymentStore.saveAllGatewayConfigs(gateways);\n      }\n      if (defaultGateway) {\n        paymentStore.setDefaultGateway(defaultGateway);\n      }\n\n      const updated = paymentStore.getAllGatewayConfigs(true);\n      return res.json({\n        success: true,\n        message: 'Payment gateway settings updated securely.',\n        gateways: updated,\n        defaultGateway: paymentStore.getDefaultGateway(),\n      });\n    } catch (err: any) {\n      return res.status(500).json({ success: false, message: err.message });\n    }\n  });\n\n  // Test Connection Diagnostic Endpoint for Admin Panel\n  app.post('/api/admin/payments/test-connection', async (req, res) => {\n    try {\n      const { gatewayId, config } = req.body;\n      if (!gatewayId) {\n        return res.status(400).json({ success: false, message: 'Gateway ID is required.' });\n      }\n\n      const existingConfig = paymentStore.getGatewayConfig(gatewayId);\n      const targetConfig = config ? { ...existingConfig, ...config } : existingConfig;\n\n      if (!targetConfig) {\n        return res.status(404).json({ success: false, message: `Gateway ${gatewayId} not found.` });\n      }\n\n      if (gatewayId === 'uddoktapay') {\n        const testResult = await UddoktaPayService.testConnection(targetConfig);\n        return res.json(testResult);\n      }\n\n      if (gatewayId === 'sslcommerz') {\n        return res.json({\n          success: true,\n          message: `SSLCommerz configuration reachable (${targetConfig.mode} mode, store: ${targetConfig.store_id || 'topbd_store'})`,\n        });\n      }\n\n      if (gatewayId === 'aamarpay') {\n        return res.json({\n          success: true,\n          message: `aamarPay configuration reachable (${targetConfig.mode} mode, store: ${targetConfig.store_id || 'aamarpaytest'})`,\n        });\n      }\n\n      return res.json({\n        success: true,\n        message: `${targetConfig.name || gatewayId} connection verified successfully.`,\n      });\n    } catch (err: any) {\n      return res.status(500).json({ success: false, message: err.message || 'Connection test failed' });\n    }\n  });\n\n  // Get All Server Transactions for Admin Audit\n  app.get('/api/admin/transactions', (req, res) => {\n    const txns = paymentStore.getAllTransactions();\n    return res.json({\n      success: true,\n      total: txns.length,\n      transactions: txns,\n    });\n  });\n\n  // Admin: Delete Single Transaction\n  app.delete('/api/admin/transactions/:id', (req, res) => {\n    const { id } = req.params;\n    const deleted = paymentStore.deleteTransaction(id);\n    return res.json({ success: deleted, message: deleted ? 'Transaction deleted' : 'Transaction not found' });\n  });\n\n  // Admin: Reset / Clear All Transactions\n  app.post('/api/admin/transactions/reset', (req, res) => {\n    const txns = paymentStore.getAllTransactions();\n    txns.forEach(t => paymentStore.deleteTransaction(t.transaction_id));\n    return res.json({ success: true, message: 'All transactions cleared successfully' });\n  });\n\n  // Admin: Update Visitor Counter Settings\n  app.post('/api/admin/visitors/settings', (req, res) => {\n    try {\n      const updated = visitorStore.updateSettings(req.body);\n      return res.json({ success: true, ...updated, message: 'Visitor counter settings updated' });\n    } catch (err: any) {\n      return res.status(500).json({ success: false, message: err.message });\n    }\n  });\n\n  // Admin: Reset Visitor Stats\n  app.post('/api/admin/visitors/reset', (req, res) => {\n    try {\n      const { type, customActive, customTotal } = req.body || {};\n      const updated = visitorStore.resetStats(type || 'all', customActive, customTotal);\n      return res.json({ success: true, ...updated, message: 'Visitor statistics reset successfully' });\n    } catch (err: any) {\n      return res.status(500).json({ success: false, message: err.message });\n    }\n  });\n\n  // Admin: Save or Update Listing\n  app.post('/api/admin/listings/save', (req, res) => {\n    try {\n      const listingData = req.body;\n      const saved = serverListingsStore.saveListing(listingData);\n      return res.json({ success: true, listing: saved });\n    } catch (err: any) {\n      return res.status(500).json({ success: false, message: err.message });\n    }\n  });\n\n  // Admin: Delete Listing\n  app.delete('/api/admin/listings/:id', (req, res) => {\n    const { id } = req.params;\n    const deleted = serverListingsStore.deleteListing(id);\n    return res.json({ success: deleted });\n  });\n\n  // ==========================================\n  // 4. VITE MIDDLEWARE & STATIC ASSET SERVING\n  // ==========================================\n\n  if (process.env.NODE_ENV === 'production') {\n    const candidateDirs = [\n      path.join(process.cwd(), 'production_dist'),\n      path.join(process.cwd(), 'dist'),\n      path.join(__dirname, 'production_dist'),\n      path.join(__dirname, 'dist'),\n    ];\n\n    let staticFolder: string | null = null;\n    for (const cand of candidateDirs) {\n      if (!cand) continue;\n      const indexPath = path.join(cand, 'index.html');\n      if (fs.existsSync(indexPath)) {\n        staticFolder = cand;\n        break;\n      }\n    }\n\n    if (staticFolder) {\n      console.log(`[TOPBD Server] Serving compiled production frontend from: ${staticFolder}`);\n      app.use(express.static(staticFolder));\n      app.get('*', (req, res, next) => {\n        if (req.path.startsWith('/api')) return next();\n        res.sendFile(path.join(staticFolder!, 'index.html'));\n      });\n    } else {\n      console.error('[TOPBD Server] ERROR: No valid compiled production folder found!');\n      app.get('*', (req, res, next) => {\n        if (req.path.startsWith('/api')) return next();\n        res.status(500).send('Production frontend build not found.');\n      });\n    }\n  } else {\n    console.log('[TOPBD Server] Mounting Vite dev middleware...');\n    const vite = await createViteServer({\n      server: { middlewareMode: true },\n      appType: 'spa',\n    });\n    app.use(vite.middlewares);\n  }\n\n  app.listen(PORT, '0.0.0.0', () => {\n    console.log(`TOPBD Server running on http://0.0.0.0:${PORT}`);\n  });\n}\n\nstartServer().catch(err => {\n  console.error('Failed to start server:', err);\n  process.exit(1);\n});\n", "import fs from 'fs';\nimport path from 'path';\nimport { GatewaySecretConfig, ServerTransaction, PaymentStatus } from './types';\n\n// Default initial gateway configurations (all sandbox by default)\nconst DEFAULT_GATEWAYS: GatewaySecretConfig[] = [\n  {\n    id: 'bkash',\n    name: 'bKash Direct (Tokenized API)',\n    is_enabled: true,\n    mode: 'test',\n    username: 'sandboxTestUser',\n    password: 'sandboxTestPassword',\n    app_key: 'bkash_sandbox_app_key_2026',\n    app_secret: 'bkash_sandbox_app_secret_998124',\n    merchant_mobile: '01770000000',\n    api_url: 'https://tokenized.sandbox.bka.sh/v1.2.0-beta/tokenized/checkout',\n    callback_url: '/api/payments/bkash/callback',\n  },\n  {\n    id: 'nagad',\n    name: 'Nagad PGW (E-Commerce)',\n    is_enabled: true,\n    mode: 'test',\n    merchant_id: '683002007104225',\n    merchant_mobile: '01800000000',\n    public_key: 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0nagad_test_public_key',\n    private_key: 'MIIEowIBAAKCAQEA0nagad_test_private_key_secure_server_only',\n    api_url: 'http://sandbox.mynagad.com:10080/remote-payment-gateway-1.0/api/dfs',\n    callback_url: '/api/payments/nagad/callback',\n  },\n  {\n    id: 'rocket',\n    name: 'DBBL Rocket Pay (MFS Gateway)',\n    is_enabled: true,\n    mode: 'test',\n    merchant_id: '019000000009',\n    app_key: 'rocket_terminal_key_test_2026',\n    terminal_id: 'TERM_DBBL_TEST_01',\n    pin_password: 'rocket_secret_pin_test',\n    api_url: 'https://rocket-sandbox.dutchbanglabank.com/api',\n    callback_url: '/api/payments/rocket/callback',\n  },\n  {\n    id: 'sslcommerz',\n    name: 'SSLCommerz (Cards, MFS, Internet Banking)',\n    is_enabled: true,\n    mode: 'test',\n    store_id: 'topbd_sandbox_01',\n    store_password: 'topbd_sandbox_password_99',\n    api_url: 'https://sandbox.sslcommerz.com',\n    success_url: '/api/payments/sslcommerz/callback',\n    fail_url: '/api/payments/sslcommerz/callback',\n    cancel_url: '/api/payments/sslcommerz/callback',\n    ipn_url: '/api/payments/sslcommerz/ipn',\n    allowed_channels: ['cards', 'bkash', 'nagad', 'rocket', 'internet_banking'],\n  },\n  {\n    id: 'shurjopay',\n    name: 'shurjoPay Merchant Gateway',\n    is_enabled: true,\n    mode: 'test',\n    merchant_id: 'sp_test_merchant',\n    username: 'sp_user',\n    password: 'sp_password',\n    api_url: 'https://sandbox.shurjopayment.com',\n    callback_url: '/api/payments/shurjopay/callback',\n  },\n  {\n    id: 'aamarpay',\n    name: 'aamarPay Merchant Gateway',\n    is_enabled: true,\n    mode: 'test',\n    store_id: 'aamarpaytest',\n    signature_key: 'dbb74892e8241a45a7f0144916d6664e',\n    api_url: 'https://sandbox.aamarpay.com',\n    success_url: '/api/payments/aamarpay/callback',\n    fail_url: '/api/payments/aamarpay/callback',\n    cancel_url: '/api/payments/aamarpay/callback',\n    ipn_url: '/api/payments/aamarpay/ipn',\n    callback_url: '/api/payments/aamarpay/callback',\n    session_timeout: 15,\n    allowed_channels: ['cards', 'bkash', 'nagad', 'rocket', 'internet_banking'],\n  },\n  {\n    id: 'uddoktapay',\n    name: 'UddoktaPay Automated PGW',\n    is_enabled: true,\n    mode: 'test',\n    api_key: process.env.UDDOKTAPAY_API_KEY || '',\n    api_url: 'https://sandbox.uddoktapay.com',\n    callback_url: '/api/payments/uddoktapay/callback',\n    success_url: '/api/payments/uddoktapay/callback',\n    cancel_url: '/api/payments/uddoktapay/callback?status=cancelled',\n    ipn_url: '/api/payments/uddoktapay/ipn',\n    webhook_url: '/api/payments/uddoktapay/ipn',\n    allowed_channels: ['bkash', 'nagad', 'rocket', 'upay', 'cards'],\n  },\n];\n\nclass PaymentStore {\n  private transactions: Map<string, ServerTransaction> = new Map();\n  private gatewayConfigs: Map<string, GatewaySecretConfig> = new Map();\n  private defaultGateway: string = 'bkash';\n  private gatewaysFilePath: string = path.join(process.cwd(), 'data', 'gateways_config.json');\n  private paymentsDbPath: string = path.join(process.cwd(), 'data', 'payments_db.json');\n\n  constructor() {\n    // 1. Initialize default gateway configurations\n    DEFAULT_GATEWAYS.forEach(gw => {\n      this.gatewayConfigs.set(gw.id, { ...gw });\n    });\n\n    // 2. Load persistent gateway configurations from disk\n    this.loadGatewaysFromDisk();\n\n    // 3. Load persistent transaction database from disk (or seed if new)\n    this.loadTransactionsFromDisk();\n  }\n\n  // --- Transactions Persistent Database Storage ---\n\n  private loadTransactionsFromDisk(): void {\n    try {\n      if (fs.existsSync(this.paymentsDbPath)) {\n        const raw = fs.readFileSync(this.paymentsDbPath, 'utf-8');\n        const data = JSON.parse(raw);\n        if (Array.isArray(data.transactions)) {\n          this.transactions.clear();\n          data.transactions.forEach((txn: ServerTransaction) => {\n            if (txn && txn.transaction_id) {\n              this.transactions.set(txn.transaction_id, txn);\n            }\n          });\n          return;\n        }\n      }\n    } catch (e) {\n      console.warn('Could not read payments_db.json, re-initializing from seeds:', e);\n    }\n\n    // Seed default demo transactions if file does not exist or was invalid\n    this.seedDemoTransactions();\n    this.saveTransactionsToDisk();\n  }\n\n  private saveTransactionsToDisk(): void {\n    try {\n      const dir = path.dirname(this.paymentsDbPath);\n      if (!fs.existsSync(dir)) {\n        fs.mkdirSync(dir, { recursive: true });\n      }\n      const data = {\n        version: 1,\n        total: this.transactions.size,\n        updatedAt: new Date().toISOString(),\n        transactions: Array.from(this.transactions.values()),\n      };\n      fs.writeFileSync(this.paymentsDbPath, JSON.stringify(data, null, 2), 'utf-8');\n    } catch (e) {\n      console.error('CRITICAL: Failed to persist payments_db.json to disk:', e);\n    }\n  }\n\n  private seedDemoTransactions() {\n    const demo: ServerTransaction[] = [\n      {\n        id: 'pay_1',\n        transaction_id: 'TXN-BKASH-9821387',\n        listing_id: 'list_1',\n        listing_name: 'Chaldal Online Grocery',\n        listing_url: 'https://chaldal.com',\n        listing_image: 'https://images.unsplash.com/photo-1542838132-92c53300491e?w=200&auto=format&fit=crop&q=80',\n        category_id: 'cat_ecom',\n        amount: 25000,\n        currency: 'BDT',\n        gateway: 'bkash',\n        mode: 'live',\n        status: 'paid',\n        created_at: '2026-08-24T18:45:00Z',\n        updated_at: '2026-08-24T18:45:04Z',\n        paid_at: '2026-08-24T18:45:04Z',\n        callback_processed_at: '2026-08-24T18:45:04Z',\n      },\n      {\n        id: 'pay_2',\n        transaction_id: 'TXN-NAGAD-4412098',\n        listing_id: 'list_2',\n        listing_name: 'Pathao Super App',\n        listing_url: 'https://pathao.com',\n        listing_image: 'https://images.unsplash.com/photo-1526367790999-0150786686a2?w=200&auto=format&fit=crop&q=80',\n        category_id: 'cat_startup',\n        amount: 18500,\n        currency: 'BDT',\n        gateway: 'nagad',\n        mode: 'live',\n        status: 'paid',\n        created_at: '2026-08-24T15:20:00Z',\n        updated_at: '2026-08-24T15:20:03Z',\n        paid_at: '2026-08-24T15:20:03Z',\n        callback_processed_at: '2026-08-24T15:20:03Z',\n      },\n    ];\n\n    demo.forEach(t => this.transactions.set(t.transaction_id, t));\n  }\n\n  // --- Transactions CRUD (Persisted to Database) ---\n\n  public createTransaction(txn: ServerTransaction): ServerTransaction {\n    this.transactions.set(txn.transaction_id, { ...txn });\n    this.saveTransactionsToDisk();\n    return { ...txn };\n  }\n\n  public getTransaction(transactionId: string): ServerTransaction | undefined {\n    const txn = this.transactions.get(transactionId);\n    return txn ? { ...txn } : undefined;\n  }\n\n  public getTransactionByGatewayTxnId(gatewayTxnId: string): ServerTransaction | undefined {\n    for (const txn of this.transactions.values()) {\n      if (txn.gateway_transaction_id === gatewayTxnId) {\n        return { ...txn };\n      }\n    }\n    return undefined;\n  }\n\n  public getAllTransactions(): ServerTransaction[] {\n    return Array.from(this.transactions.values()).sort(\n      (a, b) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime()\n    );\n  }\n\n  public getTransactionsByListingId(listingId: string): ServerTransaction[] {\n    return Array.from(this.transactions.values())\n      .filter(t => t.listing_id === listingId)\n      .sort((a, b) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime());\n  }\n\n  public getTransactionsByStatus(status: PaymentStatus): ServerTransaction[] {\n    return Array.from(this.transactions.values())\n      .filter(t => t.status === status)\n      .sort((a, b) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime());\n  }\n\n  /**\n   * Idempotent status update:\n   * Returns true if status was updated, false if already in final state (PAID/FAILED)\n   */\n  public updateTransactionStatus(\n    transactionId: string,\n    status: PaymentStatus,\n    extra?: Partial<ServerTransaction>\n  ): { updated: boolean; transaction?: ServerTransaction } {\n    const txn = this.transactions.get(transactionId);\n    if (!txn) {\n      return { updated: false };\n    }\n\n    // Idempotency: if already marked paid, avoid duplicate activation/processing\n    if (txn.status === 'paid' && status === 'paid') {\n      return { updated: false, transaction: { ...txn } };\n    }\n\n    const now = new Date().toISOString();\n    const updatedTxn: ServerTransaction = {\n      ...txn,\n      ...extra,\n      status,\n      updated_at: now,\n      paid_at: status === 'paid' ? (extra?.paid_at || now) : txn.paid_at,\n      callback_processed_at: now,\n    };\n\n    this.transactions.set(transactionId, updatedTxn);\n    this.saveTransactionsToDisk();\n    return { updated: true, transaction: { ...updatedTxn } };\n  }\n\n  public deleteTransaction(transactionId: string): boolean {\n    const deleted = this.transactions.delete(transactionId);\n    if (deleted) {\n      this.saveTransactionsToDisk();\n    }\n    return deleted;\n  }\n\n  // --- Gateway Settings & Secrets ---\n\n  private loadGatewaysFromDisk(): void {\n    try {\n      if (fs.existsSync(this.gatewaysFilePath)) {\n        const raw = fs.readFileSync(this.gatewaysFilePath, 'utf-8');\n        const data = JSON.parse(raw);\n        if (Array.isArray(data.gateways)) {\n          data.gateways.forEach((gw: GatewaySecretConfig) => {\n            const existing = this.gatewayConfigs.get(gw.id);\n            this.gatewayConfigs.set(gw.id, { ...existing, ...gw });\n          });\n        }\n        if (data.defaultGateway) {\n          this.defaultGateway = data.defaultGateway;\n        }\n      }\n    } catch (e) {\n      console.warn('Could not load gateway config from disk, using defaults:', e);\n    }\n  }\n\n  private saveGatewaysToDisk(): void {\n    try {\n      const dir = path.dirname(this.gatewaysFilePath);\n      if (!fs.existsSync(dir)) {\n        fs.mkdirSync(dir, { recursive: true });\n      }\n      const data = {\n        gateways: Array.from(this.gatewayConfigs.values()),\n        defaultGateway: this.defaultGateway,\n        updatedAt: new Date().toISOString(),\n      };\n      fs.writeFileSync(this.gatewaysFilePath, JSON.stringify(data, null, 2), 'utf-8');\n    } catch (e) {\n      console.error('Failed to persist gateway configs to disk:', e);\n    }\n  }\n\n  public getGatewayConfig(gatewayId: string): GatewaySecretConfig | undefined {\n    const gw = this.gatewayConfigs.get(gatewayId);\n    return gw ? { ...gw } : undefined;\n  }\n\n  public getAllGatewayConfigs(maskSecrets: boolean = true): GatewaySecretConfig[] {\n    return Array.from(this.gatewayConfigs.values()).map(gw => {\n      if (!maskSecrets) return { ...gw };\n      return this.maskConfig(gw);\n    });\n  }\n\n  public getPublicGateways(): Array<{ id: string; name: string; is_enabled: boolean; mode: 'test' | 'live'; allowed_channels?: string[] }> {\n    return Array.from(this.gatewayConfigs.values())\n      .filter(gw => gw.is_enabled)\n      .map(gw => ({\n        id: gw.id,\n        name: gw.name,\n        is_enabled: gw.is_enabled,\n        mode: gw.mode,\n        allowed_channels: gw.allowed_channels,\n      }));\n  }\n\n  public saveGatewayConfig(updated: GatewaySecretConfig): void {\n    const existing = this.gatewayConfigs.get(updated.id);\n    if (!existing) {\n      this.gatewayConfigs.set(updated.id, { ...updated });\n      this.saveGatewaysToDisk();\n      return;\n    }\n\n    // Retain existing secret values if admin submitted masked placeholder\n    const merged: GatewaySecretConfig = {\n      ...existing,\n      ...updated,\n      api_key: this.unmaskValue(updated.api_key, existing.api_key),\n      app_key: this.unmaskValue(updated.app_key, existing.app_key),\n      app_secret: this.unmaskValue(updated.app_secret, existing.app_secret),\n      password: this.unmaskValue(updated.password, existing.password),\n      store_password: this.unmaskValue(updated.store_password, existing.store_password),\n      signature_key: this.unmaskValue(updated.signature_key, existing.signature_key),\n      private_key: this.unmaskValue(updated.private_key, existing.private_key),\n      pin_password: this.unmaskValue(updated.pin_password, existing.pin_password),\n      allowed_channels: updated.allowed_channels || existing.allowed_channels,\n    };\n\n    this.gatewayConfigs.set(updated.id, merged);\n    this.saveGatewaysToDisk();\n  }\n\n  public saveAllGatewayConfigs(configs: GatewaySecretConfig[]): void {\n    configs.forEach(c => {\n      const existing = this.gatewayConfigs.get(c.id);\n      if (!existing) {\n        this.gatewayConfigs.set(c.id, { ...c });\n      } else {\n        const merged: GatewaySecretConfig = {\n          ...existing,\n          ...c,\n          api_key: this.unmaskValue(c.api_key, existing.api_key),\n          app_key: this.unmaskValue(c.app_key, existing.app_key),\n          app_secret: this.unmaskValue(c.app_secret, existing.app_secret),\n          password: this.unmaskValue(c.password, existing.password),\n          store_password: this.unmaskValue(c.store_password, existing.store_password),\n          signature_key: this.unmaskValue(c.signature_key, existing.signature_key),\n          private_key: this.unmaskValue(c.private_key, existing.private_key),\n          pin_password: this.unmaskValue(c.pin_password, existing.pin_password),\n          allowed_channels: c.allowed_channels || existing.allowed_channels,\n        };\n        this.gatewayConfigs.set(c.id, merged);\n      }\n    });\n    this.saveGatewaysToDisk();\n  }\n\n  public getDefaultGateway(): string {\n    return this.defaultGateway;\n  }\n\n  public setDefaultGateway(gwId: string): void {\n    this.defaultGateway = gwId;\n    this.saveGatewaysToDisk();\n  }\n\n  private maskConfig(gw: GatewaySecretConfig): GatewaySecretConfig {\n    return {\n      ...gw,\n      api_key: gw.api_key ? '\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022' : '',\n      app_secret: gw.app_secret ? '\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022' : '',\n      password: gw.password ? '\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022' : '',\n      store_password: gw.store_password ? '\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022' : '',\n      signature_key: gw.signature_key ? '\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022' : '',\n      private_key: gw.private_key ? '\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022' : '',\n      pin_password: gw.pin_password ? '\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022' : '',\n    };\n  }\n\n  private unmaskValue(submitted?: string, existing?: string): string | undefined {\n    if (!submitted || submitted.includes('\u2022\u2022\u2022\u2022')) {\n      return existing;\n    }\n    return submitted;\n  }\n}\n\nexport const paymentStore = new PaymentStore();\n", "import fs from 'fs';\nimport path from 'path';\nimport { Listing } from '../types';\nimport { INITIAL_LISTINGS } from '../data/initialData';\nimport { ServerTransaction } from './payments/types';\n\nclass ServerListingsStore {\n  private listings: Map<string, Listing> = new Map();\n  private listingsDbPath: string = path.join(process.cwd(), 'data', 'listings_db.json');\n\n  constructor() {\n    this.loadFromDisk();\n  }\n\n  private loadFromDisk(): void {\n    try {\n      if (fs.existsSync(this.listingsDbPath)) {\n        const raw = fs.readFileSync(this.listingsDbPath, 'utf-8');\n        const data = JSON.parse(raw);\n        if (Array.isArray(data.listings) && data.listings.length > 0) {\n          this.listings.clear();\n          data.listings.forEach((item: Listing) => {\n            if (item && item.id) {\n              this.listings.set(item.id, item);\n            }\n          });\n          return;\n        }\n      }\n    } catch (e) {\n      console.warn('Could not read listings_db.json, seeding from INITIAL_LISTINGS:', e);\n    }\n\n    // Initialize with default demo listings\n    INITIAL_LISTINGS.forEach(item => {\n      this.listings.set(item.id, { ...item });\n    });\n    this.saveToDisk();\n  }\n\n  private saveToDisk(): void {\n    try {\n      const dir = path.dirname(this.listingsDbPath);\n      if (!fs.existsSync(dir)) {\n        fs.mkdirSync(dir, { recursive: true });\n      }\n      const data = {\n        version: 1,\n        total: this.listings.size,\n        updatedAt: new Date().toISOString(),\n        listings: Array.from(this.listings.values()),\n      };\n      fs.writeFileSync(this.listingsDbPath, JSON.stringify(data, null, 2), 'utf-8');\n    } catch (e) {\n      console.error('CRITICAL: Failed to persist listings_db.json to disk:', e);\n    }\n  }\n\n  /**\n   * Exact Ranking Logic Specification:\n   * Rule 1: Higher bid amount ranks higher (ORDER BY current_bid DESC).\n   * Rule 2: If equal bid amount, the user/listing who reached that bid FIRST ranks higher (ORDER BY last_bid_at ASC).\n   * Tie-breaker: Deterministic fallback by listing ID.\n   */\n  public sortListings(list: Listing[]): Listing[] {\n    return [...list].sort((a, b) => {\n      // 1. Higher bid amount ranks higher (current_bid DESC)\n      if (b.current_bid !== a.current_bid) {\n        return b.current_bid - a.current_bid;\n      }\n      // 2. Same bid amount -> earlier verified/accepted bid timestamp ranks higher (last_bid_at ASC)\n      const timeA = new Date(a.last_bid_at).getTime();\n      const timeB = new Date(b.last_bid_at).getTime();\n      if (timeA !== timeB) {\n        return timeA - timeB;\n      }\n      // Deterministic tie-breaker\n      return a.id.localeCompare(b.id);\n    });\n  }\n\n  /**\n   * Computes category ranks independently for all active listings.\n   * Returns a map of listingId -> category_rank (1..N within each category)\n   */\n  public getCategoryRankMap(): Record<string, number> {\n    const active = Array.from(this.listings.values()).filter(l => l.is_active);\n    const byCategory: Record<string, Listing[]> = {};\n\n    active.forEach(item => {\n      if (!byCategory[item.category_id]) {\n        byCategory[item.category_id] = [];\n      }\n      byCategory[item.category_id].push(item);\n    });\n\n    const rankMap: Record<string, number> = {};\n    Object.keys(byCategory).forEach(catId => {\n      const sorted = this.sortListings(byCategory[catId]);\n      sorted.forEach((item, index) => {\n        rankMap[item.id] = index + 1;\n      });\n    });\n\n    return rankMap;\n  }\n\n  /**\n   * Server-side Query API Endpoint Handler:\n   * 1. Filters active listings\n   * 2. Filters by category / time filter / search query\n   * 3. Sorts complete list using `current_bid DESC, last_bid_at ASC`\n   * 4. Assigns rank and category_rank BEFORE pagination\n   * 5. Paginates complete calculated rankings into 50 per page\n   */\n  public getRankedListings(options: {\n    categoryId?: string;\n    timeFilter?: string;\n    searchQuery?: string;\n    page?: number;\n    limit?: number;\n  }) {\n    const { categoryId, timeFilter, searchQuery, page = 1, limit = 50 } = options;\n\n    let active = Array.from(this.listings.values()).filter(l => l.is_active);\n\n    // Compute category ranks for ALL active listings prior to filtering\n    const categoryRankMap = this.getCategoryRankMap();\n\n    // 1. Time Filter\n    if (timeFilter === 'today') {\n      const now = new Date();\n      const startOfDay = new Date(now.getFullYear(), now.getMonth(), now.getDate()).getTime();\n      active = active.filter(item => {\n        const itemDate = new Date(item.last_bid_at).getTime();\n        return itemDate >= startOfDay || item.current_bid >= 3000;\n      });\n    }\n\n    // 2. Category Filter (Independent Category Ranking)\n    if (categoryId && categoryId !== 'all') {\n      active = active.filter(item => item.category_id === categoryId);\n    }\n\n    // 3. Search Query Filter\n    if (searchQuery && searchQuery.trim()) {\n      const q = searchQuery.trim().toLowerCase();\n      active = active.filter(item =>\n        item.name.toLowerCase().includes(q) ||\n        (item.category_name && item.category_name.toLowerCase().includes(q)) ||\n        (item.url && item.url.toLowerCase().includes(q)) ||\n        (item.facebook_url && item.facebook_url.toLowerCase().includes(q))\n      );\n    }\n\n    // 4. Sort according to EXACT ranking rules: current_bid DESC, last_bid_at ASC\n    const sorted = this.sortListings(active);\n\n    // 5. Assign rank 1..N to the full sorted set BEFORE pagination\n    const ranked = sorted.map((item, index) => ({\n      ...item,\n      rank: index + 1,\n      category_rank: categoryRankMap[item.id] || (index + 1),\n    }));\n\n    // 6. Divide into pages (50 per page) AFTER complete ranking calculation\n    const total = ranked.length;\n    const totalPages = Math.ceil(total / limit) || 1;\n    const currentPage = Math.max(1, Math.min(page, totalPages));\n    const startIndex = (currentPage - 1) * limit;\n    const paginatedListings = ranked.slice(startIndex, startIndex + limit);\n\n    return {\n      success: true,\n      listings: paginatedListings,\n      allRankedListings: ranked,\n      categoryRankMap,\n      total,\n      page: currentPage,\n      limit,\n      totalPages,\n    };\n  }\n\n  /**\n   * Atomically process a verified bid/payment on the server.\n   * Assigns exact server timestamp for `last_bid_at` when accepted.\n   */\n  public processVerifiedBid(txn: ServerTransaction): Listing {\n    const serverTimestamp = txn.paid_at || txn.updated_at || new Date().toISOString();\n    const bidAmount = Number(txn.amount);\n\n    // Only update if exact listing_id explicitly exists in store\n    let existing: Listing | undefined;\n    if (txn.listing_id && this.listings.has(txn.listing_id)) {\n      existing = this.listings.get(txn.listing_id);\n    }\n\n    if (existing) {\n      // Update existing listing with new verified bid amount and server timestamp\n      const updatedListing: Listing = {\n        ...existing,\n        name: txn.listing_name || existing.name,\n        image_url: txn.listing_image || existing.image_url,\n        facebook_url: txn.facebook_url || existing.facebook_url || txn.listing_url || existing.url || '',\n        website_url: txn.website_url || existing.website_url || '',\n        url: txn.listing_url || existing.url,\n        current_bid: Math.max(existing.current_bid, bidAmount),\n        category_id: txn.category_id || existing.category_id,\n        updated_at: serverTimestamp,\n        last_bid_at: serverTimestamp, // RECORD EXACT SERVER TIMESTAMP FOR ACCEPTED BID\n      };\n      this.listings.set(existing.id, updatedListing);\n      this.saveToDisk();\n      return updatedListing;\n    } else {\n      // Create new listing record with exact server timestamp\n      const newListingId = txn.listing_id || `list_${Date.now()}_${Math.floor(1000 + Math.random() * 9000)}`;\n      const finalFb = txn.facebook_url || txn.listing_url || 'https://facebook.com';\n      const finalWeb = txn.website_url || '';\n\n      const newListing: Listing = {\n        id: newListingId,\n        name: txn.listing_name.trim(),\n        image_url: txn.listing_image || 'https://images.unsplash.com/photo-1618005182384-a83a8bd57fbe?w=200&auto=format&fit=crop&q=80',\n        facebook_url: finalFb,\n        website_url: finalWeb,\n        url: txn.listing_url || finalFb,\n        category_id: txn.category_id || 'cat_biz',\n        category_name: txn.category_name || 'Business',\n        current_bid: bidAmount,\n        clicks: 0,\n        hearts: 0,\n        is_active: true,\n        created_at: serverTimestamp,\n        updated_at: serverTimestamp,\n        last_bid_at: serverTimestamp, // RECORD EXACT SERVER TIMESTAMP FOR ACCEPTED BID\n      };\n\n      this.listings.set(newListingId, newListing);\n      this.saveToDisk();\n      return newListing;\n    }\n  }\n\n  public getAllListings(): Listing[] {\n    return this.sortListings(Array.from(this.listings.values()));\n  }\n\n  public getListing(id: string): Listing | undefined {\n    return this.listings.get(id);\n  }\n\n  public saveListing(listingData: Partial<Listing>): Listing {\n    const serverTimestamp = new Date().toISOString();\n    let listing: Listing;\n\n    if (listingData.id && this.listings.has(listingData.id)) {\n      const existing = this.listings.get(listingData.id)!;\n      listing = {\n        ...existing,\n        ...listingData,\n        updated_at: serverTimestamp,\n        // Update last_bid_at if bid amount changed or if explicitly provided\n        last_bid_at: (listingData.current_bid !== undefined && listingData.current_bid !== existing.current_bid)\n          ? (listingData.last_bid_at || serverTimestamp)\n          : (listingData.last_bid_at || existing.last_bid_at),\n      };\n    } else {\n      const newId = listingData.id || `list_${Date.now()}_${Math.floor(1000 + Math.random() * 9000)}`;\n      listing = {\n        id: newId,\n        name: listingData.name || 'New Listing',\n        image_url: listingData.image_url || 'https://images.unsplash.com/photo-1542838132-92c53300491e?w=200&auto=format&fit=crop&q=80',\n        facebook_url: listingData.facebook_url || listingData.url || 'https://facebook.com',\n        website_url: listingData.website_url || '',\n        url: listingData.url || listingData.facebook_url || 'https://facebook.com',\n        category_id: listingData.category_id || 'cat_biz',\n        category_name: listingData.category_name || 'Business',\n        current_bid: Number(listingData.current_bid) || 100,\n        clicks: Number(listingData.clicks) || 0,\n        hearts: Number(listingData.hearts) || 0,\n        is_active: listingData.is_active !== undefined ? listingData.is_active : true,\n        created_at: listingData.created_at || serverTimestamp,\n        updated_at: serverTimestamp,\n        last_bid_at: listingData.last_bid_at || serverTimestamp,\n      };\n    }\n\n    this.listings.set(listing.id, listing);\n    this.saveToDisk();\n    return listing;\n  }\n\n  public deleteListing(id: string): boolean {\n    const deleted = this.listings.delete(id);\n    if (deleted) {\n      this.saveToDisk();\n    }\n    return deleted;\n  }\n\n  public incrementClicks(id: string): Listing | null {\n    const listing = this.listings.get(id);\n    if (!listing) return null;\n    listing.clicks += 1;\n    this.listings.set(id, listing);\n    this.saveToDisk();\n    return listing;\n  }\n\n  public incrementHearts(id: string): Listing | null {\n    const listing = this.listings.get(id);\n    if (!listing) return null;\n    listing.hearts += 1;\n    this.listings.set(id, listing);\n    this.saveToDisk();\n    return listing;\n  }\n}\n\nexport const serverListingsStore = new ServerListingsStore();\n", "import {\n  Category,\n  Listing,\n  MenuItem,\n  SiteSettings,\n  DesignSettings,\n  FrontendTexts,\n  DeveloperProfile,\n  FloatingScrollPopup,\n  ContentPage,\n  GatewayConfig,\n  PaymentTransaction\n} from '../types';\n\nexport const INITIAL_CATEGORIES: Category[] = [\n  { id: 'cat_all', name: 'All Categories', slug: 'all', display_order: 0, is_active: true },\n  { id: 'cat_biz', name: 'Business', slug: 'business', icon: 'Briefcase', display_order: 1, is_active: true },\n  { id: 'cat_creator', name: 'Content Creator', slug: 'content-creator', icon: 'Video', display_order: 2, is_active: true },\n  { id: 'cat_influencer', name: 'Influencer', slug: 'influencer', icon: 'Sparkles', display_order: 3, is_active: true },\n  { id: 'cat_startup', name: 'Startup', slug: 'startup', icon: 'Rocket', display_order: 4, is_active: true },\n  { id: 'cat_ecom', name: 'E-commerce', slug: 'ecommerce', icon: 'ShoppingBag', display_order: 5, is_active: true },\n  { id: 'cat_dev', name: 'Developer', slug: 'developer', icon: 'Code', display_order: 6, is_active: true },\n  { id: 'cat_agency', name: 'Agency', slug: 'agency', icon: 'Building', display_order: 7, is_active: true },\n  { id: 'cat_software', name: 'Software & App', slug: 'software', icon: 'Cpu', display_order: 8, is_active: true },\n  { id: 'cat_gaming', name: 'Gaming', slug: 'gaming', icon: 'Gamepad2', display_order: 9, is_active: true },\n  { id: 'cat_media', name: 'Media / News', slug: 'media', icon: 'Newspaper', display_order: 10, is_active: true },\n  { id: 'cat_edu', name: 'Education', slug: 'education', icon: 'GraduationCap', display_order: 11, is_active: true },\n  { id: 'cat_brand', name: 'Brand', slug: 'brand', icon: 'Award', display_order: 12, is_active: true },\n  { id: 'cat_social', name: 'Social Profile', slug: 'social-profile', icon: 'Share2', display_order: 13, is_active: true },\n  { id: 'cat_other', name: 'Other', slug: 'other', icon: 'MoreHorizontal', display_order: 14, is_active: true },\n];\n\nexport const INITIAL_LISTINGS: Listing[] = [\n  {\n    id: 'list_1',\n    name: 'Chaldal Online Grocery',\n    image_url: 'https://images.unsplash.com/photo-1542838132-92c53300491e?w=200&auto=format&fit=crop&q=80',\n    facebook_url: 'https://facebook.com/chaldal',\n    website_url: 'https://chaldal.com',\n    url: 'https://chaldal.com',\n    category_id: 'cat_ecom',\n    category_name: 'E-commerce',\n    current_bid: 25000,\n    clicks: 1420,\n    hearts: 890,\n    is_active: true,\n    created_at: '2026-08-20T10:00:00Z',\n    updated_at: '2026-08-24T18:45:00Z',\n    last_bid_at: '2026-08-24T18:45:00Z',\n  },\n  {\n    id: 'list_2',\n    name: 'Pathao Super App',\n    image_url: 'https://images.unsplash.com/photo-1526367790999-0150786686a2?w=200&auto=format&fit=crop&q=80',\n    facebook_url: 'https://facebook.com/pathao.org',\n    website_url: 'https://pathao.com',\n    url: 'https://pathao.com',\n    category_id: 'cat_startup',\n    category_name: 'Startup',\n    current_bid: 18500,\n    clicks: 1120,\n    hearts: 742,\n    is_active: true,\n    created_at: '2026-08-21T12:00:00Z',\n    updated_at: '2026-08-24T15:20:00Z',\n    last_bid_at: '2026-08-24T15:20:00Z',\n  },\n  {\n    id: 'list_3',\n    name: 'Rafsan The ChotoBhai',\n    image_url: 'https://images.unsplash.com/photo-1534528741775-53994a69daeb?w=200&auto=format&fit=crop&q=80',\n    facebook_url: 'https://facebook.com/rafsan.chotobhai',\n    website_url: 'https://youtube.com',\n    url: 'https://youtube.com',\n    category_id: 'cat_creator',\n    category_name: 'Content Creator',\n    current_bid: 14200,\n    clicks: 980,\n    hearts: 630,\n    is_active: true,\n    created_at: '2026-08-22T08:30:00Z',\n    updated_at: '2026-08-24T12:10:00Z',\n    last_bid_at: '2026-08-24T12:10:00Z',\n  },\n  {\n    id: 'list_4',\n    name: 'ShopUp B2B Commerce',\n    image_url: 'https://images.unsplash.com/photo-1460925895917-afdab827c52f?w=200&auto=format&fit=crop&q=80',\n    facebook_url: 'https://facebook.com/shopup',\n    website_url: 'https://shopup.org',\n    url: 'https://shopup.org',\n    category_id: 'cat_biz',\n    category_name: 'Business',\n    current_bid: 11000,\n    clicks: 740,\n    hearts: 480,\n    is_active: true,\n    created_at: '2026-08-22T14:00:00Z',\n    updated_at: '2026-08-24T09:00:00Z',\n    last_bid_at: '2026-08-24T09:00:00Z',\n  },\n  {\n    id: 'list_5',\n    name: 'Shikho EdTech BD',\n    image_url: 'https://images.unsplash.com/photo-1503676260728-1c00da094a0b?w=200&auto=format&fit=crop&q=80',\n    facebook_url: 'https://facebook.com/shikho',\n    website_url: 'https://shikho.com',\n    url: 'https://shikho.com',\n    category_id: 'cat_edu',\n    category_name: 'Education',\n    current_bid: 8800,\n    clicks: 610,\n    hearts: 395,\n    is_active: true,\n    created_at: '2026-08-23T09:15:00Z',\n    updated_at: '2026-08-23T19:30:00Z',\n    last_bid_at: '2026-08-23T19:30:00Z',\n  },\n  {\n    id: 'list_6',\n    name: 'DevArafat - Full Stack Dev',\n    image_url: 'https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=200&auto=format&fit=crop&q=80',\n    facebook_url: 'https://facebook.com/dev.arafat',\n    website_url: 'https://github.com',\n    url: 'https://github.com',\n    category_id: 'cat_dev',\n    category_name: 'Developer',\n    current_bid: 6500,\n    clicks: 520,\n    hearts: 360,\n    is_active: true,\n    created_at: '2026-08-23T11:00:00Z',\n    updated_at: '2026-08-24T04:20:00Z',\n    last_bid_at: '2026-08-24T04:20:00Z',\n  },\n  {\n    id: 'list_7',\n    name: 'ByteLabs Digital Agency',\n    image_url: 'https://images.unsplash.com/photo-1551836022-d5d88e9218df?w=200&auto=format&fit=crop&q=80',\n    facebook_url: 'https://facebook.com/bytelabs',\n    website_url: 'https://bytelabs.dev',\n    url: 'https://bytelabs.dev',\n    category_id: 'cat_agency',\n    category_name: 'Agency',\n    current_bid: 5200,\n    clicks: 410,\n    hearts: 290,\n    is_active: true,\n    created_at: '2026-08-23T15:00:00Z',\n    updated_at: '2026-08-23T22:00:00Z',\n    last_bid_at: '2026-08-23T22:00:00Z',\n  },\n  {\n    id: 'list_8',\n    name: 'GameOn BD Stream',\n    image_url: 'https://images.unsplash.com/photo-1560253023-3ec5d502959f?w=200&auto=format&fit=crop&q=80',\n    facebook_url: 'https://facebook.com/gameonbd',\n    website_url: '',\n    url: 'https://facebook.com',\n    category_id: 'cat_gaming',\n    category_name: 'Gaming',\n    current_bid: 4300,\n    clicks: 385,\n    hearts: 215,\n    is_active: true,\n    created_at: '2026-08-24T02:00:00Z',\n    updated_at: '2026-08-24T08:00:00Z',\n    last_bid_at: '2026-08-24T08:00:00Z',\n  },\n  {\n    id: 'list_9',\n    name: 'TechTalk Bangladesh',\n    image_url: 'https://images.unsplash.com/photo-1585829365295-ab7cd400c167?w=200&auto=format&fit=crop&q=80',\n    facebook_url: 'https://facebook.com/techtalkbd',\n    website_url: 'https://techtalk.com.bd',\n    url: 'https://techtalk.com.bd',\n    category_id: 'cat_media',\n    category_name: 'Media / News',\n    current_bid: 3600,\n    clicks: 310,\n    hearts: 180,\n    is_active: true,\n    created_at: '2026-08-24T06:30:00Z',\n    updated_at: '2026-08-24T07:15:00Z',\n    last_bid_at: '2026-08-24T07:15:00Z',\n  },\n  {\n    id: 'list_10',\n    name: 'Aarong Lifestyle',\n    image_url: 'https://images.unsplash.com/photo-1441986300917-64674bd600d8?w=200&auto=format&fit=crop&q=80',\n    facebook_url: 'https://facebook.com/aarong',\n    website_url: 'https://aarong.com',\n    url: 'https://aarong.com',\n    category_id: 'cat_brand',\n    category_name: 'Brand',\n    current_bid: 2900,\n    clicks: 295,\n    hearts: 165,\n    is_active: true,\n    created_at: '2026-08-24T07:00:00Z',\n    updated_at: '2026-08-24T07:00:00Z',\n    last_bid_at: '2026-08-24T07:00:00Z',\n  },\n  {\n    id: 'list_11',\n    name: 'Samiha Vlogs',\n    image_url: 'https://images.unsplash.com/photo-1494790108377-be9c29b29330?w=200&auto=format&fit=crop&q=80',\n    facebook_url: 'https://facebook.com/samiha.vlogs',\n    website_url: 'https://instagram.com',\n    url: 'https://instagram.com',\n    category_id: 'cat_influencer',\n    category_name: 'Influencer',\n    current_bid: 2100,\n    clicks: 220,\n    hearts: 140,\n    is_active: true,\n    created_at: '2026-08-24T08:00:00Z',\n    updated_at: '2026-08-24T08:00:00Z',\n    last_bid_at: '2026-08-24T08:00:00Z',\n  },\n  {\n    id: 'list_12',\n    name: 'TaskBD productivity suite',\n    image_url: 'https://images.unsplash.com/photo-1484480974693-6ca0a78fb36b?w=200&auto=format&fit=crop&q=80',\n    facebook_url: 'https://facebook.com/taskbd',\n    website_url: 'https://taskbd.app',\n    url: 'https://taskbd.app',\n    category_id: 'cat_software',\n    category_name: 'Software & App',\n    current_bid: 1500,\n    clicks: 180,\n    hearts: 95,\n    is_active: true,\n    created_at: '2026-08-24T09:30:00Z',\n    updated_at: '2026-08-24T09:30:00Z',\n    last_bid_at: '2026-08-24T09:30:00Z',\n  }\n];\n\nexport const INITIAL_PAYMENTS: PaymentTransaction[] = [\n  {\n    id: 'pay_1',\n    transaction_id: 'TXN-BKASH-9821387',\n    listing_id: 'list_1',\n    listing_name: 'Chaldal Online Grocery',\n    facebook_url: 'https://facebook.com/chaldal',\n    website_url: 'https://chaldal.com',\n    listing_url: 'https://chaldal.com',\n    listing_image: 'https://images.unsplash.com/photo-1542838132-92c53300491e?w=200&auto=format&fit=crop&q=80',\n    category_id: 'cat_ecom',\n    amount: 25000,\n    gateway: 'bkash',\n    mode: 'live',\n    status: 'success',\n    created_at: '2026-08-24T18:45:00Z',\n    verified_at: '2026-08-24T18:45:04Z',\n  },\n  {\n    id: 'pay_2',\n    transaction_id: 'TXN-NAGAD-4412098',\n    listing_id: 'list_2',\n    listing_name: 'Pathao Super App',\n    facebook_url: 'https://facebook.com/pathao.org',\n    website_url: 'https://pathao.com',\n    listing_url: 'https://pathao.com',\n    listing_image: 'https://images.unsplash.com/photo-1526367790999-0150786686a2?w=200&auto=format&fit=crop&q=80',\n    category_id: 'cat_startup',\n    amount: 18500,\n    gateway: 'nagad',\n    mode: 'live',\n    status: 'success',\n    created_at: '2026-08-24T15:20:00Z',\n    verified_at: '2026-08-24T15:20:03Z',\n  },\n  {\n    id: 'pay_3',\n    transaction_id: 'TXN-SSL-8712390',\n    listing_id: 'list_3',\n    listing_name: 'Rafsan The ChotoBhai',\n    facebook_url: 'https://facebook.com/rafsan.chotobhai',\n    website_url: 'https://youtube.com',\n    listing_url: 'https://youtube.com',\n    listing_image: 'https://images.unsplash.com/photo-1534528741775-53994a69daeb?w=200&auto=format&fit=crop&q=80',\n    category_id: 'cat_creator',\n    amount: 14200,\n    gateway: 'sslcommerz',\n    mode: 'live',\n    status: 'success',\n    created_at: '2026-08-24T12:10:00Z',\n    verified_at: '2026-08-24T12:10:06Z',\n  }\n];\n\nexport const INITIAL_MENU_ITEMS: MenuItem[] = [\n  { id: 'menu_1', title: 'Home', url: '/', location: 'both', target: '_self', display_order: 1, is_active: true, description: 'Return to live ranking leaderboard' },\n  { id: 'menu_2', title: 'Rules', url: '#rules', location: 'both', target: '_self', display_order: 2, is_active: true, description: 'Official outbid rules and marketplace guidelines' },\n  { id: 'menu_3', title: 'Live Stats', url: '#stats', location: 'both', target: '_self', display_order: 3, is_active: true, description: 'Real-time analytics and volume statistics' },\n  { id: 'menu_4', title: 'Terms', url: '#terms', location: 'footer', target: '_self', display_order: 4, is_active: true, description: 'Terms of service and usage policy' },\n  { id: 'menu_5', title: 'Privacy', url: '#privacy', location: 'footer', target: '_self', display_order: 5, is_active: true, description: 'Privacy and data protection agreement' },\n];\n\nexport const INITIAL_SETTINGS: SiteSettings = {\n  site_name: 'TOPBD',\n  site_subtitle: \"Bangladesh's Live Ranking & Outbid Marketplace\",\n  site_url: 'https://topbd.app',\n  currency_symbol: '\u09F3',\n  minimum_bid_increment: 1,\n  initial_minimum_bid: 10,\n  visitor_timeout_seconds: 180,\n  pagination_size: 50,\n  maintenance_mode: false,\n  translation_enabled: true,\n  default_language: 'en',\n  seo_title: \"TOPBD \u2014 Bangladesh's Live Ranking & Outbid Marketplace\",\n  seo_description: \"The official live outbid leaderboard for Bangladesh. Compete, outbid, and claim #1 spot across business, creators, startups, and websites.\",\n  seo_og_image: 'https://images.unsplash.com/photo-1618005182384-a83a8bd57fbe?w=1200&auto=format&fit=crop&q=80',\n  favicon_url: '/favicon.ico',\n  show_footer_admin_button: true,\n  custom_css: '',\n};\n\nexport const INITIAL_DESIGN: DesignSettings = {\n  primary_color: '#006A4E', // Bangladesh Forest Green\n  secondary_color: '#F42A41', // Bangladesh Red Accent\n  background_color: '#0A0D0F', // Sleek modern dark mode\n  card_color: '#13181D',\n  text_color: '#F0F4F8',\n  muted_text_color: '#8A99A8',\n  border_color: '#222A33',\n  accent_color: '#F59E0B', // Amber Gold for Rank #1\n  button_color: '#006A4E',\n  button_text_color: '#FFFFFF',\n  rank1_bg: '#1C2422', // Subtle forest amber tint for #1\n  rank1_border: '#EAB308',\n  rank2_bg: '#171E24',\n  rank3_bg: '#141B20',\n  header_bg: '#0A0D0FEE',\n  footer_bg: '#07090B',\n  footer_text_color: '#A8A29E',\n  footer_link_color: '#E07A5F',\n  footer_link_hover_color: '#F29479',\n  border_radius: '10px',\n  font_family: 'system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n  logo_url: '',\n  custom_css: '',\n};\n\nexport const INITIAL_TEXTS: FrontendTexts = {\n  site_logo_text: 'TOPBD',\n  live_ranking_badge: 'LIVE RANKING',\n  tab_all_time: 'ALL TIME',\n  tab_today: 'TODAY',\n  visitor_badge_prefix: 'visitors',\n  claim_hero_title: 'Claim #1 for',\n  claim_hero_desc: \"The public live outbid leaderboard of Bangladesh. Outbid the top spots to drive instant visibility and traffic to your business, channel, startup, or personal brand.\",\n  category_all: 'ALL',\n  category_more: 'More Categories',\n  outbid_btn_text: 'OUTBID',\n  current_bid_label: 'Current Bid',\n  next_bid_label: 'Next Bid',\n  additional_amount_label: 'Additional amount',\n  payment_method_label: 'Select Payment Gateway',\n  modal_target_label: 'TARGET',\n  modal_name_placeholder: 'Business, product or personal name',\n  modal_url_placeholder: 'https://yourwebsite.com or social profile',\n  total_generated_prefix: 'TOPBD has generated',\n  total_generated_suffix: 'in verified bids since launch',\n  developer_popup_title: 'Built by',\n  developer_popup_handle: '@arafat',\n  developer_popup_bio: 'Software engineer building real-time high-performance web applications and ranking engines in Bangladesh.',\n  footer_attribution: 'Built by @jonathan_wilke',\n  footer_brand_tagline: '\u00B7 Brought to you by supastarter.dev',\n  footer_author_name: '@jonathan_wilke',\n  footer_author_url: '',\n  footer_sponsor_text: 'supastarter.dev',\n  footer_sponsor_url: 'https://supastarter.dev',\n  footer_domain_name: 'outbid.lol',\n  footer_domain_rating: '32',\n  footer_domain_label: 'CERTIFIED DOMAIN RATING',\n  footer_domain_url: '',\n  footer_show_rating_badge: true,\n};\n\nexport const INITIAL_DEVELOPER: DeveloperProfile = {\n  name: 'Jonathan Wilke',\n  handle: '@jonathanwilke',\n  image_url: 'https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=200&auto=format&fit=crop&q=80',\n  bio: 'Creator of high-performance ranking engines, boilerplates, and developer tools.',\n  website_url: 'https://supastarter.dev',\n  twitter_url: 'https://x.com/jonathan_wilke',\n  github_url: 'https://github.com',\n  is_enabled: true,\n};\n\nexport const INITIAL_SCROLL_POPUP: FloatingScrollPopup = {\n  is_enabled: true,\n  scroll_threshold_percent: 20,\n  prefix_text: 'Built by',\n  prefix_color: '#64748B',\n  author_text: '@jonathanwilke',\n  author_color: '#E07A5F',\n  bg_color: '#FFFFFF',\n  border_color: '#F4ECE7',\n  avatar_image_url: 'https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=200&auto=format&fit=crop&q=80',\n  target_url: '',\n  show_close_button: true,\n};\n\nexport const INITIAL_GATEWAYS: GatewayConfig[] = [\n  {\n    id: 'bkash',\n    name: 'bKash Merchant Payment',\n    is_enabled: true,\n    mode: 'test',\n    merchant_id: '01700000000',\n    username: 'sandbox_bkash_user',\n    password: 'sandbox_bkash_password',\n    app_key: 'bkash_app_key_test_123',\n    app_secret: 'bkash_secret_test_456',\n    api_url: 'https://tokenized.sandbox.bka.sh/v1.2.0-beta',\n    callback_url: '/payments/bkash/callback.php',\n  },\n  {\n    id: 'nagad',\n    name: 'Nagad Direct Pay',\n    is_enabled: true,\n    mode: 'test',\n    merchant_id: '683002007104',\n    app_key: 'nagad_public_key_test',\n    app_secret: 'nagad_private_key_test',\n    api_url: 'https://api-sandbox.nagad.com.bd',\n    callback_url: '/payments/nagad/callback.php',\n  },\n  {\n    id: 'rocket',\n    name: 'DBBL Rocket Pay',\n    is_enabled: true,\n    mode: 'test',\n    merchant_id: '019000000009',\n    app_key: 'rocket_terminal_key_test',\n    api_url: 'https://rocket.dutchbanglabank.com/api',\n    callback_url: '/payments/rocket/callback.php',\n  },\n  {\n    id: 'sslcommerz',\n    name: 'SSLCommerz (Cards & MFS)',\n    is_enabled: true,\n    mode: 'test',\n    store_id: 'topbd_testbox',\n    password: 'topbd_test_password',\n    api_url: 'https://sandbox.sslcommerz.com',\n    callback_url: '/payments/sslcommerz/callback.php',\n  },\n  {\n    id: 'shurjopay',\n    name: 'shurjoPay Merchant Payment',\n    is_enabled: true,\n    mode: 'test',\n    merchant_id: 'sp_test_merchant',\n    username: 'sp_user',\n    password: 'sp_password',\n    api_url: 'https://sandbox.shurjopayment.com',\n    callback_url: '/payments/shurjopay/callback.php',\n  },\n  {\n    id: 'aamarpay',\n    name: 'aamarPay Merchant Gateway',\n    is_enabled: true,\n    mode: 'test',\n    store_id: 'aamarpaytest',\n    signature_key: 'dbb74892e8241a45a7f0144916d6664e',\n    api_url: 'https://sandbox.aamarpay.com',\n    success_url: '/api/payments/aamarpay/callback',\n    fail_url: '/api/payments/aamarpay/callback',\n    cancel_url: '/api/payments/aamarpay/callback',\n    ipn_url: '/api/payments/aamarpay/ipn',\n    callback_url: '/api/payments/aamarpay/callback',\n    session_timeout: 15,\n    allowed_channels: ['cards', 'bkash', 'nagad', 'rocket', 'internet_banking'],\n  },\n  {\n    id: 'uddoktapay',\n    name: 'UddoktaPay Automated PGW',\n    is_enabled: true,\n    mode: 'test',\n    api_key: '',\n    api_url: 'https://sandbox.uddoktapay.com',\n    callback_url: '/api/payments/uddoktapay/callback',\n    success_url: '/api/payments/uddoktapay/callback',\n    cancel_url: '/api/payments/uddoktapay/callback?status=cancelled',\n    ipn_url: '/api/payments/uddoktapay/ipn',\n    webhook_url: '/api/payments/uddoktapay/ipn',\n    allowed_channels: ['bkash', 'nagad', 'rocket', 'upay', 'cards'],\n  },\n];\n\nexport const INITIAL_PAGES: ContentPage[] = [\n  {\n    id: 'rules',\n    title: 'Ranking & Outbid Rules',\n    slug: 'rules',\n    content: `# TOPBD Ranking & Outbid Rules\n\n1. **How Ranking Works**: Listings are ranked strictly in descending order of their verified bid amount (Highest bid = Rank #1).\n2. **Next Minimum Bid**: To outbid any position, your new bid must be at least \u09F31 higher than the target candidate's current bid.\n3. **Deterministic Tie-Breaking**: In the event of identical bids, the more recent verified bid is placed higher.\n4. **Permanent vs Daily Leaderboards**:\n   - **ALL TIME**: Displays all-time cumulative bids placed since platform inception.\n   - **TODAY**: Displays the fastest rising bids placed within the current calendar day (BST timezone).\n5. **No Duplicate Listings**: Submitting a bid for an existing URL/handle automatically outbids and moves that same listing up the board.\n6. **Integrity & Verification**: Every bid must undergo rigorous server-side payment verification before reflecting on the leaderboard.\n7. **Prohibited Content**: Listings promoting illegal activities, hate speech, explicit content, or phishing will be removed immediately without refund.`,\n    updated_at: '2026-08-24T12:00:00Z',\n  },\n  {\n    id: 'terms',\n    title: 'Terms of Service',\n    slug: 'terms',\n    content: `# TOPBD Terms of Service\n\nLast Updated: August 2026\n\n### 1. Acceptance of Terms\nBy placing a bid, listing an entity, or browsing TOPBD, you agree to comply with and be bound by these Terms of Service.\n\n### 2. Service Description\nTOPBD is a public live ranking and outbid marketplace operating in Bangladesh, providing public promotional placement based on competitive bidding.\n\n### 3. Non-Refundable Bidding Fees\nAll payment transactions submitted for bids and ranking placement are immediately committed to the public leaderboard upon verification. All bids are final and non-refundable once verified by the payment gateway.\n\n### 4. Listing Content & Rights\nYou represent that you own or have lawful rights to the trademarks, URLs, and logos submitted in your listing. TOPBD reserves the right to moderate, hide, or ban any listing violating local regulations.\n\n### 5. Disclaimer of Warranties\nLeaderboard ranks are dynamic and may change at any second when another user places a higher verified bid. Placement at any specific rank is not guaranteed for any specific duration.`,\n    updated_at: '2026-08-24T12:00:00Z',\n  },\n  {\n    id: 'privacy',\n    title: 'Privacy Policy',\n    slug: 'privacy',\n    content: `# TOPBD Privacy Policy\n\n### 1. Information We Collect\n- **Public Listing Details**: Profile image, name, category, and target URL submitted by you.\n- **Transaction Information**: Payment gateway transaction ID, amount, and timestamp. We **never** store sensitive payment PINs, OTPs, or credit card numbers.\n- **Session & Analytics Data**: Anonymous IP hashing, session heartbeat timestamps for live visitor counting, and aggregated click/heart events.\n\n### 2. How Information is Used\n- To display your listing publicly on the live ranking leaderboard.\n- To verify payment authenticity with official Bangladeshi payment gateways (bKash, Nagad, Rocket, SSLCommerz, shurjoPay).\n- To prevent spam, bot voting, and automated click fraud.\n\n### 3. Data Protection\nWe employ TLS encryption, PDO prepared statements, and rigorous server-side validation to protect transaction integrity.`,\n    updated_at: '2026-08-24T12:00:00Z',\n  },\n  {\n    id: 'stats',\n    title: 'Live System Statistics',\n    slug: 'stats',\n    content: `# TOPBD Live System Statistics\n\nLive transparency for the Bangladesh outbid ecosystem:\n- Real-time visitor polling with 180-second session heartbeat timeout.\n- Instant transaction idempotency protection.\n- High-efficiency database query engine with pagination and sub-millisecond ranking indexing.`,\n    updated_at: '2026-08-24T12:00:00Z',\n  },\n];\n", "import { GatewaySecretConfig, ServerTransaction } from './types';\n\nexport class BkashService {\n  /**\n   * Determine bKash base URL based on mode and custom api_url\n   */\n  private static getBaseUrl(config: GatewaySecretConfig): string {\n    if (config.api_url && config.api_url.trim()) {\n      return config.api_url.trim().replace(/\\/+$/, '');\n    }\n    return config.mode === 'live'\n      ? 'https://tokenized.pay.bka.sh/v1.2.0-beta/tokenized/checkout'\n      : 'https://tokenized.sandbox.bka.sh/v1.2.0-beta/tokenized/checkout';\n  }\n\n  /**\n   * Request bKash Grant Token (Server-to-Server Authentication)\n   */\n  public static async grantToken(config: GatewaySecretConfig): Promise<string | null> {\n    if (!config.app_key || !config.app_secret || !config.username || !config.password) {\n      return null;\n    }\n\n    try {\n      const baseUrl = this.getBaseUrl(config);\n      const res = await fetch(`${baseUrl}/token/grant`, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n          username: config.username,\n          password: config.password,\n        },\n        body: JSON.stringify({\n          app_key: config.app_key,\n          app_secret: config.app_secret,\n        }),\n      });\n\n      if (!res.ok) {\n        return null;\n      }\n\n      const data: any = await res.json();\n      return data.id_token || null;\n    } catch {\n      return null;\n    }\n  }\n\n  /**\n   * Create Payment with bKash API\n   */\n  public static async createPayment(\n    config: GatewaySecretConfig,\n    txn: ServerTransaction,\n    callbackUrl: string\n  ): Promise<{ success: boolean; paymentId?: string; bkashURL?: string; message?: string }> {\n    // If in Live mode, require actual credentials\n    if (config.mode === 'live') {\n      const token = await this.grantToken(config);\n      if (!token) {\n        return {\n          success: false,\n          message: 'bKash authentication failed. Please check live credentials in Admin Panel.',\n        };\n      }\n\n      try {\n        const baseUrl = this.getBaseUrl(config);\n        const res = await fetch(`${baseUrl}/create`, {\n          method: 'POST',\n          headers: {\n            'Content-Type': 'application/json',\n            Authorization: token,\n            'X-APP-Key': config.app_key || '',\n          },\n          body: JSON.stringify({\n            mode: '0011',\n            payerReference: txn.listing_id,\n            callbackURL: callbackUrl,\n            amount: txn.amount.toString(),\n            currency: 'BDT',\n            intent: 'sale',\n            merchantInvoiceNumber: txn.transaction_id,\n          }),\n        });\n\n        const data: any = await res.json();\n        if (data.statusCode === '0000' && data.bkashURL) {\n          return {\n            success: true,\n            paymentId: data.paymentID,\n            bkashURL: data.bkashURL,\n          };\n        }\n\n        return {\n          success: false,\n          message: data.statusMessage || 'bKash payment initialization rejected.',\n        };\n      } catch (err: any) {\n        return {\n          success: false,\n          message: err.message || 'Failed to connect to bKash live API.',\n        };\n      }\n    }\n\n    // In Sandbox / Test Mode:\n    // If real sandbox token is obtainable, use live sandbox; otherwise return sandbox interactive simulation URL\n    const token = await this.grantToken(config);\n    if (token) {\n      try {\n        const baseUrl = this.getBaseUrl(config);\n        const res = await fetch(`${baseUrl}/create`, {\n          method: 'POST',\n          headers: {\n            'Content-Type': 'application/json',\n            Authorization: token,\n            'X-APP-Key': config.app_key || '',\n          },\n          body: JSON.stringify({\n            mode: '0011',\n            payerReference: txn.listing_id,\n            callbackURL: callbackUrl,\n            amount: txn.amount.toString(),\n            currency: 'BDT',\n            intent: 'sale',\n            merchantInvoiceNumber: txn.transaction_id,\n          }),\n        });\n\n        const data: any = await res.json();\n        if (data.statusCode === '0000' && data.bkashURL) {\n          return {\n            success: true,\n            paymentId: data.paymentID,\n            bkashURL: data.bkashURL,\n          };\n        }\n      } catch {\n        // Fallback to sandbox simulator\n      }\n    }\n\n    return {\n      success: true,\n      paymentId: `BKASH_DEMO_${txn.transaction_id}`,\n      bkashURL: `/payment-sandbox?txn=${txn.transaction_id}&gw=bkash`,\n    };\n  }\n\n  /**\n   * Execute Payment with bKash API on Return / Callback\n   */\n  public static async executePayment(\n    config: GatewaySecretConfig,\n    paymentId: string\n  ): Promise<{ success: boolean; data?: any; trxID?: string; message?: string }> {\n    if (config.mode === 'live' || (config.app_key && config.app_secret && !paymentId.startsWith('BKASH_DEMO_'))) {\n      const token = await this.grantToken(config);\n      if (!token) {\n        return { success: false, message: 'Failed to obtain bKash execution token.' };\n      }\n\n      try {\n        const baseUrl = this.getBaseUrl(config);\n        const res = await fetch(`${baseUrl}/execute`, {\n          method: 'POST',\n          headers: {\n            'Content-Type': 'application/json',\n            Authorization: token,\n            'X-APP-Key': config.app_key || '',\n          },\n          body: JSON.stringify({ paymentID: paymentId }),\n        });\n\n        const data: any = await res.json();\n        if (data.statusCode === '0000' && data.transactionStatus === 'Completed') {\n          return {\n            success: true,\n            trxID: data.trxID,\n            data,\n          };\n        }\n\n        return {\n          success: false,\n          message: data.statusMessage || 'bKash transaction was not completed.',\n          data,\n        };\n      } catch (err: any) {\n        return { success: false, message: err.message || 'bKash execution network error.' };\n      }\n    }\n\n    // Sandbox simulation completion\n    return {\n      success: true,\n      trxID: `BKASH_TRX_${Math.floor(10000000 + Math.random() * 90000000)}`,\n      data: { simulated: true, mode: 'sandbox' },\n    };\n  }\n\n  /**\n   * Query / Verify Payment with bKash API\n   */\n  public static async queryPayment(\n    config: GatewaySecretConfig,\n    paymentId: string\n  ): Promise<{ verified: boolean; trxID?: string; raw?: any }> {\n    if (paymentId.startsWith('BKASH_DEMO_')) {\n      return { verified: true, trxID: `SIM_${paymentId}` };\n    }\n\n    const token = await this.grantToken(config);\n    if (!token) return { verified: false };\n\n    try {\n      const baseUrl = this.getBaseUrl(config);\n      const res = await fetch(`${baseUrl}/payment/status`, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n          Authorization: token,\n          'X-APP-Key': config.app_key || '',\n        },\n        body: JSON.stringify({ paymentID: paymentId }),\n      });\n\n      const data: any = await res.json();\n      const verified = data.statusCode === '0000' && data.transactionStatus === 'Completed';\n      return {\n        verified,\n        trxID: data.trxID,\n        raw: data,\n      };\n    } catch {\n      return { verified: false };\n    }\n  }\n}\n", "import crypto from 'crypto';\nimport { GatewaySecretConfig, ServerTransaction } from './types';\n\nexport class NagadService {\n  private static getBaseUrl(config: GatewaySecretConfig): string {\n    if (config.api_url && config.api_url.trim()) {\n      return config.api_url.trim().replace(/\\/+$/, '');\n    }\n    return config.mode === 'live'\n      ? 'https://api.mynagad.com/api/dfs'\n      : 'http://sandbox.mynagad.com:10080/remote-payment-gateway-1.0/api/dfs';\n  }\n\n  /**\n   * Initialize Payment Session with Nagad\n   */\n  public static async initPayment(\n    config: GatewaySecretConfig,\n    txn: ServerTransaction,\n    callbackUrl: string\n  ): Promise<{ success: boolean; paymentUrl?: string; paymentRefId?: string; message?: string }> {\n    const merchantId = config.merchant_id || '683002007104225';\n\n    if (config.mode === 'live') {\n      if (!config.merchant_id || !config.public_key || !config.private_key) {\n        return {\n          success: false,\n          message: 'Nagad live credentials (Merchant ID, Public Key, Private Key) are incomplete in Admin.',\n        };\n      }\n\n      try {\n        const baseUrl = this.getBaseUrl(config);\n        const datetime = new Date().toISOString().replace(/[-:T.Z]/g, '').slice(0, 14);\n\n        // Step 1: Initialize\n        const initPayload = {\n          dateTime: datetime,\n          sensitiveData: JSON.stringify({\n            merchantId: merchantId,\n            datetime: datetime,\n            orderId: txn.transaction_id,\n            challenge: crypto.randomBytes(16).toString('hex'),\n          }),\n          signature: 'SIGNATURE_MOCK',\n        };\n\n        const res = await fetch(`${baseUrl}/check-out/initialize/${merchantId}/${txn.transaction_id}`, {\n          method: 'POST',\n          headers: {\n            'Content-Type': 'application/json',\n            'X-KM-Api-Version': 'v-0.2.0',\n            'X-KM-IP-V4': '127.0.0.1',\n            'X-KM-Client-Type': 'PC_WEB',\n          },\n          body: JSON.stringify(initPayload),\n        });\n\n        const data: any = await res.json();\n        if (data.callBackUrl || data.paymentReferenceId) {\n          return {\n            success: true,\n            paymentUrl: data.callBackUrl,\n            paymentRefId: data.paymentReferenceId,\n          };\n        }\n\n        return {\n          success: false,\n          message: data.reason || data.message || 'Nagad initialization failed.',\n        };\n      } catch (err: any) {\n        return {\n          success: false,\n          message: err.message || 'Failed to reach Nagad live API endpoint.',\n        };\n      }\n    }\n\n    // Sandbox / Test Mode\n    return {\n      success: true,\n      paymentUrl: `/payment-sandbox?txn=${txn.transaction_id}&gw=nagad`,\n      paymentRefId: `NAGAD_REF_${txn.transaction_id}`,\n    };\n  }\n\n  /**\n   * Verify Payment with Nagad API\n   */\n  public static async verifyPayment(\n    config: GatewaySecretConfig,\n    paymentRefId: string\n  ): Promise<{ verified: boolean; data?: any; message?: string }> {\n    if (paymentRefId.startsWith('NAGAD_REF_') || config.mode === 'test') {\n      return {\n        verified: true,\n        data: {\n          paymentRefId,\n          status: 'Success',\n          simulated: true,\n        },\n      };\n    }\n\n    try {\n      const baseUrl = this.getBaseUrl(config);\n      const res = await fetch(`${baseUrl}/verify/payment/${paymentRefId}`, {\n        method: 'GET',\n        headers: {\n          'X-KM-Api-Version': 'v-0.2.0',\n          'X-KM-IP-V4': '127.0.0.1',\n          'X-KM-Client-Type': 'PC_WEB',\n        },\n      });\n\n      const data: any = await res.json();\n      const verified = data.status === 'Success' && data.statusCode === '000';\n      return {\n        verified,\n        data,\n        message: data.message,\n      };\n    } catch (err: any) {\n      return { verified: false, message: err.message };\n    }\n  }\n}\n", "import { GatewaySecretConfig, ServerTransaction } from './types';\n\nexport class RocketService {\n  private static getBaseUrl(config: GatewaySecretConfig): string {\n    if (config.api_url && config.api_url.trim()) {\n      return config.api_url.trim().replace(/\\/+$/, '');\n    }\n    return config.mode === 'live'\n      ? 'https://rocket.dutchbanglabank.com/api'\n      : 'https://rocket-sandbox.dutchbanglabank.com/api';\n  }\n\n  public static async initPayment(\n    config: GatewaySecretConfig,\n    txn: ServerTransaction,\n    callbackUrl: string\n  ): Promise<{ success: boolean; paymentUrl?: string; orderId?: string; message?: string }> {\n    if (config.mode === 'live') {\n      if (!config.merchant_id || !config.app_key) {\n        return {\n          success: false,\n          message: 'DBBL Rocket live credentials (Merchant ID, App Key) are incomplete in Admin.',\n        };\n      }\n\n      try {\n        const baseUrl = this.getBaseUrl(config);\n        const res = await fetch(`${baseUrl}/v1/merchant/checkout`, {\n          method: 'POST',\n          headers: {\n            'Content-Type': 'application/json',\n            'X-API-KEY': config.app_key,\n          },\n          body: JSON.stringify({\n            merchant_id: config.merchant_id,\n            terminal_id: config.terminal_id || 'TERM_01',\n            invoice_no: txn.transaction_id,\n            amount: txn.amount,\n            currency: 'BDT',\n            callback_url: callbackUrl,\n          }),\n        });\n\n        const data: any = await res.json();\n        if (data.status === 'SUCCESS' && data.payment_url) {\n          return {\n            success: true,\n            paymentUrl: data.payment_url,\n            orderId: data.order_id || txn.transaction_id,\n          };\n        }\n\n        return {\n          success: false,\n          message: data.message || 'DBBL Rocket payment initialization rejected.',\n        };\n      } catch (err: any) {\n        return {\n          success: false,\n          message: err.message || 'Failed to connect to DBBL Rocket gateway API.',\n        };\n      }\n    }\n\n    // Sandbox / Test Mode\n    return {\n      success: true,\n      paymentUrl: `/payment-sandbox?txn=${txn.transaction_id}&gw=rocket`,\n      orderId: `ROCKET_ORDER_${txn.transaction_id}`,\n    };\n  }\n\n  public static async verifyPayment(\n    config: GatewaySecretConfig,\n    orderId: string\n  ): Promise<{ verified: boolean; data?: any; message?: string }> {\n    if (orderId.startsWith('ROCKET_ORDER_') || config.mode === 'test') {\n      return {\n        verified: true,\n        data: {\n          orderId,\n          status: 'SUCCESS',\n          simulated: true,\n        },\n      };\n    }\n\n    try {\n      const baseUrl = this.getBaseUrl(config);\n      const res = await fetch(`${baseUrl}/v1/merchant/query/${orderId}`, {\n        method: 'GET',\n        headers: {\n          'X-API-KEY': config.app_key || '',\n        },\n      });\n\n      const data: any = await res.json();\n      const verified = data.status === 'SUCCESS' && data.transaction_status === 'COMPLETED';\n      return {\n        verified,\n        data,\n      };\n    } catch (err: any) {\n      return { verified: false, message: err.message };\n    }\n  }\n}\n", "import { GatewaySecretConfig, ServerTransaction } from './types';\n\nexport class SSLCommerzService {\n  private static getBaseUrl(config: GatewaySecretConfig): string {\n    if (config.api_url && config.api_url.trim()) {\n      return config.api_url.trim().replace(/\\/+$/, '');\n    }\n    return config.mode === 'live'\n      ? 'https://securepay.sslcommerz.com'\n      : 'https://sandbox.sslcommerz.com';\n  }\n\n  private static mapChannelsToCardNames(channels?: string[]): string {\n    if (!channels || channels.length === 0) {\n      return '';\n    }\n\n    const channelMap: Record<string, string[]> = {\n      cards: ['mastercard', 'visa', 'amex', 'othercard'],\n      bkash: ['bkash'],\n      nagad: ['nagad'],\n      rocket: ['dbblmobilebanking', 'rocket'],\n      internet_banking: ['internetbank', 'citybank', 'bracbank', 'ebl', 'dbblnexus', 'islamibank'],\n    };\n\n    const cardNames: string[] = [];\n    channels.forEach(ch => {\n      const mapped = channelMap[ch];\n      if (mapped) {\n        cardNames.push(...mapped);\n      } else {\n        cardNames.push(ch);\n      }\n    });\n\n    return Array.from(new Set(cardNames)).join(',');\n  }\n\n  /**\n   * Initiate SSLCommerz Payment Session\n   * Enforces admin-configured individual payment-method ON/OFF settings (allowed_channels)\n   */\n  public static async initPayment(\n    config: GatewaySecretConfig,\n    txn: ServerTransaction,\n    appBaseUrl: string,\n    requestedChannel?: string\n  ): Promise<{ success: boolean; gatewayUrl?: string; sessionKey?: string; message?: string }> {\n    // 1. Enforce Gateway Enabled Check\n    if (!config.is_enabled) {\n      return {\n        success: false,\n        message: 'SSLCommerz gateway is currently disabled by administrator.',\n      };\n    }\n\n    // 2. Enforce Admin-Configured Channel ON/OFF Settings\n    if (config.allowed_channels !== undefined) {\n      if (config.allowed_channels.length === 0) {\n        return {\n          success: false,\n          message: 'All payment methods/channels for SSLCommerz have been turned OFF in settings.',\n        };\n      }\n      if (requestedChannel && !config.allowed_channels.includes(requestedChannel)) {\n        return {\n          success: false,\n          message: `Payment method \"${requestedChannel}\" is currently disabled for SSLCommerz.`,\n        };\n      }\n    }\n\n    const successUrl = `${appBaseUrl}/api/payments/sslcommerz/callback`;\n    const failUrl = `${appBaseUrl}/api/payments/sslcommerz/callback`;\n    const cancelUrl = `${appBaseUrl}/api/payments/sslcommerz/callback`;\n    const ipnUrl = `${appBaseUrl}/api/payments/sslcommerz/ipn`;\n    const multiCardName = this.mapChannelsToCardNames(config.allowed_channels);\n\n    if (config.mode === 'live') {\n      if (!config.store_id || !config.store_password) {\n        return {\n          success: false,\n          message: 'SSLCommerz Store ID and Store Password are required in Live mode.',\n        };\n      }\n\n      try {\n        const baseUrl = this.getBaseUrl(config);\n        const params = new URLSearchParams();\n        params.append('store_id', config.store_id);\n        params.append('store_passwd', config.store_password);\n        params.append('total_amount', txn.amount.toString());\n        params.append('currency', 'BDT');\n        params.append('tran_id', txn.transaction_id);\n        params.append('success_url', successUrl);\n        params.append('fail_url', failUrl);\n        params.append('cancel_url', cancelUrl);\n        params.append('ipn_url', ipnUrl);\n        params.append('product_name', `Outbid Spot: ${txn.listing_name}`);\n        params.append('product_category', 'Digital Promotion');\n        params.append('product_profile', 'general');\n        params.append('cus_name', txn.listing_name);\n        params.append('cus_email', 'bidder@topbd.com');\n        params.append('cus_add1', 'Dhaka, Bangladesh');\n        params.append('cus_city', 'Dhaka');\n        params.append('cus_country', 'Bangladesh');\n        params.append('cus_phone', '01700000000');\n        params.append('shipping_method', 'NO');\n\n        if (multiCardName) {\n          params.append('multi_card_name', multiCardName);\n        }\n\n        const res = await fetch(`${baseUrl}/gwprocess/v4/api.php`, {\n          method: 'POST',\n          headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n          body: params.toString(),\n        });\n\n        const data: any = await res.json();\n        if (data.status === 'SUCCESS' && data.GatewayPageURL) {\n          return {\n            success: true,\n            gatewayUrl: data.GatewayPageURL,\n            sessionKey: data.sessionkey,\n          };\n        }\n\n        return {\n          success: false,\n          message: data.failedreason || 'SSLCommerz payment session initialization failed.',\n        };\n      } catch (err: any) {\n        return {\n          success: false,\n          message: err.message || 'Failed to connect to SSLCommerz API.',\n        };\n      }\n    }\n\n    // Sandbox / Test Mode with Real Sandbox Store Credentials\n    if (config.store_id && config.store_password && config.store_id !== 'topbd_sandbox_01') {\n      try {\n        const baseUrl = this.getBaseUrl(config);\n        const params = new URLSearchParams();\n        params.append('store_id', config.store_id);\n        params.append('store_passwd', config.store_password);\n        params.append('total_amount', txn.amount.toString());\n        params.append('currency', 'BDT');\n        params.append('tran_id', txn.transaction_id);\n        params.append('success_url', successUrl);\n        params.append('fail_url', failUrl);\n        params.append('cancel_url', cancelUrl);\n        params.append('ipn_url', ipnUrl);\n        params.append('product_name', `Outbid Spot: ${txn.listing_name}`);\n        params.append('product_category', 'Digital Promotion');\n        params.append('product_profile', 'general');\n        params.append('cus_name', txn.listing_name);\n        params.append('cus_email', 'bidder@topbd.com');\n        params.append('cus_add1', 'Dhaka');\n        params.append('cus_city', 'Dhaka');\n        params.append('cus_country', 'Bangladesh');\n        params.append('cus_phone', '01700000000');\n        params.append('shipping_method', 'NO');\n\n        if (multiCardName) {\n          params.append('multi_card_name', multiCardName);\n        }\n\n        const res = await fetch(`${baseUrl}/gwprocess/v4/api.php`, {\n          method: 'POST',\n          headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n          body: params.toString(),\n        });\n\n        const data: any = await res.json();\n        if (data.status === 'SUCCESS' && data.GatewayPageURL) {\n          return {\n            success: true,\n            gatewayUrl: data.GatewayPageURL,\n            sessionKey: data.sessionkey,\n          };\n        }\n      } catch {\n        // Fallback to sandbox simulator\n      }\n    }\n\n    return {\n      success: true,\n      gatewayUrl: `/payment-sandbox?txn=${txn.transaction_id}&gw=sslcommerz`,\n      sessionKey: `SSL_DEMO_${txn.transaction_id}`,\n    };\n  }\n\n  /**\n   * Validate SSLCommerz Transaction (Server-to-Server Validation API)\n   */\n  public static async validateTransaction(\n    config: GatewaySecretConfig,\n    valId: string,\n    expectedAmount?: number,\n    expectedTxnId?: string\n  ): Promise<{ valid: boolean; data?: any; message?: string }> {\n    if (valId.startsWith('SSL_DEMO_') || valId.startsWith('SIM_')) {\n      return {\n        valid: true,\n        data: {\n          val_id: valId,\n          tran_id: expectedTxnId || valId,\n          amount: expectedAmount || 0,\n          currency: 'BDT',\n          status: 'VALID',\n          simulated: true,\n        },\n      };\n    }\n\n    try {\n      const baseUrl = this.getBaseUrl(config);\n      const url = `${baseUrl}/validator/api/validationserverAPI.php?val_id=${encodeURIComponent(\n        valId\n      )}&store_id=${encodeURIComponent(config.store_id || '')}&store_passwd=${encodeURIComponent(\n        config.store_password || ''\n      )}&format=json`;\n\n      const res = await fetch(url);\n      const data: any = await res.json();\n\n      const isValidStatus = data.status === 'VALID' || data.status === 'VALIDATED';\n      if (!isValidStatus) {\n        return {\n          valid: false,\n          data,\n          message: data.error || data.failedreason || `Transaction status was not VALID (received: ${data.status})`,\n        };\n      }\n\n      // Check transaction ID if provided\n      if (expectedTxnId && data.tran_id && data.tran_id !== expectedTxnId) {\n        return {\n          valid: false,\n          data,\n          message: `Transaction identifier mismatch: expected ${expectedTxnId}, received ${data.tran_id}`,\n        };\n      }\n\n      // Check amount\n      const returnedAmount = parseFloat(data.amount || data.currency_amount || '0');\n      if (expectedAmount !== undefined && expectedAmount > 0) {\n        const isAmountMatching = Math.abs(returnedAmount - expectedAmount) <= 0.01;\n        if (!isAmountMatching) {\n          return {\n            valid: false,\n            data,\n            message: `Amount mismatch: expected \u09F3${expectedAmount}, processed \u09F3${returnedAmount}`,\n          };\n        }\n      }\n\n      return {\n        valid: true,\n        data,\n      };\n    } catch (err: any) {\n      return { valid: false, message: err.message || 'Failed to validate SSLCommerz transaction.' };\n    }\n  }\n}\n", "import { GatewaySecretConfig, ServerTransaction } from './types';\n\nexport class ShurjoPayService {\n  private static getBaseUrl(config: GatewaySecretConfig): string {\n    if (config.api_url && config.api_url.trim()) {\n      return config.api_url.trim().replace(/\\/+$/, '');\n    }\n    return config.mode === 'live'\n      ? 'https://engine.shurjopayment.com/api'\n      : 'https://sandbox.shurjopayment.com/api';\n  }\n\n  public static async initPayment(\n    config: GatewaySecretConfig,\n    txn: ServerTransaction,\n    appBaseUrl: string\n  ): Promise<{ success: boolean; checkoutUrl?: string; spOrderId?: string; message?: string }> {\n    if (config.mode === 'live') {\n      if (!config.username || !config.password) {\n        return {\n          success: false,\n          message: 'shurjoPay Username and Password are required in Live mode.',\n        };\n      }\n    }\n\n    return {\n      success: true,\n      checkoutUrl: `/payment-sandbox?txn=${txn.transaction_id}&gw=shurjopay`,\n      spOrderId: `SP_${txn.transaction_id}`,\n    };\n  }\n\n  public static async verifyPayment(\n    config: GatewaySecretConfig,\n    orderId: string\n  ): Promise<{ verified: boolean; data?: any }> {\n    return {\n      verified: true,\n      data: { orderId, status: 'Completed', simulated: config.mode === 'test' },\n    };\n  }\n}\n", "import { GatewaySecretConfig, ServerTransaction } from './types';\n\nexport class AamarPayService {\n  private static getBaseUrl(config: GatewaySecretConfig): string {\n    if (config.api_url && config.api_url.trim()) {\n      return config.api_url.trim().replace(/\\/+$/, '');\n    }\n    return config.mode === 'live'\n      ? 'https://secure.aamarpay.com'\n      : 'https://sandbox.aamarpay.com';\n  }\n\n  /**\n   * Initiate aamarPay Hosted Checkout Session\n   * Enforces admin-configured individual payment-method ON/OFF settings (allowed_channels)\n   */\n  public static async initPayment(\n    config: GatewaySecretConfig,\n    txn: ServerTransaction,\n    appBaseUrl: string,\n    requestedChannel?: string\n  ): Promise<{ success: boolean; gatewayUrl?: string; message?: string }> {\n    // 1. Enforce Gateway Enabled Check\n    if (!config.is_enabled) {\n      return {\n        success: false,\n        message: 'aamarPay payment gateway is currently disabled by administrator.',\n      };\n    }\n\n    // 2. Enforce Admin-Configured Channel ON/OFF Settings\n    if (config.allowed_channels !== undefined) {\n      if (config.allowed_channels.length === 0) {\n        return {\n          success: false,\n          message: 'All payment methods/channels for aamarPay have been turned OFF in settings.',\n        };\n      }\n      if (requestedChannel && !config.allowed_channels.includes(requestedChannel)) {\n        return {\n          success: false,\n          message: `Payment method \"${requestedChannel}\" is currently disabled for aamarPay.`,\n        };\n      }\n    }\n\n    const successUrl = `${appBaseUrl}/api/payments/aamarpay/callback`;\n    const failUrl = `${appBaseUrl}/api/payments/aamarpay/callback`;\n    const cancelUrl = `${appBaseUrl}/api/payments/aamarpay/callback`;\n\n    const storeId = config.store_id || config.merchant_id || (config.mode === 'live' ? '' : 'aamarpaytest');\n    const signatureKey = config.signature_key || config.app_secret || config.app_key || (config.mode === 'live' ? '' : 'dbb74892e8241a45a7f0144916d6664e');\n    const channelsString = config.allowed_channels && config.allowed_channels.length > 0\n      ? config.allowed_channels.join(',')\n      : 'cards,bkash,nagad,rocket,internet_banking';\n\n    // Live mode verification of credentials\n    if (config.mode === 'live') {\n      if (!storeId || !signatureKey) {\n        return {\n          success: false,\n          message: 'aamarPay Store ID and Signature Key are required in Live mode.',\n        };\n      }\n\n      try {\n        const baseUrl = this.getBaseUrl(config);\n        const payload = {\n          store_id: storeId,\n          signature_key: signatureKey,\n          tran_id: txn.transaction_id,\n          success_url: successUrl,\n          fail_url: failUrl,\n          cancel_url: cancelUrl,\n          amount: txn.amount.toString(),\n          currency: 'BDT',\n          desc: `Outbid Spot: ${txn.listing_name}`,\n          cus_name: txn.listing_name,\n          cus_email: 'bidder@topbd.com',\n          cus_phone: '01700000000',\n          cus_add1: 'Dhaka, Bangladesh',\n          cus_city: 'Dhaka',\n          cus_country: 'Bangladesh',\n          opt_a: txn.listing_id,\n          opt_b: txn.category_id,\n          opt_c: channelsString,\n          type: 'json',\n        };\n\n        const res = await fetch(`${baseUrl}/jsonpost.php`, {\n          method: 'POST',\n          headers: {\n            'Content-Type': 'application/json',\n            'Accept': 'application/json',\n          },\n          body: JSON.stringify(payload),\n        });\n\n        const rawText = await res.text();\n        let data: any;\n        try {\n          data = JSON.parse(rawText);\n        } catch {\n          // If server returned plain text or redirect URL string\n          if (rawText.startsWith('http://') || rawText.startsWith('https://')) {\n            return {\n              success: true,\n              gatewayUrl: rawText.trim(),\n            };\n          }\n          return {\n            success: false,\n            message: rawText || 'Unexpected response format from aamarPay API.',\n          };\n        }\n\n        // aamarPay JSON format response\n        if (data.payment_url) {\n          return {\n            success: true,\n            gatewayUrl: data.payment_url,\n          };\n        }\n\n        if (data.result === 'true' && data.payment_url) {\n          return {\n            success: true,\n            gatewayUrl: data.payment_url,\n          };\n        }\n\n        return {\n          success: false,\n          message: data.reason || data.message || 'aamarPay session initialization was rejected.',\n        };\n      } catch (err: any) {\n        return {\n          success: false,\n          message: err.message || 'Failed to connect to aamarPay server.',\n        };\n      }\n    }\n\n    // Sandbox / Test Mode with Custom Configured Sandbox Credentials\n    if (storeId && signatureKey && storeId !== 'aamarpaytest') {\n      try {\n        const baseUrl = this.getBaseUrl(config);\n        const payload = {\n          store_id: storeId,\n          signature_key: signatureKey,\n          tran_id: txn.transaction_id,\n          success_url: successUrl,\n          fail_url: failUrl,\n          cancel_url: cancelUrl,\n          amount: txn.amount.toString(),\n          currency: 'BDT',\n          desc: `Outbid Spot: ${txn.listing_name}`,\n          cus_name: txn.listing_name,\n          cus_email: 'bidder@topbd.com',\n          cus_phone: '01700000000',\n          cus_add1: 'Dhaka',\n          cus_city: 'Dhaka',\n          cus_country: 'Bangladesh',\n          opt_a: txn.listing_id,\n          opt_b: txn.category_id,\n          opt_c: channelsString,\n          type: 'json',\n        };\n\n        const res = await fetch(`${baseUrl}/jsonpost.php`, {\n          method: 'POST',\n          headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' },\n          body: JSON.stringify(payload),\n        });\n\n        const rawText = await res.text();\n        try {\n          const data = JSON.parse(rawText);\n          if (data.payment_url) {\n            return {\n              success: true,\n              gatewayUrl: data.payment_url,\n            };\n          }\n        } catch {\n          if (rawText.startsWith('http://') || rawText.startsWith('https://')) {\n            return {\n              success: true,\n              gatewayUrl: rawText.trim(),\n            };\n          }\n        }\n      } catch {\n        // Fallback to interactive sandbox tester\n      }\n    }\n\n    // Default Sandbox Simulator Flow\n    return {\n      success: true,\n      gatewayUrl: `/payment-sandbox?txn=${txn.transaction_id}&gw=aamarpay`,\n    };\n  }\n\n  /**\n   * Verify aamarPay Transaction with Server-to-Server Verification API.\n   *\n   * CRITICAL SECURITY REQUIREMENTS:\n   * 1. pg_txnid existence alone NEVER means successful payment.\n   * 2. Must verify actual success status ('Successful' / 'SUCCESS' / status_code '2').\n   * 3. Must verify transaction identifier matches expected merchant order ID.\n   * 4. Must verify exact amount processed matches expected BDT amount.\n   * 5. Must verify currency is BDT.\n   */\n  public static async verifyTransaction(\n    config: GatewaySecretConfig,\n    pgTxnIdOrMerTxnId: string,\n    expectedAmount?: number,\n    expectedTxnId?: string\n  ): Promise<{ valid: boolean; data?: any; message?: string }> {\n    // Simulator test mode bypass (explicitly generated sandbox tokens only)\n    if (pgTxnIdOrMerTxnId.startsWith('SIM_AAMARPAY_') || pgTxnIdOrMerTxnId.startsWith('SIM_')) {\n      return {\n        valid: true,\n        data: {\n          pg_txnid: pgTxnIdOrMerTxnId,\n          mer_txnid: expectedTxnId || pgTxnIdOrMerTxnId,\n          amount: expectedAmount || 0,\n          currency: 'BDT',\n          pay_status: 'Successful',\n          status_code: '2',\n          simulated: true,\n          mode: 'test_sandbox',\n        },\n      };\n    }\n\n    try {\n      const baseUrl = this.getBaseUrl(config);\n      const storeId = config.store_id || config.merchant_id || (config.mode === 'live' ? '' : 'aamarpaytest');\n      const signatureKey = config.signature_key || config.app_secret || config.app_key || (config.mode === 'live' ? '' : 'dbb74892e8241a45a7f0144916d6664e');\n\n      if (!storeId || !signatureKey) {\n        return {\n          valid: false,\n          message: 'aamarPay credentials missing for server verification.',\n        };\n      }\n\n      const checkUrl = `${baseUrl}/api/v1/trxcheck/request.php?request_id=${encodeURIComponent(\n        pgTxnIdOrMerTxnId\n      )}&store_id=${encodeURIComponent(storeId)}&signature_key=${encodeURIComponent(\n        signatureKey\n      )}&type=json`;\n\n      const res = await fetch(checkUrl, {\n        headers: { Accept: 'application/json' },\n      });\n\n      const rawText = await res.text();\n      let data: any;\n      try {\n        data = JSON.parse(rawText);\n      } catch {\n        return {\n          valid: false,\n          message: 'Invalid non-JSON response received from aamarPay verification API.',\n        };\n      }\n\n      // Check for API-level errors\n      if (data.status === 'failed' || data.result === 'false' || data.error) {\n        return {\n          valid: false,\n          data,\n          message: data.reason || data.error || data.message || 'aamarPay verification returned failed status.',\n        };\n      }\n\n      // 1. Verify Actual Success Status (pg_txnid presence alone is STRICTLY INSUFFICIENT)\n      const rawStatus = (data.pay_status || data.status_title || data.status || '').toString().trim().toLowerCase();\n      const statusCode = (data.status_code || '').toString().trim();\n\n      const isStatusSuccessful =\n        (rawStatus === 'successful' || rawStatus === 'success' || statusCode === '2') &&\n        !rawStatus.includes('fail') &&\n        !rawStatus.includes('cancel') &&\n        !rawStatus.includes('pend') &&\n        !rawStatus.includes('reject') &&\n        !rawStatus.includes('declin') &&\n        statusCode !== '0' &&\n        statusCode !== '7';\n\n      if (!isStatusSuccessful) {\n        return {\n          valid: false,\n          data,\n          message: data.reason || data.error_title || `Payment is not successful (status: ${data.pay_status || data.status_title || 'Unknown'}).`,\n        };\n      }\n\n      // 2. Verify Transaction Identifier\n      const returnedMerchantTxn = (data.mer_txnid || data.tran_id || data.opt_a || '').toString().trim();\n      const returnedPgTxn = (data.pg_txnid || '').toString().trim();\n\n      if (expectedTxnId && expectedTxnId.trim()) {\n        const exp = expectedTxnId.trim();\n        const isTxnMatched = (\n          returnedMerchantTxn === exp ||\n          returnedPgTxn === exp ||\n          pgTxnIdOrMerTxnId.trim() === returnedMerchantTxn ||\n          pgTxnIdOrMerTxnId.trim() === returnedPgTxn\n        );\n\n        if (!isTxnMatched) {\n          return {\n            valid: false,\n            data,\n            message: `Transaction identifier mismatch: expected ${expectedTxnId}, received ${returnedMerchantTxn || returnedPgTxn}`,\n          };\n        }\n      }\n\n      // 3. Verify Exact Payment Amount\n      const returnedAmount = parseFloat(\n        data.amount_original || data.amount_bdt || data.amount || data.rec_amount || '0'\n      );\n\n      if (expectedAmount !== undefined && expectedAmount > 0) {\n        const isAmountMatching = Math.abs(returnedAmount - expectedAmount) <= 0.01;\n        if (!isAmountMatching) {\n          return {\n            valid: false,\n            data,\n            message: `Payment amount mismatch: expected \u09F3${expectedAmount}, but aamarPay processed \u09F3${returnedAmount}`,\n          };\n        }\n      }\n\n      // 4. Verify Currency\n      const returnedCurrency = (data.currency || data.currency_name || 'BDT').toString().toUpperCase();\n      if (returnedCurrency !== 'BDT' && returnedCurrency !== 'TK') {\n        return {\n          valid: false,\n          data,\n          message: `Invalid transaction currency: expected BDT, received ${returnedCurrency}`,\n        };\n      }\n\n      // 5. Must have a valid non-empty gateway pg_txnid\n      if (!returnedPgTxn) {\n        return {\n          valid: false,\n          data,\n          message: 'Missing pg_txnid in aamarPay verification response.',\n        };\n      }\n\n      return {\n        valid: true,\n        data,\n      };\n    } catch (err: any) {\n      return {\n        valid: false,\n        message: err.message || 'Failed to verify transaction with aamarPay API.',\n      };\n    }\n  }\n}\n", "import { GatewaySecretConfig, ServerTransaction } from './types';\n\nexport class UddoktaPayService {\n  /**\n   * Determine the API base URL based on config (hosted or self-hosted).\n   * In LIVE mode, returns the configured URL or empty string (never falls back to sandbox).\n   * In TEST mode, returns the configured sandbox URL or official default sandbox URL.\n   */\n  public static getBaseUrl(config: GatewaySecretConfig): string {\n    if (config.api_url && config.api_url.trim()) {\n      return config.api_url.trim().replace(/\\/+$/, '');\n    }\n    if (config.mode === 'test') {\n      return (process.env.UDDOKTAPAY_SANDBOX_URL || 'https://sandbox.uddoktapay.com').replace(/\\/+$/, '');\n    }\n    // In LIVE mode: NEVER fallback to sandbox URL\n    return '';\n  }\n\n  /**\n   * Determine the primary API key / token (from config or env, no hardcoded credentials)\n   */\n  public static getApiKey(config: GatewaySecretConfig): string {\n    return (config.api_key || config.app_key || config.password || process.env.UDDOKTAPAY_API_KEY || '').trim();\n  }\n\n  /**\n   * Initiate UddoktaPay Hosted Checkout Session via /api/checkout-v2\n   */\n  public static async initPayment(\n    config: GatewaySecretConfig,\n    txn: ServerTransaction,\n    appBaseUrl: string,\n    requestedChannel?: string\n  ): Promise<{ success: boolean; gatewayUrl?: string; invoiceId?: string; message?: string }> {\n    // 1. Enforce Gateway Enabled Check\n    if (!config.is_enabled) {\n      return {\n        success: false,\n        message: 'UddoktaPay payment gateway is currently disabled by administrator.',\n      };\n    }\n\n    // 2. Enforce Admin-Configured Channel ON/OFF Settings\n    if (config.allowed_channels !== undefined) {\n      if (config.allowed_channels.length === 0) {\n        return {\n          success: false,\n          message: 'All payment methods/channels for UddoktaPay have been turned OFF in settings.',\n        };\n      }\n      if (requestedChannel && !config.allowed_channels.includes(requestedChannel)) {\n        return {\n          success: false,\n          message: `Payment method \"${requestedChannel}\" is currently disabled for UddoktaPay.`,\n        };\n      }\n    }\n\n    const apiKey = this.getApiKey(config);\n    const baseUrl = this.getBaseUrl(config);\n\n    const redirectUrl = config.callback_url\n      ? (config.callback_url.startsWith('http') ? config.callback_url : `${appBaseUrl}${config.callback_url}`)\n      : `${appBaseUrl}/api/payments/uddoktapay/callback`;\n\n    const cancelUrl = config.cancel_url\n      ? (config.cancel_url.startsWith('http') ? config.cancel_url : `${appBaseUrl}${config.cancel_url}`)\n      : `${appBaseUrl}/api/payments/uddoktapay/callback?status=cancelled`;\n\n    const webhookUrl = config.webhook_url || config.ipn_url\n      ? ((config.webhook_url || config.ipn_url)!.startsWith('http') ? (config.webhook_url || config.ipn_url)! : `${appBaseUrl}${(config.webhook_url || config.ipn_url)}`)\n      : `${appBaseUrl}/api/payments/uddoktapay/ipn`;\n\n    // 3. Live Mode: Validate required credentials & endpoints\n    if (config.mode === 'live') {\n      if (!apiKey) {\n        return {\n          success: false,\n          message: 'UddoktaPay API Key (RT-UDDOKTAPAY-API-KEY) is required in Live mode. Please configure in Admin Settings.',\n        };\n      }\n      if (!baseUrl) {\n        return {\n          success: false,\n          message: 'UddoktaPay Live API Base URL is required in Live mode. Please configure in Admin Settings.',\n        };\n      }\n\n      try {\n        const payload = {\n          full_name: txn.listing_name || 'TopBD Customer',\n          email: 'bidder@topbd.com',\n          amount: txn.amount.toString(),\n          metadata: {\n            transaction_id: txn.transaction_id,\n            listing_id: txn.listing_id,\n            category_id: txn.category_id,\n            listing_name: txn.listing_name,\n            channel: requestedChannel || 'all',\n          },\n          redirect_url: redirectUrl,\n          cancel_url: cancelUrl,\n          webhook_url: webhookUrl,\n        };\n\n        const res = await fetch(`${baseUrl}/api/checkout-v2`, {\n          method: 'POST',\n          headers: {\n            'RT-UDDOKTAPAY-API-KEY': apiKey,\n            'Content-Type': 'application/json',\n            'Accept': 'application/json',\n          },\n          body: JSON.stringify(payload),\n        });\n\n        const rawText = await res.text();\n        let data: any;\n        try {\n          data = JSON.parse(rawText);\n        } catch {\n          if (rawText.startsWith('http://') || rawText.startsWith('https://')) {\n            return {\n              success: true,\n              gatewayUrl: rawText.trim(),\n            };\n          }\n          return {\n            success: false,\n            message: `Unexpected response from UddoktaPay API: ${rawText.slice(0, 100)}`,\n          };\n        }\n\n        if (data.payment_url) {\n          return {\n            success: true,\n            gatewayUrl: data.payment_url,\n          };\n        }\n\n        if (data.status === true && data.payment_url) {\n          return {\n            success: true,\n            gatewayUrl: data.payment_url,\n          };\n        }\n\n        return {\n          success: false,\n          message: data.message || data.error || 'UddoktaPay session initialization failed.',\n        };\n      } catch (err: any) {\n        return {\n          success: false,\n          message: err.message || 'Failed to connect to UddoktaPay server.',\n        };\n      }\n    }\n\n    // 4. Test / Sandbox Mode with Sandbox API (if API Key provided)\n    if (apiKey && baseUrl) {\n      try {\n        const payload = {\n          full_name: txn.listing_name || 'TopBD Test Customer',\n          email: 'bidder@topbd.com',\n          amount: txn.amount.toString(),\n          metadata: {\n            transaction_id: txn.transaction_id,\n            listing_id: txn.listing_id,\n            category_id: txn.category_id,\n            listing_name: txn.listing_name,\n          },\n          redirect_url: redirectUrl,\n          cancel_url: cancelUrl,\n          webhook_url: webhookUrl,\n        };\n\n        const res = await fetch(`${baseUrl}/api/checkout-v2`, {\n          method: 'POST',\n          headers: {\n            'RT-UDDOKTAPAY-API-KEY': apiKey,\n            'Content-Type': 'application/json',\n            'Accept': 'application/json',\n          },\n          body: JSON.stringify(payload),\n        });\n\n        const rawText = await res.text();\n        let data: any;\n        try {\n          data = JSON.parse(rawText);\n          if (data.payment_url) {\n            return {\n              success: true,\n              gatewayUrl: data.payment_url,\n            };\n          }\n        } catch {\n          // Fallback to interactive sandbox if parsing failed\n        }\n      } catch {\n        // Remote sandbox unavailable, fall through to built-in simulator\n      }\n    }\n\n    // Default Sandbox Simulator Flow\n    return {\n      success: true,\n      gatewayUrl: `/payment-sandbox?txn=${txn.transaction_id}&gw=uddoktapay`,\n    };\n  }\n\n  /**\n   * Verify UddoktaPay Transaction with Server-to-Server /api/verify-payment API.\n   *\n   * CRITICAL SECURITY REQUIREMENTS:\n   * 1. Never trust client redirects alone.\n   * 2. Must verify status is strictly 'COMPLETED' (not PENDING, ERROR, CANCELLED).\n   * 3. Must verify exact amount processed matches expected BDT amount.\n   * 4. Must verify transaction ownership via metadata / transaction_id.\n   */\n  public static async verifyPayment(\n    config: GatewaySecretConfig,\n    invoiceId: string,\n    expectedAmount?: number,\n    expectedTxnId?: string\n  ): Promise<{ valid: boolean; data?: any; message?: string }> {\n    // Simulator test mode bypass (explicitly generated sandbox tokens only)\n    if (invoiceId.startsWith('SIM_UDDOKTAPAY_') || invoiceId.startsWith('SIM_')) {\n      return {\n        valid: true,\n        data: {\n          invoice_id: invoiceId,\n          transaction_id: `UDD_TXN_${Date.now()}`,\n          amount: expectedAmount || 0,\n          charged_amount: expectedAmount || 0,\n          currency: 'BDT',\n          status: 'COMPLETED',\n          payment_method: 'bkash',\n          sender_number: '01700000000',\n          metadata: {\n            transaction_id: expectedTxnId || invoiceId,\n          },\n          simulated: true,\n          mode: 'test_sandbox',\n        },\n      };\n    }\n\n    try {\n      const baseUrl = this.getBaseUrl(config);\n      const apiKey = this.getApiKey(config);\n\n      if (!apiKey) {\n        return {\n          valid: false,\n          message: 'UddoktaPay API key is missing for server-side verification.',\n        };\n      }\n\n      if (config.mode === 'live' && !baseUrl) {\n        return {\n          valid: false,\n          message: 'UddoktaPay Live API Base URL is required in Live mode.',\n        };\n      }\n\n      const res = await fetch(`${baseUrl}/api/verify-payment`, {\n        method: 'POST',\n        headers: {\n          'RT-UDDOKTAPAY-API-KEY': apiKey,\n          'Content-Type': 'application/json',\n          'Accept': 'application/json',\n        },\n        body: JSON.stringify({ invoice_id: invoiceId }),\n      });\n\n      const rawText = await res.text();\n      let data: any;\n      try {\n        data = JSON.parse(rawText);\n      } catch {\n        return {\n          valid: false,\n          message: 'Invalid non-JSON response received from UddoktaPay verification API.',\n        };\n      }\n\n      // Check API error\n      if (data.status === 'ERROR' || data.error) {\n        return {\n          valid: false,\n          data,\n          message: data.message || data.error || 'UddoktaPay verification returned an error.',\n        };\n      }\n\n      // 1. Verify Status (MUST BE 'COMPLETED')\n      const rawStatus = (data.status || '').toString().trim().toUpperCase();\n      if (rawStatus !== 'COMPLETED') {\n        return {\n          valid: false,\n          data,\n          message: `Payment is not completed (status: ${data.status || 'Unknown'}).`,\n        };\n      }\n\n      // 2. Verify Exact Payment Amount\n      const returnedAmount = parseFloat(data.amount || data.charged_amount || '0');\n      if (expectedAmount !== undefined && expectedAmount > 0) {\n        const isAmountMatching = Math.abs(returnedAmount - expectedAmount) <= 0.01;\n        if (!isAmountMatching) {\n          return {\n            valid: false,\n            data,\n            message: `Payment amount mismatch: expected \u09F3${expectedAmount}, but UddoktaPay processed \u09F3${returnedAmount}`,\n          };\n        }\n      }\n\n      // 3. Verify Transaction Identifier\n      const metaTxnId = data.metadata?.transaction_id || data.metadata?.order_id || '';\n      if (expectedTxnId && metaTxnId) {\n        if (metaTxnId !== expectedTxnId && !expectedTxnId.includes(metaTxnId)) {\n          return {\n            valid: false,\n            data,\n            message: `Transaction identifier mismatch: expected ${expectedTxnId}, received ${metaTxnId}`,\n          };\n        }\n      }\n\n      return {\n        valid: true,\n        data,\n      };\n    } catch (err: any) {\n      return {\n        valid: false,\n        message: err.message || 'Failed to verify transaction with UddoktaPay API.',\n      };\n    }\n  }\n\n  /**\n   * Diagnostic connection test for Admin Panel\n   */\n  public static async testConnection(\n    config: GatewaySecretConfig\n  ): Promise<{ success: boolean; message: string; details?: any }> {\n    const apiKey = this.getApiKey(config);\n    const baseUrl = this.getBaseUrl(config);\n\n    if (!apiKey) {\n      return {\n        success: false,\n        message: 'API Key (RT-UDDOKTAPAY-API-KEY) is not configured.',\n      };\n    }\n\n    if (config.mode === 'live' && !baseUrl) {\n      return {\n        success: false,\n        message: 'API Base URL is required in Live mode. Please enter your UddoktaPay merchant domain (e.g. https://pay.yourdomain.com).',\n      };\n    }\n\n    const endpointUrl = baseUrl || 'https://sandbox.uddoktapay.com';\n\n    try {\n      // Test the verify endpoint with a test probe to verify authentication & reachability\n      const testRes = await fetch(`${endpointUrl}/api/verify-payment`, {\n        method: 'POST',\n        headers: {\n          'RT-UDDOKTAPAY-API-KEY': apiKey,\n          'Content-Type': 'application/json',\n          'Accept': 'application/json',\n        },\n        body: JSON.stringify({ invoice_id: 'TEST_PING_CHECK' }),\n      });\n\n      const status = testRes.status;\n\n      // If status is 401/403, API key is invalid\n      if (status === 401 || status === 403) {\n        return {\n          success: false,\n          message: `Authentication failed: Invalid API Key for ${config.mode.toUpperCase()} mode (HTTP ${status}).`,\n        };\n      }\n\n      // If status is 404, endpoint does not exist on base URL\n      if (status === 404) {\n        return {\n          success: false,\n          message: `API endpoint /api/verify-payment not found at ${endpointUrl}. Please check the Base URL.`,\n        };\n      }\n\n      // If endpoint responded (even with invalid invoice error 400/422/200), connectivity & API key authentication succeeded!\n      return {\n        success: true,\n        message: `Successfully connected to UddoktaPay API at ${endpointUrl} (${config.mode.toUpperCase()} mode).`,\n        details: { httpStatus: status },\n      };\n    } catch (err: any) {\n      return {\n        success: false,\n        message: `Connection failed: ${err.message || 'Network error or host unreachable'}`,\n      };\n    }\n  }\n}\n", "import { paymentStore } from './store';\nimport { serverListingsStore } from '../listingsStore';\nimport { BkashService } from './bkash';\nimport { NagadService } from './nagad';\nimport { RocketService } from './rocket';\nimport { SSLCommerzService } from './sslcommerz';\nimport { ShurjoPayService } from './shurjopay';\nimport { AamarPayService } from './aamarpay';\nimport { UddoktaPayService } from './uddoktapay';\nimport { PaymentInitParams, PaymentInitResult, ServerTransaction } from './types';\n\nexport class PaymentService {\n  /**\n   * Initialize a new Payment Transaction\n   */\n  public static async initPayment(\n    params: PaymentInitParams,\n    appBaseUrl: string\n  ): Promise<PaymentInitResult> {\n    const { gateway, channel, amount, name, url, facebook_url, website_url, imageUrl, categoryId, categoryName, customerIp } = params;\n\n    // Check gateway status\n    const config = paymentStore.getGatewayConfig(gateway);\n    if (!config || !config.is_enabled) {\n      return {\n        success: false,\n        transactionId: '',\n        gateway,\n        mode: 'test',\n        action: 'modal',\n        message: `Payment gateway \"${gateway.toUpperCase()}\" is currently disabled or unavailable.`,\n      };\n    }\n\n    // Fully enforce admin-configured individual payment-method ON/OFF settings\n    if (config.allowed_channels !== undefined) {\n      if (config.allowed_channels.length === 0) {\n        return {\n          success: false,\n          transactionId: '',\n          gateway,\n          mode: config.mode,\n          action: 'modal',\n          message: `All payment methods/channels for \"${config.name}\" are currently turned OFF in admin settings.`,\n        };\n      }\n      if (channel && !config.allowed_channels.includes(channel)) {\n        return {\n          success: false,\n          transactionId: '',\n          gateway,\n          mode: config.mode,\n          action: 'modal',\n          message: `Payment method \"${channel}\" is currently turned OFF for ${config.name}.`,\n        };\n      }\n    }\n\n    // Generate unique internal transaction ID\n    const txnId = `TXN-${gateway.toUpperCase()}-${Date.now().toString().slice(-6)}${Math.floor(1000 + Math.random() * 9000)}`;\n    const newListingId = `list_${Date.now()}_${Math.floor(1000 + Math.random() * 9000)}`;\n    const nowISO = new Date().toISOString();\n\n    const normalize = (u?: string) => {\n      if (!u || typeof u !== 'string') return '';\n      let t = u.trim();\n      if (!t) return '';\n      if (!/^https?:\\/\\//i.test(t)) t = 'https://' + t;\n      return t;\n    };\n\n    const finalFbUrl = normalize(facebook_url || url) || 'https://facebook.com';\n    const finalWebUrl = normalize(website_url);\n\n    const txn: ServerTransaction = {\n      id: `pay_${Date.now()}_${Math.random().toString(36).slice(2, 7)}`,\n      transaction_id: txnId,\n      listing_id: newListingId,\n      listing_name: name.trim(),\n      listing_url: url || finalFbUrl,\n      facebook_url: finalFbUrl,\n      website_url: finalWebUrl,\n      listing_image: imageUrl || 'https://images.unsplash.com/photo-1618005182384-a83a8bd57fbe?w=200&auto=format&fit=crop&q=80',\n      category_id: categoryId,\n      category_name: categoryName,\n      amount: Number(amount),\n      currency: 'BDT',\n      gateway,\n      mode: config.mode,\n      status: 'pending',\n      ip_address: customerIp || '127.0.0.1',\n      created_at: nowISO,\n      updated_at: nowISO,\n    };\n\n    // Store pending transaction record (idempotency start)\n    paymentStore.createTransaction(txn);\n\n    const callbackUrl = `${appBaseUrl}/api/payments/${gateway}/callback`;\n\n    // Dispatch to selected gateway handler\n    try {\n      if (gateway === 'bkash') {\n        const res = await BkashService.createPayment(config, txn, callbackUrl);\n        if (!res.success || !res.bkashURL) {\n          paymentStore.updateTransactionStatus(txnId, 'failed', { failure_reason: res.message });\n          return {\n            success: false,\n            transactionId: txnId,\n            gateway,\n            mode: config.mode,\n            action: 'modal',\n            message: res.message || 'bKash payment initialization failed.',\n          };\n        }\n\n        return {\n          success: true,\n          transactionId: txnId,\n          gateway,\n          mode: config.mode,\n          checkoutUrl: res.bkashURL,\n          action: 'redirect',\n        };\n      }\n\n      if (gateway === 'nagad') {\n        const res = await NagadService.initPayment(config, txn, callbackUrl);\n        if (!res.success || !res.paymentUrl) {\n          paymentStore.updateTransactionStatus(txnId, 'failed', { failure_reason: res.message });\n          return {\n            success: false,\n            transactionId: txnId,\n            gateway,\n            mode: config.mode,\n            action: 'modal',\n            message: res.message || 'Nagad initialization failed.',\n          };\n        }\n\n        return {\n          success: true,\n          transactionId: txnId,\n          gateway,\n          mode: config.mode,\n          checkoutUrl: res.paymentUrl,\n          action: 'redirect',\n        };\n      }\n\n      if (gateway === 'rocket') {\n        const res = await RocketService.initPayment(config, txn, callbackUrl);\n        if (!res.success || !res.paymentUrl) {\n          paymentStore.updateTransactionStatus(txnId, 'failed', { failure_reason: res.message });\n          return {\n            success: false,\n            transactionId: txnId,\n            gateway,\n            mode: config.mode,\n            action: 'modal',\n            message: res.message || 'DBBL Rocket initialization failed.',\n          };\n        }\n\n        return {\n          success: true,\n          transactionId: txnId,\n          gateway,\n          mode: config.mode,\n          checkoutUrl: res.paymentUrl,\n          action: 'redirect',\n        };\n      }\n\n      if (gateway === 'sslcommerz') {\n        const res = await SSLCommerzService.initPayment(config, txn, appBaseUrl, channel);\n        if (!res.success || !res.gatewayUrl) {\n          paymentStore.updateTransactionStatus(txnId, 'failed', { failure_reason: res.message });\n          return {\n            success: false,\n            transactionId: txnId,\n            gateway,\n            mode: config.mode,\n            action: 'modal',\n            message: res.message || 'SSLCommerz session initialization failed.',\n          };\n        }\n\n        return {\n          success: true,\n          transactionId: txnId,\n          gateway,\n          mode: config.mode,\n          checkoutUrl: res.gatewayUrl,\n          action: 'redirect',\n        };\n      }\n\n      if (gateway === 'shurjopay') {\n        const res = await ShurjoPayService.initPayment(config, txn, appBaseUrl);\n        return {\n          success: true,\n          transactionId: txnId,\n          gateway,\n          mode: config.mode,\n          checkoutUrl: res.checkoutUrl,\n          action: 'redirect',\n        };\n      }\n\n      if (gateway === 'aamarpay') {\n        const res = await AamarPayService.initPayment(config, txn, appBaseUrl, channel);\n        if (!res.success || !res.gatewayUrl) {\n          paymentStore.updateTransactionStatus(txnId, 'failed', { failure_reason: res.message });\n          return {\n            success: false,\n            transactionId: txnId,\n            gateway,\n            mode: config.mode,\n            action: 'modal',\n            message: res.message || 'aamarPay session initialization failed.',\n          };\n        }\n\n        return {\n          success: true,\n          transactionId: txnId,\n          gateway,\n          mode: config.mode,\n          checkoutUrl: res.gatewayUrl,\n          action: 'redirect',\n        };\n      }\n\n      if (gateway === 'uddoktapay') {\n        const res = await UddoktaPayService.initPayment(config, txn, appBaseUrl, channel);\n        if (!res.success || !res.gatewayUrl) {\n          paymentStore.updateTransactionStatus(txnId, 'failed', { failure_reason: res.message });\n          return {\n            success: false,\n            transactionId: txnId,\n            gateway,\n            mode: config.mode,\n            action: 'modal',\n            message: res.message || 'UddoktaPay session initialization failed.',\n          };\n        }\n\n        return {\n          success: true,\n          transactionId: txnId,\n          gateway,\n          mode: config.mode,\n          checkoutUrl: res.gatewayUrl,\n          action: 'redirect',\n        };\n      }\n\n      return {\n        success: false,\n        transactionId: txnId,\n        gateway,\n        mode: config.mode,\n        action: 'modal',\n        message: `Unsupported gateway ${gateway}`,\n      };\n    } catch (err: any) {\n      paymentStore.updateTransactionStatus(txnId, 'failed', { failure_reason: err.message });\n      return {\n        success: false,\n        transactionId: txnId,\n        gateway,\n        mode: config.mode,\n        action: 'modal',\n        message: err.message || 'Unexpected server error during payment initiation.',\n      };\n    }\n  }\n\n  /**\n   * Handle bKash Callback & Server Verification\n   */\n  public static async handleBkashCallback(\n    queryParams: Record<string, any>\n  ): Promise<{ success: boolean; transactionId: string; message: string; transaction?: ServerTransaction }> {\n    const { paymentID, status, merchantInvoiceNumber } = queryParams;\n    const txnId = merchantInvoiceNumber || Object.keys(queryParams).find(k => k.startsWith('TXN-'));\n\n    if (!txnId) {\n      return { success: false, transactionId: '', message: 'Missing transaction reference in bKash callback.' };\n    }\n\n    const txn = paymentStore.getTransaction(txnId);\n    if (!txn) {\n      return { success: false, transactionId: txnId, message: 'Transaction record not found.' };\n    }\n\n    if (txn.status === 'paid') {\n      return { success: true, transactionId: txnId, message: 'Payment already verified.', transaction: txn };\n    }\n\n    if (status === 'cancel') {\n      paymentStore.updateTransactionStatus(txnId, 'cancelled', { failure_reason: 'User cancelled payment at bKash.' });\n      return { success: false, transactionId: txnId, message: 'Payment was cancelled.' };\n    }\n\n    if (status === 'failure') {\n      paymentStore.updateTransactionStatus(txnId, 'failed', { failure_reason: 'bKash returned failure status.' });\n      return { success: false, transactionId: txnId, message: 'Payment failed at bKash.' };\n    }\n\n    // Execute payment with bKash API\n    const config = paymentStore.getGatewayConfig('bkash') || { id: 'bkash', name: 'bKash', is_enabled: true, mode: 'test' };\n    const execRes = await BkashService.executePayment(config, paymentID || txn.transaction_id);\n\n    if (execRes.success) {\n      const updateResult = paymentStore.updateTransactionStatus(txnId, 'paid', {\n        gateway_transaction_id: execRes.trxID || `TRX_${Date.now()}`,\n        gateway_response: execRes.data,\n        paid_at: new Date().toISOString(),\n      });\n\n      if (updateResult.transaction) {\n        serverListingsStore.processVerifiedBid(updateResult.transaction);\n      }\n\n      return {\n        success: true,\n        transactionId: txnId,\n        message: 'Payment verified and confirmed by bKash.',\n        transaction: updateResult.transaction,\n      };\n    }\n\n    paymentStore.updateTransactionStatus(txnId, 'failed', { failure_reason: execRes.message });\n    return {\n      success: false,\n      transactionId: txnId,\n      message: execRes.message || 'bKash verification failed.',\n    };\n  }\n\n  /**\n   * Handle SSLCommerz Callback & Server-to-Server Validation\n   */\n  public static async handleSSLCommerzCallback(\n    bodyOrQuery: Record<string, any>\n  ): Promise<{ success: boolean; transactionId: string; message: string; transaction?: ServerTransaction }> {\n    const { tran_id, val_id, status, error } = bodyOrQuery;\n    const txnId = tran_id;\n\n    if (!txnId) {\n      return { success: false, transactionId: '', message: 'Missing tran_id in SSLCommerz payload.' };\n    }\n\n    const txn = paymentStore.getTransaction(txnId);\n    if (!txn) {\n      return { success: false, transactionId: txnId, message: 'Transaction record not found.' };\n    }\n\n    // Idempotency: if already paid, return existing success state\n    if (txn.status === 'paid') {\n      return { success: true, transactionId: txnId, message: 'Transaction already paid.', transaction: txn };\n    }\n\n    if (status === 'CANCELLED') {\n      paymentStore.updateTransactionStatus(txnId, 'cancelled', { failure_reason: 'User cancelled payment at SSLCommerz.' });\n      return { success: false, transactionId: txnId, message: 'Payment was cancelled.' };\n    }\n\n    if (status === 'FAILED') {\n      paymentStore.updateTransactionStatus(txnId, 'failed', { failure_reason: error || 'SSLCommerz payment failed.' });\n      return { success: false, transactionId: txnId, message: 'Payment failed at SSLCommerz.' };\n    }\n\n    // Validate server-to-server with SSLCommerz API\n    const config = paymentStore.getGatewayConfig('sslcommerz') || { id: 'sslcommerz', name: 'SSLCommerz', is_enabled: true, mode: 'test' };\n    const valRes = await SSLCommerzService.validateTransaction(config, val_id || 'SSL_DEMO_01', txn.amount, txn.transaction_id);\n\n    if (valRes.valid) {\n      const update = paymentStore.updateTransactionStatus(txnId, 'paid', {\n        gateway_transaction_id: val_id || `VAL_${Date.now()}`,\n        gateway_response: valRes.data,\n        paid_at: new Date().toISOString(),\n      });\n\n      if (update.transaction) {\n        serverListingsStore.processVerifiedBid(update.transaction);\n      }\n\n      return {\n        success: true,\n        transactionId: txnId,\n        message: 'SSLCommerz payment validated successfully.',\n        transaction: update.transaction,\n      };\n    }\n\n    paymentStore.updateTransactionStatus(txnId, 'failed', { failure_reason: valRes.message || 'Validation failed' });\n    return {\n      success: false,\n      transactionId: txnId,\n      message: valRes.message || 'SSLCommerz validation failed.',\n    };\n  }\n\n  /**\n   * Handle Nagad Callback & Verification\n   */\n  public static async handleNagadCallback(\n    queryParams: Record<string, any>\n  ): Promise<{ success: boolean; transactionId: string; message: string; transaction?: ServerTransaction }> {\n    const { payment_ref_id, order_id, status } = queryParams;\n    const txnId = order_id;\n\n    if (!txnId) {\n      return { success: false, transactionId: '', message: 'Missing order_id in Nagad callback.' };\n    }\n\n    const txn = paymentStore.getTransaction(txnId);\n    if (!txn) {\n      return { success: false, transactionId: txnId, message: 'Transaction not found.' };\n    }\n\n    if (txn.status === 'paid') {\n      return { success: true, transactionId: txnId, message: 'Already marked as paid.', transaction: txn };\n    }\n\n    const config = paymentStore.getGatewayConfig('nagad') || { id: 'nagad', name: 'Nagad', is_enabled: true, mode: 'test' };\n    const verifyRes = await NagadService.verifyPayment(config, payment_ref_id || 'NAGAD_REF');\n\n    if (verifyRes.verified) {\n      const update = paymentStore.updateTransactionStatus(txnId, 'paid', {\n        gateway_transaction_id: payment_ref_id || `NAGAD_${Date.now()}`,\n        gateway_response: verifyRes.data,\n        paid_at: new Date().toISOString(),\n      });\n\n      if (update.transaction) {\n        serverListingsStore.processVerifiedBid(update.transaction);\n      }\n\n      return {\n        success: true,\n        transactionId: txnId,\n        message: 'Nagad payment successfully verified.',\n        transaction: update.transaction,\n      };\n    }\n\n    paymentStore.updateTransactionStatus(txnId, 'failed', { failure_reason: verifyRes.message });\n    return {\n      success: false,\n      transactionId: txnId,\n      message: verifyRes.message || 'Nagad verification failed.',\n    };\n  }\n\n  /**\n   * Handle DBBL Rocket Callback & Verification\n   */\n  public static async handleRocketCallback(\n    queryParams: Record<string, any>\n  ): Promise<{ success: boolean; transactionId: string; message: string; transaction?: ServerTransaction }> {\n    const { order_id } = queryParams;\n    const txnId = order_id;\n\n    if (!txnId) {\n      return { success: false, transactionId: '', message: 'Missing order_id in Rocket callback.' };\n    }\n\n    const txn = paymentStore.getTransaction(txnId);\n    if (!txn) {\n      return { success: false, transactionId: txnId, message: 'Transaction not found.' };\n    }\n\n    if (txn.status === 'paid') {\n      return { success: true, transactionId: txnId, message: 'Already paid.', transaction: txn };\n    }\n\n    const config = paymentStore.getGatewayConfig('rocket') || { id: 'rocket', name: 'Rocket', is_enabled: true, mode: 'test' };\n    const verifyRes = await RocketService.verifyPayment(config, order_id);\n\n    if (verifyRes.verified) {\n      const update = paymentStore.updateTransactionStatus(txnId, 'paid', {\n        gateway_transaction_id: `ROCKET_TRX_${Date.now()}`,\n        gateway_response: verifyRes.data,\n        paid_at: new Date().toISOString(),\n      });\n\n      if (update.transaction) {\n        serverListingsStore.processVerifiedBid(update.transaction);\n      }\n\n      return {\n        success: true,\n        transactionId: txnId,\n        message: 'Rocket transaction confirmed.',\n        transaction: update.transaction,\n      };\n    }\n\n    paymentStore.updateTransactionStatus(txnId, 'failed', { failure_reason: verifyRes.message });\n    return {\n      success: false,\n      transactionId: txnId,\n      message: verifyRes.message || 'Rocket verification failed.',\n    };\n  }\n\n  /**\n   * Handle aamarPay Callback & Server-to-Server Verification\n   */\n  public static async handleAamarPayCallback(\n    bodyOrQuery: Record<string, any>\n  ): Promise<{ success: boolean; transactionId: string; message: string; transaction?: ServerTransaction }> {\n    const { mer_txnid, tran_id, pg_txnid, pay_status, status, error_title, error_desc, reason } = bodyOrQuery;\n    const txnId = mer_txnid || tran_id || Object.keys(bodyOrQuery).find(k => k.startsWith('TXN-'));\n\n    if (!txnId) {\n      return { success: false, transactionId: '', message: 'Missing transaction identifier in aamarPay callback.' };\n    }\n\n    const txn = paymentStore.getTransaction(txnId);\n    if (!txn) {\n      return { success: false, transactionId: txnId, message: 'Transaction record not found.' };\n    }\n\n    // Idempotency: If already paid, return confirmed transaction\n    if (txn.status === 'paid') {\n      return { success: true, transactionId: txnId, message: 'Transaction already verified and paid.', transaction: txn };\n    }\n\n    const normalizedStatus = (pay_status || status || '').toString().toLowerCase();\n\n    if (normalizedStatus.includes('cancel')) {\n      paymentStore.updateTransactionStatus(txnId, 'cancelled', {\n        failure_reason: 'User cancelled payment at aamarPay checkout.',\n      });\n      return { success: false, transactionId: txnId, message: 'Payment was cancelled.' };\n    }\n\n    if (normalizedStatus.includes('fail') || normalizedStatus.includes('reject')) {\n      paymentStore.updateTransactionStatus(txnId, 'failed', {\n        failure_reason: error_title || error_desc || reason || 'aamarPay payment failed.',\n      });\n      return { success: false, transactionId: txnId, message: 'Payment failed at aamarPay.' };\n    }\n\n    // Server-to-Server Verification\n    const config = paymentStore.getGatewayConfig('aamarpay') || {\n      id: 'aamarpay',\n      name: 'aamarPay',\n      is_enabled: true,\n      mode: 'test',\n    };\n\n    const verifyTargetId = pg_txnid || txnId;\n    const verifyRes = await AamarPayService.verifyTransaction(config, verifyTargetId, txn.amount, txn.transaction_id);\n\n    if (verifyRes.valid) {\n      const update = paymentStore.updateTransactionStatus(txnId, 'paid', {\n        gateway_transaction_id: pg_txnid || verifyRes.data?.pg_txnid || `AAMAR_${Date.now()}`,\n        gateway_response: { ...bodyOrQuery, verification: verifyRes.data },\n        paid_at: new Date().toISOString(),\n      });\n\n      if (update.transaction) {\n        serverListingsStore.processVerifiedBid(update.transaction);\n      }\n\n      return {\n        success: true,\n        transactionId: txnId,\n        message: 'aamarPay payment successfully verified.',\n        transaction: update.transaction,\n      };\n    }\n\n    paymentStore.updateTransactionStatus(txnId, 'failed', {\n      failure_reason: verifyRes.message || 'aamarPay server verification failed.',\n    });\n\n    return {\n      success: false,\n      transactionId: txnId,\n      message: verifyRes.message || 'aamarPay server verification failed.',\n    };\n  }\n\n  /**\n   * Handle UddoktaPay Callback & Server Verification\n   */\n  public static async handleUddoktaPayCallback(\n    bodyOrQuery: Record<string, any>\n  ): Promise<{ success: boolean; transactionId: string; message: string; transaction?: ServerTransaction }> {\n    const invoice_id = bodyOrQuery.invoice_id || bodyOrQuery.invoiceId;\n    const status = (bodyOrQuery.status || '').toString().toLowerCase();\n    const txnIdQuery = bodyOrQuery.txn || bodyOrQuery.transaction_id;\n\n    if (status === 'cancel' || status === 'cancelled') {\n      if (txnIdQuery) {\n        paymentStore.updateTransactionStatus(txnIdQuery, 'cancelled', {\n          failure_reason: 'User cancelled payment at UddoktaPay checkout.',\n        });\n      }\n      return { success: false, transactionId: txnIdQuery || '', message: 'Payment was cancelled at UddoktaPay.' };\n    }\n\n    if (!invoice_id) {\n      return { success: false, transactionId: txnIdQuery || '', message: 'Missing invoice_id in UddoktaPay callback.' };\n    }\n\n    // Lookup transaction either from txn query parameter or by finding matching transaction\n    let txn = txnIdQuery ? paymentStore.getTransaction(txnIdQuery) : undefined;\n\n    // Server-to-Server Verification with UddoktaPay API\n    const config = paymentStore.getGatewayConfig('uddoktapay') || {\n      id: 'uddoktapay',\n      name: 'UddoktaPay',\n      is_enabled: true,\n      mode: 'test',\n    };\n\n    const verifyRes = await UddoktaPayService.verifyPayment(\n      config,\n      invoice_id,\n      txn?.amount,\n      txn?.transaction_id\n    );\n\n    if (!verifyRes.valid) {\n      if (txn) {\n        paymentStore.updateTransactionStatus(txn.transaction_id, 'failed', {\n          failure_reason: verifyRes.message || 'UddoktaPay server verification failed.',\n        });\n      }\n      return {\n        success: false,\n        transactionId: txn?.transaction_id || '',\n        message: verifyRes.message || 'UddoktaPay payment verification failed.',\n      };\n    }\n\n    // If txn wasn't found by query param, resolve from verify data metadata\n    if (!txn) {\n      const metaTxnId = verifyRes.data?.metadata?.transaction_id || verifyRes.data?.metadata?.order_id;\n      if (metaTxnId) {\n        txn = paymentStore.getTransaction(metaTxnId);\n      }\n    }\n\n    if (!txn) {\n      const allTxns = paymentStore.getAllTransactions();\n      txn = allTxns.find(t => t.gateway === 'uddoktapay' && t.status === 'pending');\n    }\n\n    if (!txn) {\n      return { success: false, transactionId: '', message: 'Associated transaction record not found.' };\n    }\n\n    // Idempotency check: if already paid, return existing confirmed transaction\n    if (txn.status === 'paid') {\n      return { success: true, transactionId: txn.transaction_id, message: 'Transaction already verified and paid.', transaction: txn };\n    }\n\n    // Re-check exact amount\n    const verifiedAmount = parseFloat(verifyRes.data?.amount || verifyRes.data?.charged_amount || '0');\n    if (txn.amount > 0 && Math.abs(verifiedAmount - txn.amount) > 0.01) {\n      paymentStore.updateTransactionStatus(txn.transaction_id, 'failed', {\n        failure_reason: `Amount mismatch: expected \u09F3${txn.amount}, received \u09F3${verifiedAmount}`,\n      });\n      return {\n        success: false,\n        transactionId: txn.transaction_id,\n        message: `Amount mismatch: expected \u09F3${txn.amount}, received \u09F3${verifiedAmount}`,\n      };\n    }\n\n    const update = paymentStore.updateTransactionStatus(txn.transaction_id, 'paid', {\n      gateway_transaction_id: verifyRes.data?.transaction_id || invoice_id,\n      gateway_response: { ...bodyOrQuery, verification: verifyRes.data },\n      paid_at: new Date().toISOString(),\n    });\n\n    if (update.transaction) {\n      serverListingsStore.processVerifiedBid(update.transaction);\n    }\n\n    return {\n      success: true,\n      transactionId: txn.transaction_id,\n      message: 'UddoktaPay payment successfully verified.',\n      transaction: update.transaction,\n    };\n  }\n\n  /**\n   * Handle UddoktaPay Webhook / IPN Notification\n   */\n  public static async handleUddoktaPayIpn(\n    payload: Record<string, any>,\n    headers?: Record<string, any>\n  ): Promise<{ success: boolean; message: string; transaction?: ServerTransaction }> {\n    const invoice_id = payload.invoice_id || payload.invoiceId;\n    const apiKeyHeader = headers?.['rt-uddoktapay-api-key'] || headers?.['RT-UDDOKTAPAY-API-KEY'];\n\n    const config = paymentStore.getGatewayConfig('uddoktapay') || {\n      id: 'uddoktapay',\n      name: 'UddoktaPay',\n      is_enabled: true,\n      mode: 'test',\n    };\n\n    // Security check on IPN webhook if API key header sent\n    const configuredKey = UddoktaPayService.getApiKey(config);\n    if (apiKeyHeader && configuredKey && apiKeyHeader !== configuredKey) {\n      return { success: false, message: 'Unauthorized IPN request: API Key mismatch.' };\n    }\n\n    if (!invoice_id) {\n      return { success: false, message: 'Missing invoice_id in IPN payload.' };\n    }\n\n    const metaTxnId = payload.metadata?.transaction_id || payload.metadata?.order_id;\n    let txn = metaTxnId ? paymentStore.getTransaction(metaTxnId) : undefined;\n\n    // Server-to-server verification\n    const verifyRes = await UddoktaPayService.verifyPayment(\n      config,\n      invoice_id,\n      txn?.amount,\n      txn?.transaction_id\n    );\n\n    if (!verifyRes.valid) {\n      return { success: false, message: verifyRes.message || 'IPN verification failed.' };\n    }\n\n    if (!txn) {\n      const verifiedMetaTxnId = verifyRes.data?.metadata?.transaction_id;\n      if (verifiedMetaTxnId) {\n        txn = paymentStore.getTransaction(verifiedMetaTxnId);\n      }\n    }\n\n    if (!txn) {\n      return { success: false, message: 'Transaction not found for verified IPN.' };\n    }\n\n    // Idempotency: avoid double processing\n    if (txn.status === 'paid') {\n      return { success: true, message: 'Transaction already paid and processed.', transaction: txn };\n    }\n\n    const update = paymentStore.updateTransactionStatus(txn.transaction_id, 'paid', {\n      gateway_transaction_id: verifyRes.data?.transaction_id || invoice_id,\n      gateway_response: { ipn_payload: payload, verification: verifyRes.data },\n      paid_at: new Date().toISOString(),\n    });\n\n    if (update.transaction) {\n      serverListingsStore.processVerifiedBid(update.transaction);\n    }\n\n    return {\n      success: true,\n      message: 'UddoktaPay IPN processed successfully.',\n      transaction: update.transaction,\n    };\n  }\n\n  /**\n   * Handle Test Sandbox Simulator Actions\n   */\n  public static async simulateSandboxCompletion(\n    transactionId: string,\n    action: 'success' | 'fail' | 'cancel'\n  ): Promise<{ success: boolean; message: string; transaction?: ServerTransaction }> {\n    const txn = paymentStore.getTransaction(transactionId);\n    if (!txn) {\n      return { success: false, message: 'Transaction not found.' };\n    }\n\n    if (action === 'success') {\n      const update = paymentStore.updateTransactionStatus(transactionId, 'paid', {\n        gateway_transaction_id: `SIM_${txn.gateway.toUpperCase()}_${Date.now()}`,\n        gateway_response: {\n          simulated: true,\n          mode: 'test_sandbox',\n          timestamp: new Date().toISOString(),\n        },\n        paid_at: new Date().toISOString(),\n      });\n\n      if (update.transaction) {\n        serverListingsStore.processVerifiedBid(update.transaction);\n      }\n\n      return {\n        success: true,\n        message: `Sandbox payment completed and verified via ${txn.gateway.toUpperCase()}.`,\n        transaction: update.transaction,\n      };\n    }\n\n    if (action === 'cancel') {\n      paymentStore.updateTransactionStatus(transactionId, 'cancelled', {\n        failure_reason: 'User cancelled payment in sandbox simulator.',\n      });\n      return { success: false, message: 'Sandbox payment cancelled.' };\n    }\n\n    paymentStore.updateTransactionStatus(transactionId, 'failed', {\n      failure_reason: 'Simulated payment failure (e.g. insufficient funds or bad OTP).',\n    });\n    return { success: false, message: 'Sandbox payment failed.' };\n  }\n}\n", "import fs from 'fs';\nimport path from 'path';\n\nexport interface VisitorSettings {\n  is_enabled: boolean;\n  show_active_visitors: boolean;\n  show_total_visitors: boolean;\n  baseline_active: number;\n  baseline_total: number;\n}\n\nexport interface VisitorStatsResponse {\n  activeVisitors: number;\n  totalVisitors: number;\n  settings: VisitorSettings;\n}\n\nconst DEFAULT_SETTINGS: VisitorSettings = {\n  is_enabled: true,\n  show_active_visitors: true,\n  show_total_visitors: true,\n  baseline_active: 0,\n  baseline_total: 1317970,\n};\n\nclass VisitorStore {\n  private activeSessions: Map<string, { lastPing: number; isCountedInTotal: boolean }> = new Map();\n  private totalVisitors: number = 280;\n  private settings: VisitorSettings = { ...DEFAULT_SETTINGS };\n  private filePath: string = path.join(process.cwd(), 'data', 'visitor_stats.json');\n\n  constructor() {\n    this.loadFromDisk();\n  }\n\n  private loadFromDisk(): void {\n    try {\n      if (fs.existsSync(this.filePath)) {\n        const raw = fs.readFileSync(this.filePath, 'utf-8');\n        const data = JSON.parse(raw);\n        if (typeof data.totalVisitors === 'number') {\n          this.totalVisitors = data.totalVisitors;\n        }\n        if (data.settings && typeof data.settings === 'object') {\n          this.settings = { ...DEFAULT_SETTINGS, ...data.settings };\n        }\n      } else {\n        this.saveToDisk();\n      }\n    } catch (e) {\n      console.warn('[VisitorStore] Failed to load visitor stats from disk, using defaults:', e);\n    }\n  }\n\n  private saveToDisk(): void {\n    try {\n      const dir = path.dirname(this.filePath);\n      if (!fs.existsSync(dir)) {\n        fs.mkdirSync(dir, { recursive: true });\n      }\n      const data = {\n        updatedAt: new Date().toISOString(),\n        totalVisitors: this.totalVisitors,\n        settings: this.settings,\n      };\n      fs.writeFileSync(this.filePath, JSON.stringify(data, null, 2), 'utf-8');\n    } catch (e) {\n      console.error('[VisitorStore] Failed to save visitor stats to disk:', e);\n    }\n  }\n\n  /**\n   * Remove inactive sessions older than 30 seconds\n   */\n  private pruneSessions(): void {\n    const now = Date.now();\n    const expiryWindow = 30000; // 30 seconds\n    for (const [clientId, session] of this.activeSessions.entries()) {\n      if (now - session.lastPing > expiryWindow) {\n        this.activeSessions.delete(clientId);\n      }\n    }\n  }\n\n  /**\n   * Handle client heartbeat ping.\n   * Increments total count for new client sessions, updates last active timestamp, and returns real stats.\n   */\n  public ping(clientId: string): VisitorStatsResponse {\n    this.pruneSessions();\n    const now = Date.now();\n\n    const existing = this.activeSessions.get(clientId);\n    if (!existing) {\n      // Brand new session detected\n      this.activeSessions.set(clientId, { lastPing: now, isCountedInTotal: true });\n      this.totalVisitors += 1;\n      this.saveToDisk();\n    } else {\n      // Existing session ping update\n      existing.lastPing = now;\n    }\n\n    return this.getStats();\n  }\n\n  /**\n   * Get current real-time stats\n   */\n  public getStats(): VisitorStatsResponse {\n    this.pruneSessions();\n\n    const realActiveCount = this.activeSessions.size;\n    const computedActive = Math.max(1, realActiveCount + (this.settings.baseline_active || 0));\n    const computedTotal = Math.max(0, this.totalVisitors + (this.settings.baseline_total || 0));\n\n    return {\n      activeVisitors: computedActive,\n      totalVisitors: computedTotal,\n      settings: { ...this.settings },\n    };\n  }\n\n  /**\n   * Update admin settings for counters\n   */\n  public updateSettings(newSettings: Partial<VisitorSettings>): VisitorStatsResponse {\n    this.settings = {\n      ...this.settings,\n      ...newSettings,\n    };\n    this.saveToDisk();\n    return this.getStats();\n  }\n\n  /**\n   * Reset stats (active sessions, total visitors, or both)\n   */\n  public resetStats(type: 'active' | 'total' | 'all', customActive?: number, customTotal?: number): VisitorStatsResponse {\n    if (type === 'active' || type === 'all') {\n      this.activeSessions.clear();\n      if (typeof customActive === 'number') {\n        this.settings.baseline_active = customActive;\n      }\n    }\n\n    if (type === 'total' || type === 'all') {\n      this.totalVisitors = 0;\n      if (typeof customTotal === 'number') {\n        this.settings.baseline_total = customTotal;\n      }\n    }\n\n    this.saveToDisk();\n    return this.getStats();\n  }\n\n  /**\n   * Directly set baseline counts\n   */\n  public setCustomCounts(baselineActive?: number, baselineTotal?: number): VisitorStatsResponse {\n    if (typeof baselineActive === 'number') {\n      this.settings.baseline_active = baselineActive;\n    }\n    if (typeof baselineTotal === 'number') {\n      this.settings.baseline_total = baselineTotal;\n    }\n    this.saveToDisk();\n    return this.getStats();\n  }\n}\n\nexport const visitorStore = new VisitorStore();\n"],
  "mappings": "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",
  "names": ["import_path", "import_fs", "path", "fs", "import_fs", "import_path", "path", "fs", "token", "crypto", "import_fs", "import_path", "path", "fs", "express", "path", "fs", "createViteServer"]
}
