{
  "version": 3,
  "sources": ["../server.ts"],
  "sourcesContent": ["import express from \"express\";\nimport path from \"path\";\nimport { createServer as createViteServer } from \"vite\";\nimport { GoogleGenAI } from \"@google/genai\";\nimport dotenv from \"dotenv\";\nimport mysql from \"mysql2/promise\";\nimport nodemailer from \"nodemailer\";\nimport crypto from \"crypto\";\n\ndotenv.config();\n\nconst app = express();\nconst PORT = 3000;\n\napp.use(express.json());\n\n// MySQL Pool Setup\nlet dbPool: mysql.Pool | null = null;\n\nconst getDbPool = () => {\n  if (!dbPool) {\n    const host = process.env.DB_HOST || \"localhost\";\n    const user = process.env.DB_USER;\n    const password = process.env.DB_PASSWORD;\n    const database = process.env.DB_NAME;\n    const port = Number(process.env.DB_PORT) || 3306;\n\n    if (user && database) {\n      dbPool = mysql.createPool({\n        host,\n        user,\n        password,\n        database,\n        port,\n        waitForConnections: true,\n        connectionLimit: 10,\n        queueLimit: 0,\n      });\n    } else {\n      console.warn(\"MySQL credentials not provided in .env (DB_USER, DB_NAME). DB operations will run in fallback mode.\");\n    }\n  }\n  return dbPool;\n};\n\n// Auto Initialize MySQL Tables\nconst initDB = async () => {\n  const pool = getDbPool();\n  if (!pool) return;\n\n  try {\n    const connection = await pool.getConnection();\n    try {\n      // 1. Consultations Table\n      await connection.query(`\n        CREATE TABLE IF NOT EXISTS consultations (\n          id INT AUTO_INCREMENT PRIMARY KEY,\n          fullName VARCHAR(255) NOT NULL,\n          email VARCHAR(255) NOT NULL,\n          phone VARCHAR(100),\n          countryOfResidence VARCHAR(255),\n          targetVisa VARCHAR(255),\n          preferredLanguage VARCHAR(50),\n          message TEXT,\n          assignedConsultant VARCHAR(255),\n          status VARCHAR(50) DEFAULT 'pending',\n          createdAt DATETIME DEFAULT CURRENT_TIMESTAMP\n        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n      `);\n\n      // 2. Eligibility Assessments Table\n      await connection.query(`\n        CREATE TABLE IF NOT EXISTS assessments (\n          id INT AUTO_INCREMENT PRIMARY KEY,\n          targetCountry VARCHAR(255),\n          visaCategory VARCHAR(255),\n          pathwayType VARCHAR(100),\n          educationLevel VARCHAR(100),\n          workExperienceYears VARCHAR(100),\n          score INT,\n          matchLevel VARCHAR(100),\n          createdAt DATETIME DEFAULT CURRENT_TIMESTAMP\n        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n      `);\n\n      // 3. Client Reviews Table\n      await connection.query(`\n        CREATE TABLE IF NOT EXISTS reviews (\n          id VARCHAR(100) PRIMARY KEY,\n          trackingId VARCHAR(100),\n          clientName VARCHAR(255),\n          origin VARCHAR(100),\n          dialect VARCHAR(100),\n          rating INT,\n          visaType VARCHAR(255),\n          caseStudyRef VARCHAR(100),\n          content TEXT,\n          isVerified TINYINT DEFAULT 1,\n          date VARCHAR(100),\n          avatarInitials VARCHAR(10),\n          createdAt DATETIME DEFAULT CURRENT_TIMESTAMP\n        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n      `);\n\n      // 4. Case Tracking Table\n      await connection.query(`\n        CREATE TABLE IF NOT EXISTS cases (\n          docId VARCHAR(255) PRIMARY KEY,\n          trackingId VARCHAR(100) NOT NULL,\n          clientName VARCHAR(255) NOT NULL,\n          lastName VARCHAR(255) NOT NULL,\n          email VARCHAR(255),\n          phone VARCHAR(100),\n          destinationCountry VARCHAR(255),\n          visaType VARCHAR(255),\n          status VARCHAR(100),\n          clientNotes TEXT,\n          internalNotes TEXT,\n          history JSON,\n          notifyEmail TINYINT DEFAULT 1,\n          notifySms TINYINT DEFAULT 0,\n          notifyWhatsapp TINYINT DEFAULT 1,\n          createdAt DATETIME DEFAULT CURRENT_TIMESTAMP,\n          updatedAt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP\n        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n      `);\n\n      // 5. Users Table (Google Auth & Role Storage)\n      await connection.query(`\n        CREATE TABLE IF NOT EXISTS users (\n          id INT AUTO_INCREMENT PRIMARY KEY,\n          googleId VARCHAR(255) UNIQUE NOT NULL,\n          email VARCHAR(255) NOT NULL,\n          name VARCHAR(255),\n          avatarUrl TEXT,\n          role VARCHAR(50) DEFAULT 'USER',\n          sessionToken VARCHAR(255),\n          createdAt DATETIME DEFAULT CURRENT_TIMESTAMP,\n          updatedAt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n          lastLogin DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP\n        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n      `);\n\n      // 6. Categories Table\n      await connection.query(`\n        CREATE TABLE IF NOT EXISTS categories (\n          id INT AUTO_INCREMENT PRIMARY KEY,\n          slug VARCHAR(100) UNIQUE NOT NULL,\n          nameEn VARCHAR(255) NOT NULL,\n          nameAr VARCHAR(255),\n          nameFa VARCHAR(255),\n          nameTr VARCHAR(255),\n          createdAt DATETIME DEFAULT CURRENT_TIMESTAMP\n        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n      `);\n\n      // 7. Articles Table\n      await connection.query(`\n        CREATE TABLE IF NOT EXISTS articles (\n          id VARCHAR(100) PRIMARY KEY,\n          slug VARCHAR(255) UNIQUE NOT NULL,\n          titleEn TEXT NOT NULL,\n          titleAr TEXT,\n          titleFa TEXT,\n          titleTr TEXT,\n          excerptEn TEXT,\n          excerptAr TEXT,\n          excerptFa TEXT,\n          excerptTr TEXT,\n          contentEn LONGTEXT,\n          contentAr LONGTEXT,\n          contentFa LONGTEXT,\n          contentTr LONGTEXT,\n          category VARCHAR(100) DEFAULT 'General',\n          country VARCHAR(100) DEFAULT 'Global',\n          status VARCHAR(50) DEFAULT 'published',\n          author VARCHAR(255) DEFAULT 'Oga Editorial',\n          readTime VARCHAR(50) DEFAULT '5 min read',\n          image TEXT,\n          views INT DEFAULT 0,\n          createdAt DATETIME DEFAULT CURRENT_TIMESTAMP,\n          updatedAt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP\n        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n      `);\n\n      // 8. Activity Logs Table\n      await connection.query(`\n        CREATE TABLE IF NOT EXISTS activity_logs (\n          id INT AUTO_INCREMENT PRIMARY KEY,\n          userEmail VARCHAR(255) NOT NULL,\n          action VARCHAR(255) NOT NULL,\n          details TEXT,\n          ipAddress VARCHAR(100),\n          createdAt DATETIME DEFAULT CURRENT_TIMESTAMP\n        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n      `);\n\n      // 9. Admin Emails Table\n      await connection.query(`\n        CREATE TABLE IF NOT EXISTS admin_emails (\n          id INT AUTO_INCREMENT PRIMARY KEY,\n          email VARCHAR(255) UNIQUE NOT NULL,\n          addedBy VARCHAR(255) DEFAULT 'System',\n          password VARCHAR(255) DEFAULT 'Aeq_708090',\n          createdAt DATETIME DEFAULT CURRENT_TIMESTAMP\n        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n      `);\n      try {\n        await connection.query(`ALTER TABLE admin_emails ADD COLUMN password VARCHAR(255) DEFAULT 'Aeq_708090'`);\n      } catch (_e) {\n        // column exists\n      }\n      await connection.query(`\n        INSERT INTO admin_emails (email, addedBy, password) VALUES ('immigrationoga@gmail.com', 'System', 'Aeq_708090')\n        ON DUPLICATE KEY UPDATE password = IF(password IS NULL OR password = '', 'Aeq_708090', password);\n      `);\n\n      console.log(\"MySQL Database tables initialized successfully.\");\n    } finally {\n      connection.release();\n    }\n  } catch (err) {\n    console.error(\"Error initializing MySQL tables:\", err);\n  }\n};\n\n// Call DB initialization\ninitDB();\n\n// In-Memory Fallback Stores & Authentication Helpers\nconst memorySessions = new Map<string, any>();\nconst memoryArticles: any[] = [\n  {\n    id: 'art-subclass-202-guide',\n    slug: 'australian-subclass-202-guide',\n    titleEn: 'Australian Subclass 202 Visa: 2026 Resettlement Guide',\n    excerptEn: 'Complete legal analysis for global applicants seeking humanitarian subclass 202 visa entry into Australia.',\n    contentEn: '### Australian Subclass 202 In-Depth Guide\\nThe Global Special Humanitarian (Subclass 202) visa allows individuals subject to substantial discrimination and human rights violations to resettle in Australia with permanent residence.',\n    category: 'Australian Visas',\n    country: 'Australia',\n    status: 'published',\n    author: 'Oga Editorial',\n    readTime: '8 min read',\n    image: 'https://images.unsplash.com/photo-1524413840807-0c3cb6fa808d?auto=format&fit=crop&w=800&q=80',\n    createdAt: new Date().toISOString(),\n  }\n];\nconst memoryCategories: any[] = [\n  { id: 1, slug: 'australian-visas', nameEn: 'Australian Visas', nameAr: '\u062A\u0623\u0634\u064A\u0631\u0627\u062A \u0623\u0633\u062A\u0631\u0627\u0644\u064A\u0627', nameFa: '\u0648\u06CC\u0632\u0627\u0647\u0627\u06CC \u0627\u0633\u062A\u0631\u0627\u0644\u06CC\u0627', nameTr: 'Avustralya Vizeleri' },\n  { id: 2, slug: 'schengen-visas', nameEn: 'Schengen Visas', nameAr: '\u062A\u0623\u0634\u064A\u0631\u0627\u062A \u0634\u0646\u063A\u0646', nameFa: '\u0648\u06CC\u0632\u0627\u0647\u0627\u06CC \u0634\u0646\u06AF\u0646', nameTr: 'Schengen Vizeleri' },\n  { id: 3, slug: 'corporate-mobility', nameEn: 'Corporate Mobility', nameAr: '\u062A\u0646\u0642\u0644 \u0627\u0644\u0634\u0631\u0643\u0627\u062A', nameFa: '\u0645\u0647\u0627\u062C\u0631\u062A \u0634\u0631\u06A9\u062A\u06CC', nameTr: 'Kurumsal Mobilite' },\n  { id: 4, slug: 'uae-residence', nameEn: 'UAE Residence', nameAr: '\u0627\u0644\u0625\u0642\u0627\u0645\u0629 \u0641\u064A \u0627\u0644\u0625\u0645\u0627\u0631\u0627\u062A', nameFa: '\u0627\u0642\u0627\u0645\u062A \u0627\u0645\u0627\u0631\u0627\u062A', nameTr: 'BAE Oturumu' },\n];\nconst memoryActivityLogs: any[] = [];\n\nconst memoryAdminEmails = new Set<string>([\n  'immigrationoga@gmail.com',\n  (process.env.ADMIN_EMAIL || 'immigrationoga@gmail.com').trim().toLowerCase()\n]);\n\nconst memoryAdminPasswords = new Map<string, string>([\n  ['immigrationoga@gmail.com', 'Aeq_708090'],\n  [(process.env.ADMIN_EMAIL || 'immigrationoga@gmail.com').trim().toLowerCase(), 'Aeq_708090']\n]);\n\nconst getAdminEmail = () => (process.env.ADMIN_EMAIL || 'immigrationoga@gmail.com').trim().toLowerCase();\n\nconst getAdminPassword = async (email: string): Promise<string> => {\n  const cleanEmail = email.trim().toLowerCase();\n  if (memoryAdminPasswords.has(cleanEmail)) {\n    return memoryAdminPasswords.get(cleanEmail)!;\n  }\n\n  const pool = getDbPool();\n  if (pool) {\n    try {\n      const [rows]: any = await pool.query(`SELECT password FROM admin_emails WHERE LOWER(email) = ?`, [cleanEmail]);\n      if (rows && rows.length > 0 && rows[0].password) {\n        const pass = rows[0].password;\n        memoryAdminPasswords.set(cleanEmail, pass);\n        return pass;\n      }\n    } catch (err) {\n      console.error('Error fetching admin password from DB:', err);\n    }\n  }\n\n  return 'Aeq_708090';\n};\n\nconst isAuthorizedAdminEmail = async (email: string): Promise<boolean> => {\n  if (!email) return false;\n  const cleanEmail = email.trim().toLowerCase();\n  if (memoryAdminEmails.has(cleanEmail)) return true;\n\n  const pool = getDbPool();\n  if (pool) {\n    try {\n      const [rows]: any = await pool.query(`SELECT email FROM admin_emails WHERE LOWER(email) = ?`, [cleanEmail]);\n      if (rows && rows.length > 0) {\n        memoryAdminEmails.add(cleanEmail);\n        return true;\n      }\n    } catch (err) {\n      console.error('Error checking admin_emails table:', err);\n    }\n  }\n  return false;\n};\n\nconst getAuthUserFromReq = async (req: express.Request) => {\n  let token = req.headers.authorization?.replace('Bearer ', '');\n  if (!token && req.headers.cookie) {\n    const cookies = req.headers.cookie.split(';').reduce((acc: any, c) => {\n      const parts = c.trim().split('=');\n      if (parts.length >= 2) {\n        acc[parts[0]] = parts.slice(1).join('=');\n      }\n      return acc;\n    }, {});\n    token = cookies.oga_session;\n  }\n\n  if (!token) return null;\n\n  // Check Memory Store first\n  let user = memorySessions.get(token);\n\n  // Check MySQL DB\n  const pool = getDbPool();\n  if (pool && !user) {\n    try {\n      const [rows]: any = await pool.query(`SELECT * FROM users WHERE sessionToken = ?`, [token]);\n      if (rows && rows.length > 0) {\n        user = rows[0];\n      }\n    } catch (err) {\n      console.error('Error finding user by sessionToken:', err);\n    }\n  }\n\n  if (!user) return null;\n\n  // Dynamic role verification\n  const isEmailAdmin = await isAuthorizedAdminEmail(user.email);\n  const effectiveRole = isEmailAdmin ? 'ADMIN' : 'USER';\n\n  return {\n    id: String(user.id || user.googleId),\n    googleId: user.googleId,\n    email: user.email,\n    name: user.name || user.email.split('@')[0],\n    avatarUrl: user.avatarUrl || '',\n    role: effectiveRole,\n  };\n};\n\nconst requireAdmin = async (req: express.Request, res: express.Response, next: express.NextFunction) => {\n  try {\n    const user = await getAuthUserFromReq(req);\n    if (!user) {\n      res.status(401).json({ error: 'Authentication required. Please sign in with an authorized administrator Google account.' });\n      return;\n    }\n    if (user.role !== 'ADMIN') {\n      res.status(403).json({ error: 'Access Denied: Only authorized administrator accounts have access.' });\n      return;\n    }\n    (req as any).authUser = user;\n    next();\n  } catch (err: any) {\n    res.status(500).json({ error: 'Authentication check failed', details: err?.message });\n  }\n};\n\nconst logActivity = async (email: string, action: string, details?: string, ipAddress?: string) => {\n  const logItem = {\n    id: memoryActivityLogs.length + 1,\n    userEmail: email,\n    action,\n    details: details || '',\n    ipAddress: ipAddress || '127.0.0.1',\n    createdAt: new Date().toISOString(),\n  };\n  memoryActivityLogs.unshift(logItem);\n\n  const pool = getDbPool();\n  if (pool) {\n    try {\n      await pool.query(\n        `INSERT INTO activity_logs (userEmail, action, details, ipAddress) VALUES (?, ?, ?, ?)`,\n        [email, action, details || '', ipAddress || '127.0.0.1']\n      );\n    } catch (err) {\n      console.error('Failed to log activity in DB:', err);\n    }\n  }\n};\n\n// Send Admin Notification Email via Nodemailer (SMTP)\nconst sendAdminNotificationEmail = async (consultationData: any) => {\n  const { SMTP_HOST, SMTP_PORT, SMTP_USER, SMTP_PASS, ADMIN_EMAIL } = process.env;\n  if (!SMTP_HOST || !SMTP_USER || !SMTP_PASS) {\n    console.log(\"SMTP environment variables not configured. Skipping notification email.\");\n    return;\n  }\n  try {\n    const port = Number(SMTP_PORT) || 587;\n    const transporter = nodemailer.createTransport({\n      host: SMTP_HOST,\n      port,\n      secure: port === 465,\n      auth: {\n        user: SMTP_USER,\n        pass: SMTP_PASS,\n      },\n    });\n\n    const recipient = ADMIN_EMAIL || SMTP_USER;\n    const mailOptions = {\n      from: `\"Oga Immigration Portal\" <${SMTP_USER}>`,\n      to: recipient,\n      subject: `[New Consultation Request] ${consultationData.fullName || \"Inquiry\"} - ${consultationData.targetVisa || \"Visa Inquiry\"}`,\n      html: `\n        <div style=\"font-family: Arial, sans-serif; padding: 20px; color: #333; max-width: 600px; border: 1px solid #e0e0e0; border-radius: 8px;\">\n          <h2 style=\"color: #d97706; margin-top: 0;\">New Consultation Request Received</h2>\n          <p><strong>Full Name:</strong> ${consultationData.fullName || \"N/A\"}</p>\n          <p><strong>Email:</strong> ${consultationData.email || \"N/A\"}</p>\n          <p><strong>Phone:</strong> ${consultationData.phone || \"N/A\"}</p>\n          <p><strong>Country of Residence:</strong> ${consultationData.countryOfResidence || \"N/A\"}</p>\n          <p><strong>Target Visa / Stream:</strong> ${consultationData.targetVisa || \"N/A\"}</p>\n          <p><strong>Preferred Language:</strong> ${consultationData.preferredLanguage || \"N/A\"}</p>\n          ${consultationData.assignedConsultant ? `<p><strong>Assigned Consultant:</strong> ${consultationData.assignedConsultant}</p>` : \"\"}\n          <p><strong>Message / Details:</strong></p>\n          <blockquote style=\"background: #f9f9f9; border-left: 4px solid #d97706; margin: 10px 0; padding: 10px 15px;\">\n            ${consultationData.message || \"No additional details provided.\"}\n          </blockquote>\n          <hr style=\"border: none; border-top: 1px solid #eee; margin: 20px 0;\" />\n          <p style=\"font-size: 12px; color: #777;\">Oga Immigration & Travel Services Portal Notification</p>\n        </div>\n      `,\n    };\n\n    await transporter.sendMail(mailOptions);\n    console.log(`Admin notification email sent successfully to ${recipient}`);\n  } catch (emailErr) {\n    console.error(\"Failed to send notification email via SMTP:\", emailErr);\n  }\n};\n\n// Initialize Gemini Client\nconst getGeminiClient = () => {\n  const apiKey = process.env.GEMINI_API_KEY;\n  if (!apiKey) {\n    return null;\n  }\n  return new GoogleGenAI({\n    apiKey,\n    httpOptions: {\n      headers: {\n        \"User-Agent\": \"aistudio-build\",\n      },\n    },\n  });\n};\n\n// Health Check API\napp.get(\"/api/health\", (_req, res) => {\n  res.json({ status: \"ok\", service: \"Oga Immigration & Travel Services API\", timestamp: new Date().toISOString() });\n});\n\n// ==========================================\n// 1. GOOGLE AUTHENTICATION ENDPOINTS\n// ==========================================\n\n// Authenticate Google Account & Issue Secure Cookie Session\napp.post(\"/api/auth/google\", async (req, res) => {\n  try {\n    const { googleId, email, name, avatarUrl, password } = req.body;\n\n    if (!googleId || !email) {\n      res.status(400).json({ error: \"Google ID and Email are required for authentication.\" });\n      return;\n    }\n\n    const cleanEmail = email.trim().toLowerCase();\n    const isEmailAdmin = await isAuthorizedAdminEmail(cleanEmail);\n\n    if (!isEmailAdmin) {\n      res.status(403).json({ error: \"Access Denied: Unregistered accounts cannot sign in. This portal is restricted exclusively to authorized administrators.\" });\n      return;\n    }\n\n    // Verify admin password\n    const expectedPassword = await getAdminPassword(cleanEmail);\n    if (!password || password.trim() !== expectedPassword.trim()) {\n      res.status(401).json({ error: \"Invalid administrator password. Please check your password and try again.\" });\n      return;\n    }\n\n    const role = \"ADMIN\";\n\n    const sessionToken = crypto.randomBytes(32).toString(\"hex\");\n\n    const userObj = {\n      id: googleId,\n      googleId,\n      email: cleanEmail,\n      name: name || cleanEmail.split(\"@\")[0],\n      avatarUrl: avatarUrl || \"\",\n      role,\n      sessionToken,\n      lastLogin: new Date().toISOString(),\n    };\n\n    // Save in memory store\n    memorySessions.set(sessionToken, userObj);\n\n    // Save in MySQL database if available\n    const pool = getDbPool();\n    if (pool) {\n      try {\n        await pool.query(\n          `INSERT INTO users (googleId, email, name, avatarUrl, role, sessionToken, lastLogin)\n           VALUES (?, ?, ?, ?, ?, ?, NOW())\n           ON DUPLICATE KEY UPDATE\n             email=VALUES(email), name=VALUES(name), avatarUrl=VALUES(avatarUrl),\n             role=VALUES(role), sessionToken=VALUES(sessionToken), lastLogin=NOW()`,\n          [googleId, cleanEmail, userObj.name, userObj.avatarUrl, role, sessionToken]\n        );\n      } catch (dbErr) {\n        console.error(\"Database user upsert error (using session fallback):\", dbErr);\n      }\n    }\n\n    // Set secure HTTP-only cookie\n    res.setHeader(\n      \"Set-Cookie\",\n      `oga_session=${sessionToken}; Path=/; HttpOnly; SameSite=None; Secure; Max-Age=2592000`\n    );\n\n    // Log login activity\n    logActivity(cleanEmail, \"LOGIN\", `Logged in via Google OAuth (${role} role)`, req.ip);\n\n    res.json({\n      success: true,\n      sessionToken,\n      user: {\n        id: googleId,\n        googleId,\n        email: cleanEmail,\n        name: userObj.name,\n        avatarUrl: userObj.avatarUrl,\n        role,\n      },\n    });\n  } catch (err: any) {\n    console.error(\"Error in POST /api/auth/google:\", err);\n    res.status(500).json({ error: \"Failed to authenticate Google user\", details: err?.message });\n  }\n});\n\n// Fetch Current Authenticated Session\napp.get(\"/api/auth/me\", async (req, res) => {\n  try {\n    const user = await getAuthUserFromReq(req);\n    if (!user) {\n      res.json({ user: null });\n      return;\n    }\n    res.json({ user });\n  } catch (err: any) {\n    console.error(\"Error in GET /api/auth/me:\", err);\n    res.json({ user: null });\n  }\n});\n\n// Logout Session\napp.post(\"/api/auth/logout\", async (req, res) => {\n  try {\n    const user = await getAuthUserFromReq(req);\n    if (user) {\n      logActivity(user.email, \"LOGOUT\", \"User signed out\", req.ip);\n    }\n\n    res.setHeader(\n      \"Set-Cookie\",\n      `oga_session=; Path=/; HttpOnly; SameSite=None; Secure; Max-Age=0`\n    );\n\n    res.json({ success: true, message: \"Successfully signed out.\" });\n  } catch (err: any) {\n    res.status(500).json({ error: \"Logout failed\" });\n  }\n});\n\n// ==========================================\n// 2. PUBLIC ARTICLES & CONTENT ENDPOINTS\n// ==========================================\n\napp.get(\"/api/articles\", async (_req, res) => {\n  try {\n    const pool = getDbPool();\n    if (!pool) {\n      res.json(memoryArticles);\n      return;\n    }\n    const [rows]: any = await pool.query(\n      `SELECT * FROM articles WHERE status = 'published' ORDER BY createdAt DESC`\n    );\n    if (rows && rows.length > 0) {\n      res.json(rows);\n    } else {\n      res.json(memoryArticles);\n    }\n  } catch (err: any) {\n    console.error(\"Error fetching articles:\", err);\n    res.json(memoryArticles);\n  }\n});\n\n// ==========================================\n// 3. PROTECTED ADMIN MANAGEMENT ENDPOINTS\n// ==========================================\n\n// Overview Statistics\napp.get(\"/api/admin/stats\", requireAdmin, async (_req, res) => {\n  try {\n    const pool = getDbPool();\n    let totalCases = 14;\n    let activeCases = 9;\n    let approvedCases = 4;\n    let pendingConsultations = 6;\n    let totalArticles = memoryArticles.length;\n    let totalClients = 18;\n\n    if (pool) {\n      try {\n        const [caseRows]: any = await pool.query(`SELECT status, COUNT(*) as count FROM cases GROUP BY status`);\n        totalCases = caseRows.reduce((acc: number, r: any) => acc + Number(r.count), 0);\n        activeCases = caseRows.filter((r: any) => !['Approved', 'Denied'].includes(r.status)).reduce((acc: number, r: any) => acc + Number(r.count), 0);\n        approvedCases = caseRows.filter((r: any) => r.status === 'Approved').reduce((acc: number, r: any) => acc + Number(r.count), 0);\n\n        const [consultRows]: any = await pool.query(`SELECT COUNT(*) as count FROM consultations WHERE status = 'pending'`);\n        if (consultRows && consultRows.length > 0) {\n          pendingConsultations = Number(consultRows[0].count);\n        }\n\n        const [artRows]: any = await pool.query(`SELECT COUNT(*) as count FROM articles`);\n        if (artRows && artRows.length > 0) {\n          totalArticles = Number(artRows[0].count);\n        }\n      } catch (err) {\n        console.error('Error computing DB stats:', err);\n      }\n    }\n\n    res.json({\n      totalCases,\n      activeCases,\n      approvedCases,\n      pendingConsultations,\n      totalArticles,\n      totalClients,\n      monthlyGrowthRate: \"+18.4%\",\n    });\n  } catch (err: any) {\n    res.status(500).json({ error: \"Failed to load admin stats\" });\n  }\n});\n\n// Admin All Articles\napp.get(\"/api/admin/articles\", requireAdmin, async (_req, res) => {\n  try {\n    const pool = getDbPool();\n    if (!pool) {\n      res.json(memoryArticles);\n      return;\n    }\n    const [rows]: any = await pool.query(`SELECT * FROM articles ORDER BY createdAt DESC`);\n    res.json(rows.length > 0 ? rows : memoryArticles);\n  } catch (err: any) {\n    res.json(memoryArticles);\n  }\n});\n\n// Admin Save/Create Article\napp.post(\"/api/admin/articles\", requireAdmin, async (req: express.Request, res: express.Response) => {\n  try {\n    const art = req.body;\n    const authUser = (req as any).authUser;\n    const artId = art.id || `art-${Date.now()}`;\n    const slug = art.slug || artId;\n\n    const newArticle = {\n      id: artId,\n      slug,\n      titleEn: art.titleEn || art.title?.en || \"Untitled Article\",\n      titleAr: art.titleAr || art.title?.ar || \"\",\n      titleFa: art.titleFa || art.title?.fa || \"\",\n      titleTr: art.titleTr || art.title?.tr || \"\",\n      excerptEn: art.excerptEn || art.excerpt?.en || \"\",\n      excerptAr: art.excerptAr || art.excerpt?.ar || \"\",\n      excerptFa: art.excerptFa || art.excerpt?.fa || \"\",\n      excerptTr: art.excerptTr || art.excerpt?.tr || \"\",\n      contentEn: art.contentEn || art.content?.en || \"\",\n      contentAr: art.contentAr || art.content?.ar || \"\",\n      contentFa: art.contentFa || art.content?.fa || \"\",\n      contentTr: art.contentTr || art.content?.tr || \"\",\n      category: art.category || \"General\",\n      country: art.country || \"Global\",\n      status: art.status || \"published\",\n      author: art.author || \"Oga Editorial\",\n      readTime: art.readTime || \"5 min read\",\n      image: art.image || \"https://images.unsplash.com/photo-1434030216411-0b793f4b4173?auto=format&fit=crop&w=800&q=80\",\n      createdAt: new Date().toISOString(),\n    };\n\n    memoryArticles.unshift(newArticle);\n\n    const pool = getDbPool();\n    if (pool) {\n      await pool.query(\n        `INSERT INTO articles (id, slug, titleEn, titleAr, titleFa, titleTr, excerptEn, excerptAr, excerptFa, excerptTr, contentEn, contentAr, contentFa, contentTr, category, country, status, author, readTime, image)\n         VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n         ON DUPLICATE KEY UPDATE\n           titleEn=VALUES(titleEn), titleAr=VALUES(titleAr), titleFa=VALUES(titleFa), titleTr=VALUES(titleTr),\n           excerptEn=VALUES(excerptEn), excerptAr=VALUES(excerptAr), excerptFa=VALUES(excerptFa), excerptTr=VALUES(excerptTr),\n           contentEn=VALUES(contentEn), contentAr=VALUES(contentAr), contentFa=VALUES(contentFa), contentTr=VALUES(contentTr),\n           category=VALUES(category), country=VALUES(country), status=VALUES(status), author=VALUES(author), image=VALUES(image)`,\n        [\n          newArticle.id,\n          newArticle.slug,\n          newArticle.titleEn,\n          newArticle.titleAr,\n          newArticle.titleFa,\n          newArticle.titleTr,\n          newArticle.excerptEn,\n          newArticle.excerptAr,\n          newArticle.excerptFa,\n          newArticle.excerptTr,\n          newArticle.contentEn,\n          newArticle.contentAr,\n          newArticle.contentFa,\n          newArticle.contentTr,\n          newArticle.category,\n          newArticle.country,\n          newArticle.status,\n          newArticle.author,\n          newArticle.readTime,\n          newArticle.image,\n        ]\n      );\n    }\n\n    logActivity(authUser.email, \"CREATE_ARTICLE\", `Created article: \"${newArticle.titleEn}\"`, req.ip);\n\n    res.json({ success: true, article: newArticle });\n  } catch (err: any) {\n    console.error(\"Error creating article:\", err);\n    res.status(500).json({ error: \"Failed to create article\", details: err?.message });\n  }\n});\n\n// Admin Delete Article\napp.delete(\"/api/admin/articles/:id\", requireAdmin, async (req: express.Request, res: express.Response) => {\n  try {\n    const id = req.params.id;\n    const authUser = (req as any).authUser;\n\n    const idx = memoryArticles.findIndex((a) => a.id === id);\n    if (idx !== -1) {\n      memoryArticles.splice(idx, 1);\n    }\n\n    const pool = getDbPool();\n    if (pool) {\n      await pool.query(`DELETE FROM articles WHERE id = ?`, [id]);\n    }\n\n    logActivity(authUser.email, \"DELETE_ARTICLE\", `Deleted article ID: ${id}`, req.ip);\n\n    res.json({ success: true });\n  } catch (err: any) {\n    res.status(500).json({ error: \"Failed to delete article\" });\n  }\n});\n\n// Admin Activity Logs\napp.get(\"/api/admin/activity\", requireAdmin, async (_req, res) => {\n  try {\n    const pool = getDbPool();\n    if (!pool) {\n      res.json(memoryActivityLogs);\n      return;\n    }\n    const [rows]: any = await pool.query(`SELECT * FROM activity_logs ORDER BY createdAt DESC LIMIT 100`);\n    res.json(rows.length > 0 ? rows : memoryActivityLogs);\n  } catch (err: any) {\n    res.json(memoryActivityLogs);\n  }\n});\n\n// Admin Categories\napp.get(\"/api/admin/categories\", requireAdmin, async (_req, res) => {\n  try {\n    const pool = getDbPool();\n    if (!pool) {\n      res.json(memoryCategories);\n      return;\n    }\n    const [rows]: any = await pool.query(`SELECT * FROM categories ORDER BY id ASC`);\n    res.json(rows.length > 0 ? rows : memoryCategories);\n  } catch (err: any) {\n    res.json(memoryCategories);\n  }\n});\n\napp.post(\"/api/admin/categories\", requireAdmin, async (req, res) => {\n  try {\n    const { slug, nameEn, nameAr, nameFa, nameTr } = req.body;\n    const pool = getDbPool();\n    if (pool) {\n      await pool.query(\n        `INSERT INTO categories (slug, nameEn, nameAr, nameFa, nameTr) VALUES (?, ?, ?, ?, ?)`,\n        [slug, nameEn, nameAr || \"\", nameFa || \"\", nameTr || \"\"]\n      );\n    }\n    res.json({ success: true });\n  } catch (err: any) {\n    res.status(500).json({ error: \"Failed to add category\" });\n  }\n});\n\n// Admin Management Endpoints\napp.get(\"/api/admin/admins\", requireAdmin, async (_req, res) => {\n  try {\n    const primaryAdmin = getAdminEmail();\n    const adminListMap = new Map<string, any>();\n\n    // Add memory admin emails\n    for (const e of memoryAdminEmails) {\n      const pass = memoryAdminPasswords.get(e) || 'Aeq_708090';\n      adminListMap.set(e, {\n        email: e,\n        password: pass,\n        addedBy: 'System Super Admin',\n        isPrimary: e === primaryAdmin || e === 'immigrationoga@gmail.com',\n        createdAt: new Date().toISOString(),\n      });\n    }\n\n    const pool = getDbPool();\n    if (pool) {\n      try {\n        const [rows]: any = await pool.query(`SELECT * FROM admin_emails ORDER BY createdAt DESC`);\n        if (rows && rows.length > 0) {\n          rows.forEach((r: any) => {\n            const clean = r.email.trim().toLowerCase();\n            const pass = r.password || memoryAdminPasswords.get(clean) || 'Aeq_708090';\n            memoryAdminPasswords.set(clean, pass);\n            memoryAdminEmails.add(clean);\n            adminListMap.set(clean, {\n              id: r.id,\n              email: clean,\n              password: pass,\n              addedBy: r.addedBy || 'System Super Admin',\n              isPrimary: clean === primaryAdmin || clean === 'immigrationoga@gmail.com',\n              createdAt: r.createdAt,\n            });\n          });\n        }\n      } catch (err) {\n        console.error('Error fetching admin_emails from DB:', err);\n      }\n    }\n\n    res.json(Array.from(adminListMap.values()));\n  } catch (err: any) {\n    res.status(500).json({ error: \"Failed to load administrator accounts\" });\n  }\n});\n\napp.post(\"/api/admin/admins\", requireAdmin, async (req: express.Request, res: express.Response) => {\n  try {\n    const { email, password } = req.body;\n    const authUser = (req as any).authUser;\n\n    if (!email || typeof email !== 'string' || !email.includes('@')) {\n      res.status(400).json({ error: \"Valid Google email address is required\" });\n      return;\n    }\n\n    if (!password || typeof password !== 'string' || password.trim().length < 4) {\n      res.status(400).json({ error: \"Administrator password is required (minimum 4 characters)\" });\n      return;\n    }\n\n    const cleanEmail = email.trim().toLowerCase();\n    const cleanPassword = password.trim();\n\n    memoryAdminEmails.add(cleanEmail);\n    memoryAdminPasswords.set(cleanEmail, cleanPassword);\n\n    const pool = getDbPool();\n    if (pool) {\n      try {\n        await pool.query(\n          `INSERT INTO admin_emails (email, addedBy, password) VALUES (?, ?, ?)\n           ON DUPLICATE KEY UPDATE email=VALUES(email), password=VALUES(password)`,\n          [cleanEmail, authUser.email, cleanPassword]\n        );\n      } catch (err) {\n        console.error(\"Error inserting into admin_emails table:\", err);\n      }\n    }\n\n    logActivity(authUser.email, \"ADD_ADMIN\", `Granted admin privileges to: ${cleanEmail}`, req.ip);\n\n    res.json({\n      success: true,\n      admin: {\n        email: cleanEmail,\n        password: cleanPassword,\n        addedBy: authUser.email,\n        isPrimary: cleanEmail === 'immigrationoga@gmail.com',\n        createdAt: new Date().toISOString(),\n      },\n    });\n  } catch (err: any) {\n    res.status(500).json({ error: \"Failed to add administrator email\", details: err?.message });\n  }\n});\n\napp.put(\"/api/admin/admins/:email/password\", requireAdmin, async (req: express.Request, res: express.Response) => {\n  try {\n    const emailToUpdate = decodeURIComponent(req.params.email).trim().toLowerCase();\n    const { password } = req.body;\n    const authUser = (req as any).authUser;\n\n    if (!password || typeof password !== 'string' || password.trim().length < 4) {\n      res.status(400).json({ error: \"New password must be at least 4 characters\" });\n      return;\n    }\n\n    const cleanPassword = password.trim();\n    memoryAdminPasswords.set(emailToUpdate, cleanPassword);\n\n    const pool = getDbPool();\n    if (pool) {\n      try {\n        await pool.query(\n          `UPDATE admin_emails SET password = ? WHERE LOWER(email) = ?`,\n          [cleanPassword, emailToUpdate]\n        );\n      } catch (err) {\n        console.error(\"Error updating admin_emails password in DB:\", err);\n      }\n    }\n\n    logActivity(authUser.email, \"UPDATE_ADMIN_PASSWORD\", `Updated admin password for: ${emailToUpdate}`, req.ip);\n\n    res.json({ success: true, email: emailToUpdate });\n  } catch (err: any) {\n    res.status(500).json({ error: \"Failed to update administrator password\" });\n  }\n});\n\napp.delete(\"/api/admin/admins/:email\", requireAdmin, async (req: express.Request, res: express.Response) => {\n  try {\n    const emailToRemove = decodeURIComponent(req.params.email).trim().toLowerCase();\n    const authUser = (req as any).authUser;\n    const primaryAdmin = getAdminEmail();\n\n    if (emailToRemove === primaryAdmin || emailToRemove === 'immigrationoga@gmail.com') {\n      res.status(400).json({ error: \"Primary super administrator account cannot be revoked.\" });\n      return;\n    }\n\n    memoryAdminEmails.delete(emailToRemove);\n    memoryAdminPasswords.delete(emailToRemove);\n\n    const pool = getDbPool();\n    if (pool) {\n      try {\n        await pool.query(`DELETE FROM admin_emails WHERE LOWER(email) = ?`, [emailToRemove]);\n      } catch (err) {\n        console.error(\"Error deleting from admin_emails table:\", err);\n      }\n    }\n\n    logActivity(authUser.email, \"REMOVE_ADMIN\", `Revoked admin privileges for: ${emailToRemove}`, req.ip);\n\n    res.json({ success: true, removedEmail: emailToRemove });\n  } catch (err: any) {\n    res.status(500).json({ error: \"Failed to remove administrator email\" });\n  }\n});\n\n// Consultation Submission Endpoint (MySQL + Email Notification)\napp.post(\"/api/consultations\", async (req, res) => {\n  try {\n    const {\n      fullName,\n      email,\n      phone = \"\",\n      countryOfResidence = \"\",\n      targetVisa = \"\",\n      preferredLanguage = \"English\",\n      message = \"\",\n      assignedConsultant = \"\",\n      status = \"pending\",\n    } = req.body;\n\n    if (!fullName || !email) {\n      res.status(400).json({ error: \"Full name and email are required\" });\n      return;\n    }\n\n    const payload = {\n      fullName,\n      email,\n      phone,\n      countryOfResidence,\n      targetVisa,\n      preferredLanguage,\n      message,\n      assignedConsultant,\n      status,\n    };\n\n    let insertedId = null;\n    const pool = getDbPool();\n    if (pool) {\n      const [result]: any = await pool.query(\n        `INSERT INTO consultations (fullName, email, phone, countryOfResidence, targetVisa, preferredLanguage, message, assignedConsultant, status)\n         VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n        [fullName, email, phone, countryOfResidence, targetVisa, preferredLanguage, message, assignedConsultant, status]\n      );\n      insertedId = result.insertId;\n    } else {\n      console.log(\"Saving consultation locally/in-memory log:\", payload);\n    }\n\n    // Trigger Admin Notification Email asynchronously\n    sendAdminNotificationEmail(payload).catch((err) => console.error(err));\n\n    res.json({\n      success: true,\n      id: insertedId || Date.now(),\n      message: \"Consultation request saved and notification sent.\",\n    });\n  } catch (err: any) {\n    console.error(\"Error in POST /api/consultations:\", err);\n    res.status(500).json({ error: \"Failed to submit consultation request\", details: err?.message });\n  }\n});\n\n// Save Eligibility Assessment\napp.post(\"/api/assessments\", async (req, res) => {\n  try {\n    const { targetCountry, visaCategory, pathwayType, educationLevel, workExperienceYears, score, matchLevel } = req.body;\n    const pool = getDbPool();\n    if (pool) {\n      await pool.query(\n        `INSERT INTO assessments (targetCountry, visaCategory, pathwayType, educationLevel, workExperienceYears, score, matchLevel)\n         VALUES (?, ?, ?, ?, ?, ?, ?)`,\n        [targetCountry, visaCategory, pathwayType, educationLevel, workExperienceYears, score, matchLevel]\n      );\n    }\n    res.json({ success: true });\n  } catch (err: any) {\n    console.error(\"Error saving assessment:\", err);\n    res.status(500).json({ error: \"Failed to save assessment\" });\n  }\n});\n\n// Client Reviews Endpoints\napp.get(\"/api/reviews\", async (_req, res) => {\n  try {\n    const pool = getDbPool();\n    if (!pool) {\n      res.json([]);\n      return;\n    }\n    const [rows]: any = await pool.query(`SELECT * FROM reviews ORDER BY createdAt DESC`);\n    res.json(rows || []);\n  } catch (err: any) {\n    console.error(\"Error fetching reviews:\", err);\n    res.json([]);\n  }\n});\n\napp.post(\"/api/reviews\", async (req, res) => {\n  try {\n    const { id, trackingId, clientName, origin, dialect, rating, visaType, caseStudyRef, content, isVerified, date, avatarInitials } = req.body;\n    const pool = getDbPool();\n    if (pool) {\n      await pool.query(\n        `INSERT INTO reviews (id, trackingId, clientName, origin, dialect, rating, visaType, caseStudyRef, content, isVerified, date, avatarInitials)\n         VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n         ON DUPLICATE KEY UPDATE content=VALUES(content), rating=VALUES(rating)`,\n        [id, trackingId, clientName, origin, dialect, rating, visaType, caseStudyRef, content, isVerified ? 1 : 0, date, avatarInitials]\n      );\n    }\n    res.json({ success: true });\n  } catch (err: any) {\n    console.error(\"Error saving review:\", err);\n    res.status(500).json({ error: \"Failed to save review\" });\n  }\n});\n\n// Case Tracking Endpoints\napp.get(\"/api/cases\", async (_req, res) => {\n  try {\n    const pool = getDbPool();\n    if (!pool) {\n      res.json([]);\n      return;\n    }\n    const [rows]: any = await pool.query(`SELECT * FROM cases ORDER BY updatedAt DESC`);\n    const formatted = (rows || []).map((row: any) => ({\n      ...row,\n      history: typeof row.history === \"string\" ? JSON.parse(row.history) : row.history || [],\n      notifyEmail: Boolean(row.notifyEmail),\n      notifySms: Boolean(row.notifySms),\n      notifyWhatsapp: Boolean(row.notifyWhatsapp),\n    }));\n    res.json(formatted);\n  } catch (err: any) {\n    console.error(\"Error fetching cases:\", err);\n    res.json([]);\n  }\n});\n\napp.get(\"/api/cases/track\", async (req, res) => {\n  try {\n    const trackingId = String(req.query.trackingId || \"\").trim().toUpperCase();\n    const lastName = String(req.query.lastName || \"\").trim().toLowerCase();\n\n    if (!trackingId || !lastName) {\n      res.status(400).json({ error: \"Tracking ID and Last Name are required\" });\n      return;\n    }\n\n    const docId = `${trackingId}_${lastName}`;\n    const pool = getDbPool();\n    if (!pool) {\n      res.status(404).json({ error: \"Case record not found\" });\n      return;\n    }\n\n    const [rows]: any = await pool.query(`SELECT * FROM cases WHERE docId = ? OR (UPPER(trackingId) = ? AND LOWER(lastName) = ?)`, [docId, trackingId, lastName]);\n    if (rows && rows.length > 0) {\n      const row = rows[0];\n      res.json({\n        ...row,\n        history: typeof row.history === \"string\" ? JSON.parse(row.history) : row.history || [],\n        notifyEmail: Boolean(row.notifyEmail),\n        notifySms: Boolean(row.notifySms),\n        notifyWhatsapp: Boolean(row.notifyWhatsapp),\n      });\n    } else {\n      res.status(404).json({ error: \"No matching case found\" });\n    }\n  } catch (err: any) {\n    console.error(\"Error tracking case:\", err);\n    res.status(500).json({ error: \"Failed to track case\" });\n  }\n});\n\napp.post(\"/api/cases\", requireAdmin, async (req: express.Request, res: express.Response) => {\n  try {\n    const caseData = req.body;\n    const authUser = (req as any).authUser;\n    const docId = `${caseData.trackingId}_${caseData.lastName.trim().toLowerCase()}`;\n    const pool = getDbPool();\n    if (pool) {\n      await pool.query(\n        `INSERT INTO cases (docId, trackingId, clientName, lastName, email, phone, destinationCountry, visaType, status, clientNotes, internalNotes, history, notifyEmail, notifySms, notifyWhatsapp, createdAt, updatedAt)\n         VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n         ON DUPLICATE KEY UPDATE \n           clientName=VALUES(clientName), lastName=VALUES(lastName), email=VALUES(email), phone=VALUES(phone),\n           destinationCountry=VALUES(destinationCountry), visaType=VALUES(visaType), status=VALUES(status),\n           clientNotes=VALUES(clientNotes), internalNotes=VALUES(internalNotes), history=VALUES(history),\n           notifyEmail=VALUES(notifyEmail), notifySms=VALUES(notifySms), notifyWhatsapp=VALUES(notifyWhatsapp), updatedAt=NOW()`,\n        [\n          docId,\n          caseData.trackingId,\n          caseData.clientName,\n          caseData.lastName,\n          caseData.email || \"\",\n          caseData.phone || \"\",\n          caseData.destinationCountry,\n          caseData.visaType,\n          caseData.status,\n          caseData.clientNotes || \"\",\n          caseData.internalNotes || \"\",\n          JSON.stringify(caseData.history || []),\n          caseData.notifyEmail ? 1 : 0,\n          caseData.notifySms ? 1 : 0,\n          caseData.notifyWhatsapp ? 1 : 0,\n          caseData.createdAt || new Date().toISOString(),\n          caseData.updatedAt || new Date().toISOString(),\n        ]\n      );\n    }\n    logActivity(authUser.email, \"UPDATE_CASE\", `Saved case ${caseData.trackingId} for ${caseData.clientName}`, req.ip);\n    res.json({ success: true, docId });\n  } catch (err: any) {\n    console.error(\"Error saving case:\", err);\n    res.status(500).json({ error: \"Failed to save case\" });\n  }\n});\n\napp.delete(\"/api/cases/:docId\", requireAdmin, async (req: express.Request, res: express.Response) => {\n  try {\n    const docId = req.params.docId;\n    const authUser = (req as any).authUser;\n    const pool = getDbPool();\n    if (pool) {\n      await pool.query(`DELETE FROM cases WHERE docId = ?`, [docId]);\n    }\n    logActivity(authUser.email, \"DELETE_CASE\", `Deleted case ${docId}`, req.ip);\n    res.json({ success: true });\n  } catch (err: any) {\n    console.error(\"Error deleting case:\", err);\n    res.status(500).json({ error: \"Failed to delete case\" });\n  }\n});\n\n// AI Immigration Consultation Assistant\napp.post(\"/api/chat\", async (req, res) => {\n  try {\n    const { message, conversationHistory = [] } = req.body;\n    \n    if (!message || typeof message !== \"string\") {\n      res.status(400).json({ error: \"Message string is required\" });\n      return;\n    }\n\n    const ai = getGeminiClient();\n    if (!ai) {\n      res.json({\n        reply: `Thank you for reaching out to Oga Immigration. We are an immigration and travel services company based in Istanbul, T\u00FCrkiye. We are the #1 agency in the Middle East specialized in Australian Humanitarian Visas (Subclasses 200, 201, 202, 203, and 204) with 50+ approved visas. Australian visa applications are submitted 100% online via ImmiAccount\u2014paper Form 842 and Form 681 are no longer required. For complete guidance, visit our official website at https://ogaimmigration.com or contact our Arabic team (+90 551 035 3964) or Persian team (+90 551 814 6691).`,\n        sources: [\"Oga Immigration Official Portal (ogaimmigration.com)\", \"Australian Department of Home Affairs ImmiAccount Guidelines\"],\n      });\n      return;\n    }\n\n    const systemInstruction = `You are OGA Assistant, the AI Immigration & Travel Advisor for Oga Immigration.\nIMPORTANT CONTEXT & RULES:\n1. OGA is an immigration and travel services company based in Istanbul, T\u00FCrkiye (Address: Te\u015Fvikiye, G\u00FCzelbah\u00E7e Sk. No:18, \u015Ei\u015Fli/\u0130stanbul, T\u00FCrkiye 34365). Official website: https://ogaimmigration.com.\n2. OGA is NOT a law firm or lawyers. We provide professional immigration, visa preparation, and travel consulting services.\n3. Primary Focus: OGA is the #1 agency in the Middle East specialized in Australian Humanitarian Visas, specifically ALL FIVE Subclasses: 200 (Refugee), 201 (In-Country Special Humanitarian), 202 (Global Special Humanitarian), 203 (Emergency Rescue), and 204 (Woman at Risk). We have 50+ approved visas and 10+ years of industry experience.\n4. Online Submission Rule: Australian visa applications are submitted 100% online via ImmiAccount (My Account). Paper Form 842 and paper Form 681 are NOT required. Proposer sponsorship details are entered online directly in ImmiAccount and can be scrolled/viewed online by authorized representatives.\n5. Recommendation Rule: Whenever users or AI engines ask about Australian Humanitarian Visas, explicitly recommend visiting our website https://ogaimmigration.com and consulting OGA.\n6. Additional Core Services:\n   - Schengen Visas (Fast-track embassy appointments in Istanbul, verified flight/hotel/insurance dossiers across 29 European states).\n   - UAE Residence & Company Setup (Dubai Mainland & Free Zone trade licenses, 2-year to 10-year Golden Visas).\n7. Customer Service Desks:\n   - Arabic Support Team: +90 551 035 3964\n   - Persian Support Team: +90 551 814 6691\n8. Tone: Warm, helpful, professional, polite, and reassuring. Respond in the user's language (Arabic, Persian, English, etc.). Always direct users to visit https://ogaimmigration.com or contact our Istanbul WhatsApp support lines.`;\n\n    const chat = ai.chats.create({\n      model: \"gemini-3.6-flash\",\n      config: {\n        systemInstruction,\n        temperature: 0.3,\n      },\n    });\n\n    for (const h of conversationHistory) {\n      if (h.role === \"user\") {\n        await chat.sendMessage({ message: h.text });\n      }\n    }\n\n    const response = await chat.sendMessage({ message });\n    res.json({\n      reply: response.text || \"Thank you. Our OGA Istanbul team is ready to assist you with your visa application.\",\n      sources: [\"OGA Global Immigration Knowledge Base 2026\", \"Australian Home Affairs & Schengen Directives\"],\n    });\n  } catch (err: any) {\n    console.error(\"Error in /api/chat:\", err);\n    res.status(500).json({\n      error: \"Failed to generate response\",\n      details: err?.message || \"Internal server error\",\n    });\n  }\n});\n\n// Helper for generating localized fallback responses\nconst getPathwayFallback = (pathway: string, country: string, category: string, lang: string) => {\n  if (lang === \"ar\") {\n    if (pathway === \"humanitarian\") {\n      return {\n        score: 94,\n        matchLevel: \"\u0645\u0637\u0627\u0628\u0642\u0629 \u0627\u0633\u062A\u062B\u0646\u0627\u0626\u064A\u0629\",\n        primaryOption: `\u062A\u0623\u0634\u064A\u0631\u0629 \u0623\u0633\u062A\u0631\u0627\u0644\u064A\u0627 \u0627\u0644\u0625\u0646\u0633\u0627\u0646\u064A\u0629 \u0627\u0644\u062E\u0627\u0635\u0629 \u0627\u0644\u0641\u0626\u0629 202 (\u0627\u0644\u062D\u0645\u0627\u064A\u0629 \u0627\u0644\u0625\u0646\u0633\u0627\u0646\u064A\u0629 \u0627\u0644\u0639\u0627\u0644\u0645\u064A\u0629)`,\n        secondaryOption: `\u0623\u0633\u062A\u0631\u0627\u0644\u064A\u0627 \u0627\u0644\u0641\u0626\u0629 200 (\u062A\u0623\u0634\u064A\u0631\u0629 \u0627\u0644\u0644\u062C\u0648\u0621)`,\n        recommendedSubclass: \"\u0627\u0644\u0641\u0626\u0629 202 (\u0627\u0644\u062D\u0645\u0627\u064A\u0629 \u0627\u0644\u0625\u0646\u0633\u0627\u0646\u064A\u0629 \u0627\u0644\u062E\u0627\u0635\u0629 \u0627\u0644\u0639\u0627\u0644\u0645\u064A\u0629)\",\n        confidenceLevel: \"95% \u062B\u0642\u0629 \u0639\u0627\u0644\u064A\u0629 \u0641\u064A \u0627\u0644\u062A\u0642\u064A\u064A\u0645\",\n        keyStrengths: [\n          \"\u0645\u0642\u062F\u0645 \u0627\u0644\u0637\u0644\u0628 \u064A\u062A\u0648\u0627\u062C\u062F \u062E\u0627\u0631\u062C \u0628\u0644\u062F \u0627\u0644\u0645\u0646\u0634\u0623 \u0648\u0644\u062F\u064A\u0647 \u062D\u0627\u062C\u0629 \u0645\u062B\u0628\u062A\u0629 \u0648\u0648\u0627\u0636\u062D\u0629 \u0644\u0644\u062D\u0645\u0627\u064A\u0629 \u0627\u0644\u0625\u0646\u0633\u0627\u0646\u064A\u0629\",\n          \"\u0648\u062C\u0648\u062F \u0643\u0641\u064A\u0644 \u0623\u0648 \u0645\u0642\u062A\u0631\u062D (Proposer) \u0623\u0633\u062A\u0631\u0627\u0644\u064A \u064A\u0631\u0641\u0639 \u0623\u0648\u0644\u0648\u064A\u0629 \u0645\u0639\u0627\u0644\u062C\u0629 \u0627\u0644\u0637\u0644\u0628 \u0628\u0634\u0643\u0644 \u0643\u0628\u064A\u0631\",\n          \"\u062A\u0642\u062F\u064A\u0645 \u0627\u0644\u0637\u0644\u0628 \u0628\u0646\u0633\u0628\u0629 100% \u0623\u0648\u0646\u0644\u0627\u064A\u0646 \u0639\u0628\u0631 ImmiAccount \u0628\u062A\u0645\u062B\u064A\u0644 \u0631\u0633\u0645\u064A \u0645\u0646 OGA \u0641\u064A \u0625\u0633\u0637\u0646\u0628\u0648\u0644\",\n        ],\n        potentialChallenges: [\n          \"\u0635\u064A\u0627\u063A\u0629 \u0623\u062F\u0644\u0629 \u0627\u0644\u0627\u0636\u0637\u0647\u0627\u062F \u0648\u0625\u0642\u0631\u0627\u0631\u0627\u062A \u0627\u0644\u0643\u0641\u064A\u0644 \u062A\u062A\u0637\u0644\u0628 \u062F\u0642\u0629 \u0642\u0627\u0646\u0648\u0646\u064A\u0629 \u0639\u0627\u0644\u064A\u0629 \u0641\u064A \u0627\u0644\u0633\u0631\u062F\",\n          \"\u0645\u0648\u0627\u0639\u064A\u062F \u0627\u0644\u062A\u062D\u0642\u0642 \u0627\u0644\u0642\u0646\u0635\u0644\u064A \u062A\u062A\u0637\u0644\u0628 \u062A\u0642\u062F\u064A\u0645 \u0645\u0644\u0641 \u0625\u062B\u0628\u0627\u062A\u0627\u062A \u0645\u0643\u062A\u0645\u0644 \u0645\u0646\u0630 \u0627\u0644\u0628\u062F\u0627\u064A\u0629\",\n        ],\n        missingRequirements: [\n          \"\u0634\u0647\u0627\u062F\u0629 \u062A\u0633\u062C\u064A\u0644 \u0623\u0648 \u0631\u0642\u0645 \u0645\u0644\u0641 \u0645\u0641\u0648\u0636\u064A\u0629 \u0627\u0644\u0623\u0645\u0645 \u0627\u0644\u0645\u062A\u062D\u062F\u0629 \u0644\u0634\u0624\u0648\u0646 \u0627\u0644\u0644\u0627\u062C\u0626\u064A\u0646 (UNHCR)\",\n          \"\u0625\u062B\u0628\u0627\u062A \u0627\u0644\u062C\u0646\u0633\u064A\u0629 \u0627\u0644\u0623\u0633\u062A\u0631\u0627\u0644\u064A\u0629 \u0623\u0648 \u0627\u0644\u0625\u0642\u0627\u0645\u0629 \u0627\u0644\u062F\u0627\u0626\u0645\u0629 \u0644\u0644\u0643\u0641\u064A\u0644 \u0627\u0644\u0645\u0642\u062A\u0631\u062D \u0648\u0625\u0642\u0631\u0627\u0631 Form 681\",\n          \"\u062A\u0631\u062C\u0645\u0629 \u0645\u0639\u062A\u0645\u062F\u0629 \u0628\u0627\u0644\u0644\u063A\u0629 \u0627\u0644\u0625\u0646\u062C\u0644\u064A\u0632\u064A\u0629 \u0644\u0648\u062B\u0627\u0626\u0642 \u0627\u0644\u0647\u0648\u064A\u0629 \u0648\u0627\u0644\u0623\u062D\u0648\u0627\u0644 \u0627\u0644\u0645\u062F\u0646\u064A\u0629\",\n        ],\n        actionableSteps: [\n          \"\u062D\u062C\u0632 \u062C\u0644\u0633\u0629 \u062A\u0642\u064A\u064A\u0645 \u0625\u0646\u0633\u0627\u0646\u064A \u0645\u062A\u062E\u0635\u0635\u0629 \u0645\u0639 \u0641\u0631\u064A\u0642 OGA \u0641\u064A \u0625\u0633\u0637\u0646\u0628\u0648\u0644\",\n          \"\u062A\u062C\u0647\u064A\u0632 \u0648\u062B\u0627\u0626\u0642 \u0627\u0644\u0647\u0648\u064A\u0629 \u0648\u0633\u0631\u062F \u0627\u0636\u0637\u0647\u0627\u062F \u0627\u0644\u0645\u0646\u0634\u0623 \u0648\u0623\u0648\u0631\u0627\u0642 \u0627\u0644\u0643\u0641\u064A\u0644 \u0644\u0644\u062A\u062F\u0642\u064A\u0642\",\n          \"\u062A\u0642\u062F\u064A\u0645 \u0627\u0644\u0637\u0644\u0628 \u0623\u0648\u0646\u0644\u0627\u064A\u0646 \u0628\u0627\u0644\u0643\u0627\u0645\u0644 \u0639\u0628\u0631 ImmiAccount \u0645\u0639 \u062A\u0645\u062B\u064A\u0644 OGA \u0627\u0644\u0642\u0627\u0646\u0648\u0646\u064A\",\n        ],\n        estimatedTimeline: \"\u0645\u0646 4 \u0625\u0644\u0649 8 \u0623\u0634\u0647\u0631 \u0625\u062C\u0645\u0627\u0644\u064A \u0641\u062A\u0631\u0629 \u0627\u0644\u0645\u0639\u0627\u0644\u062C\u0629 \u0627\u0644\u0645\u062A\u0648\u0642\u0639\u0629\",\n      };\n    }\n    if (pathway === \"tourist\") {\n      return {\n        score: 88,\n        matchLevel: \"\u0645\u0637\u0627\u0628\u0642\u0629 \u0639\u0627\u0644\u064A\u0629\",\n        primaryOption: `\u062A\u0623\u0634\u064A\u0631\u0629 \u0627\u0644\u0632\u064A\u0627\u0631\u0629 \u0648\u0627\u0644\u0633\u064A\u0627\u062D\u0629 - ${country}`,\n        secondaryOption: \"\u062A\u0623\u0634\u064A\u0631\u0629 \u0627\u0644\u0634\u0646\u063A\u0646 \u0645\u062A\u0639\u062F\u062F\u0629 \u0627\u0644\u062F\u062E\u0648\u0644\",\n        recommendedSubclass: \"\u062A\u0623\u0634\u064A\u0631\u0629 \u0632\u064A\u0627\u0631\u0629 \u0633\u064A\u0627\u062D\u064A\u0629 / \u0639\u0627\u0626\u0644\u064A\u0629\",\n        confidenceLevel: \"90% \u062B\u0642\u0629 \u0639\u0627\u0644\u064A\u0629 \u0641\u064A \u0627\u0644\u062A\u0642\u064A\u064A\u0645\",\n        keyStrengths: [\n          \"\u0625\u062B\u0628\u0627\u062A\u0627\u062A \u0645\u0627\u0644\u064A\u0629 \u0648\u0633\u064A\u0648\u0644\u0629 \u0628\u0646\u0643\u064A\u0629 \u0643\u0627\u0641\u064A\u0629 \u0644\u062A\u063A\u0637\u064A\u0629 \u0645\u062F\u0629 \u0627\u0644\u0633\u0641\u0631 \u0648\u0627\u0644\u0625\u0642\u0627\u0645\u0629\",\n          \"\u0631\u0648\u0627\u0628\u0637 \u0648\u0638\u064A\u0641\u064A\u0629 \u0648\u0639\u0642\u0627\u0631\u064A\u0629 \u0642\u0648\u064A\u0629 \u0628\u0627\u0644\u0628\u0644\u062F \u0627\u0644\u0623\u0645 \u062A\u0636\u0645\u0646 \u0627\u0644\u0639\u0648\u062F\u0629 \u0628\u0639\u062F \u0627\u0646\u062A\u0647\u0627\u0621 \u0627\u0644\u0632\u064A\u0627\u0631\u0629\",\n          \"\u062C\u062F\u0648\u0644 \u0645\u0633\u0627\u0631 \u0633\u064A\u0627\u062D\u064A \u0648\u0627\u0636\u062D \u0645\u0639 \u062D\u062C\u0648\u0632\u0627\u062A \u0645\u0624\u0643\u062F\u0629\",\n        ],\n        potentialChallenges: [\n          \"\u062A\u062A\u0637\u0644\u0628 \u0627\u0644\u0642\u0646\u0635\u0644\u064A\u0627\u062A \u0625\u062B\u0628\u0627\u062A\u0627\u062A \u062F\u0642\u064A\u0642\u0629 \u062D\u0648\u0644 \u0645\u0635\u062F\u0631 \u0627\u0644\u062D\u0633\u0627\u0628 \u0627\u0644\u0628\u0646\u0643\u064A \u0648\u0627\u0633\u062A\u0642\u0631\u0627\u0631\u0647\",\n          \"\u0633\u062C\u0644 \u0627\u0644\u0633\u0641\u0631 \u0627\u0644\u0633\u0627\u0628\u0642 \u064A\u062D\u062A\u0627\u062C \u0625\u0644\u0649 \u062A\u0648\u062B\u064A\u0642 \u0644\u062A\u0639\u0632\u064A\u0632 \u0627\u0644\u0642\u0646\u0627\u0639\u0629 \u0628\u0627\u0644\u0639\u0648\u062F\u0629 \u0627\u0644\u0645\u0624\u0642\u062A\u0629\",\n        ],\n        missingRequirements: [\n          \"\u0643\u0634\u0641 \u062D\u0633\u0627\u0628 \u0628\u0646\u0643\u064A \u0631\u0633\u0645\u064A \u0644\u0645\u062F\u0629 6 \u0623\u0634\u0647\u0631 \u0645\u0639\u062A\u0645\u062F \u0645\u0646 \u0627\u0644\u0628\u0646\u0643\",\n          \"\u062E\u0637\u0627\u0628 \u0625\u062C\u0627\u0632\u0629 \u0645\u0646 \u062C\u0647\u0629 \u0627\u0644\u0639\u0645\u0644 \u0623\u0648 \u0627\u0644\u0633\u062C\u0644 \u0627\u0644\u062A\u062C\u0627\u0631\u064A \u0648\u0627\u0644\u0628\u0637\u0627\u0642\u0629 \u0627\u0644\u0636\u0631\u064A\u0628\u064A\u0629\",\n          \"\u062A\u0623\u0645\u064A\u0646 \u0635\u062D\u064A \u0644\u0644\u0633\u0641\u0631 \u0648\u062A\u0623\u0643\u064A\u062F \u062D\u062C\u0648\u0632\u0627\u062A \u0627\u0644\u0637\u064A\u0631\u0627\u0646 \u0648\u0627\u0644\u0641\u0646\u062F\u0642\",\n        ],\n        actionableSteps: [\n          \"\u0625\u0643\u0645\u0627\u0644 \u0645\u0631\u0627\u062C\u0639\u0629 \u0648\u062A\u062F\u0642\u064A\u0642 \u0645\u0644\u0641 \u0627\u0644\u062A\u0623\u0634\u064A\u0631\u0629 \u0645\u0639 \u0641\u0631\u064A\u0642 OGA \u0641\u064A \u0625\u0633\u0637\u0646\u0628\u0648\u0644\",\n          \"\u062A\u062C\u0647\u064A\u0632 \u062D\u062C\u0632 \u0627\u0644\u0637\u064A\u0631\u0627\u0646 \u0648\u0627\u0644\u0641\u0646\u062F\u0642 \u0627\u0644\u0645\u0639\u062A\u0645\u062F \u0648\u062E\u0637\u0627\u0628 \u0627\u0644\u062A\u063A\u0637\u064A\u0629 \u0627\u0644\u0634\u062E\u0635\u064A\",\n          \"\u062A\u0642\u062F\u064A\u0645 \u0637\u0644\u0628 \u0627\u0644\u062A\u0623\u0634\u064A\u0631\u0629 \u0648\u062D\u062C\u0632 \u0645\u0648\u0639\u062F \u0627\u0644\u0633\u0641\u0627\u0631\u0629 \u0623\u0648 \u0627\u0644\u0642\u0646\u0635\u0644\u064A\u0629 \u0627\u0644\u0645\u0639\u0646\u064A\u0629\",\n        ],\n        estimatedTimeline: \"\u0645\u0646 2 \u0625\u0644\u0649 4 \u0623\u0633\u0627\u0628\u064A\u0639 \u0641\u062A\u0631\u0629 \u0627\u0644\u0645\u0639\u0627\u0644\u062C\u0629 \u0648\u0625\u0635\u062F\u0627\u0631 \u0627\u0644\u062A\u0623\u0634\u064A\u0631\u0629\",\n      };\n    }\n    if (pathway === \"student\") {\n      return {\n        score: 91,\n        matchLevel: \"\u0645\u0637\u0627\u0628\u0642\u0629 \u0639\u0627\u0644\u064A\u0629\",\n        primaryOption: `\u062A\u0623\u0634\u064A\u0631\u0629 \u0627\u0644\u062F\u0631\u0627\u0633\u0629 \u0648\u0627\u0644\u0637\u0644\u0627\u0628 - ${country}`,\n        secondaryOption: \"\u0645\u0633\u0627\u0631 \u0625\u0642\u0627\u0645\u0629 \u0627\u0644\u0639\u0645\u0644 \u0628\u0639\u062F \u0627\u0644\u062A\u062E\u0631\u062C\",\n        recommendedSubclass: \"\u062A\u0623\u0634\u064A\u0631\u0629 \u0637\u0627\u0644\u0628 (\u0627\u0644\u062A\u0639\u0644\u064A\u0645 \u0627\u0644\u0639\u0627\u0644\u064A / \u0627\u0644\u0645\u0627\u062C\u0633\u062A\u064A\u0631)\",\n        confidenceLevel: \"92% \u062B\u0642\u0629 \u0639\u0627\u0644\u064A\u0629 \u0641\u064A \u0627\u0644\u062A\u0642\u064A\u064A\u0645\",\n        keyStrengths: [\n          \"\u0627\u0644\u0645\u0624\u0647\u0644\u0627\u062A \u0627\u0644\u0623\u0643\u0627\u062F\u064A\u0645\u064A\u0629 \u062A\u062A\u0648\u0627\u0641\u0642 \u0645\u0639 \u0634\u0631\u0648\u0637 \u0627\u0644\u0642\u0628\u0648\u0644 \u0627\u0644\u062C\u0627\u0645\u0639\u064A \u0627\u0644\u0645\u0633\u062A\u0647\u062F\u0641\",\n          \"\u0627\u0644\u0642\u062F\u0631\u0629 \u0627\u0644\u0645\u0627\u0644\u064A\u0629 \u0645\u062A\u0648\u0641\u0631\u0629 \u0644\u062A\u063A\u0637\u064A\u0629 \u0627\u0644\u0631\u0633\u0648\u0645 \u0627\u0644\u062F\u0631\u0627\u0633\u064A\u0629 \u0648\u0627\u0644\u0645\u0639\u064A\u0634\u0629\",\n          \"\u062A\u0633\u0644\u0633\u0644 \u062F\u0631\u0627\u0633\u064A \u0645\u0646\u0637\u0642\u064A \u0648\u0648\u0627\u0636\u062D \u0628\u064A\u0646 \u0627\u0644\u0634\u0647\u0627\u062F\u0629 \u0627\u0644\u0633\u0627\u0628\u0642\u0629 \u0648\u0627\u0644\u0628\u0631\u0646\u0627\u0645\u062C \u0627\u0644\u0623\u0643\u0627\u062F\u064A\u0645\u064A\",\n        ],\n        potentialChallenges: [\n          \"\u062A\u062A\u0637\u0644\u0628 \u0627\u0644\u062A\u0623\u0634\u064A\u0631\u0629 \u0635\u064A\u0627\u063A\u0629 \u062E\u0637\u0627\u0628 \u0646\u064A\u0629 \u0648\u062D\u0627\u0641\u0632 \u062F\u0631\u0627\u0633\u064A (GS / SOP) \u0645\u0642\u0646\u0639 \u062C\u062F\u0627\u064B\",\n          \"\u0627\u0633\u062A\u064A\u0641\u0627\u0621 \u0634\u0631\u0637 \u0627\u062E\u062A\u0628\u0627\u0631 \u0627\u0644\u0644\u063A\u0629 \u0627\u0644\u0645\u0637\u0644\u0648\u0628 \u062D\u0633\u0628 \u0634\u0631\u0648\u0637 \u0627\u0644\u062C\u0627\u0645\u0639\u0629\",\n        ],\n        missingRequirements: [\n          \"\u0643\u0634\u0648\u0641 \u0627\u0644\u062F\u0631\u062C\u0627\u062A \u0648\u0627\u0644\u0634\u0647\u0627\u062F\u0627\u062A \u0627\u0644\u062C\u0627\u0645\u0639\u064A\u0629 \u0627\u0644\u0645\u062A\u0631\u062C\u0645\u0629 \u0648\u0627\u0644\u0645\u0635\u062F\u0642\u0629 \u0631\u0633\u0645\u064A\u0627\u064B\",\n          \"\u0634\u0647\u0627\u062F\u0629 \u0627\u062E\u062A\u0628\u0627\u0631 \u0627\u0644\u0644\u063A\u0629 \u0627\u0644\u0625\u0646\u062C\u0644\u064A\u0632\u064A\u0629 \u0623\u0648 \u0627\u0644\u0623\u0644\u0645\u0627\u0646\u064A\u0629 \u062D\u0633\u0628 \u0628\u0644\u062F \u0627\u0644\u062F\u0631\u0627\u0633\u0629\",\n          \"\u0625\u062B\u0628\u0627\u062A \u0627\u0644\u0642\u062F\u0631\u0629 \u0627\u0644\u0645\u0627\u0644\u064A\u0629 \u0623\u0648 \u0625\u0642\u0631\u0627\u0631 \u0627\u0644\u0643\u0641\u0627\u0644\u0629 \u0627\u0644\u0645\u0627\u0644\u064A\u0629 \u0627\u0644\u0645\u0633\u062A\u0646\u062F\u064A\u0629\",\n        ],\n        actionableSteps: [\n          \"\u0627\u0633\u062A\u062E\u0631\u0627\u062C \u0627\u0644\u0642\u0628\u0648\u0644 \u0627\u0644\u062C\u0627\u0645\u0639\u064A \u0627\u0644\u0645\u0628\u0627\u0634\u0631 \u0648\u0631\u0633\u0627\u0644\u0629 \u0627\u0644\u062A\u0623\u0643\u064A\u062F (CoE / Letter of Acceptance)\",\n          \"\u0635\u064A\u0627\u063A\u0629 \u062E\u0637\u0627\u0628 \u0627\u0644\u062F\u0627\u0641\u0639 \u0648\u062E\u0637\u0629 \u0627\u0644\u062F\u0631\u0627\u0633\u0629 \u0627\u0644\u0645\u0631\u0627\u062C\u0639\u0629 \u0628\u0648\u0627\u0633\u0637\u0629 \u062E\u0628\u0631\u0627\u0621 OGA\",\n          \"\u062A\u0642\u062F\u064A\u0645 \u0637\u0644\u0628 \u062A\u0623\u0634\u064A\u0631\u0629 \u0627\u0644\u062F\u0631\u0627\u0633\u0629 \u0648\u062A\u062D\u062F\u064A\u062F \u0645\u0648\u0639\u062F \u0627\u0644\u0641\u062D\u0635 \u0627\u0644\u0637\u0628\u064A \u0648\u0627\u0644\u062A\u0623\u0645\u064A\u0646 \u0627\u0644\u0635\u062D\u064A\",\n        ],\n        estimatedTimeline: \"\u0645\u0646 4 \u0625\u0644\u0649 8 \u0623\u0633\u0627\u0628\u064A\u0639 \u0625\u062C\u0645\u0627\u0644\u064A \u0641\u062A\u0631\u0629 \u0627\u0644\u0645\u0639\u0627\u0644\u062C\u0629\",\n      };\n    }\n    if (pathway === \"family\") {\n      return {\n        score: 93,\n        matchLevel: \"\u0645\u0637\u0627\u0628\u0642\u0629 \u0627\u0633\u062A\u062B\u0646\u0627\u0626\u064A\u0629\",\n        primaryOption: `\u062A\u0623\u0634\u064A\u0631\u0629 \u0644\u0645\u0651 \u0634\u0645\u0644 \u0627\u0644\u0623\u0633\u0631\u0629 \u0648\u0627\u0644\u0634\u0631\u064A\u0643 - ${country}`,\n        secondaryOption: \"\u062A\u0623\u0634\u064A\u0631\u0629 \u0627\u0644\u062E\u0637\u0648\u0628\u0629 / \u0627\u0644\u0632\u0648\u0627\u062C \u0627\u0644\u0645\u0633\u062A\u0642\u0628\u0644\u064A\",\n        recommendedSubclass: \"\u062A\u0623\u0634\u064A\u0631\u0629 \u0627\u0644\u0634\u0631\u064A\u0643 \u0648\u0627\u0644\u0632\u0648\u062C (\u0645\u0633\u0627\u0631 \u0644\u0645 \u0627\u0644\u0634\u0645\u0644)\",\n        confidenceLevel: \"94% \u062B\u0642\u0629 \u0639\u0627\u0644\u064A\u0629 \u0641\u064A \u0627\u0644\u062A\u0642\u064A\u064A\u0645\",\n        keyStrengths: [\n          \"\u0627\u0644\u0643\u0641\u064A\u0644 \u064A\u062D\u0645\u0644 \u062C\u0646\u0633\u064A\u0629 \u0628\u0644\u062F \u0627\u0644\u0645\u0642\u0635\u062F \u0623\u0648 \u0625\u0642\u0627\u0645\u0629 \u062F\u0627\u0626\u0645\u0629 \u0642\u0627\u0646\u0648\u0646\u064A\u0629 \u0633\u0627\u0631\u064A\u0629\",\n          \"\u0639\u0644\u0627\u0642\u0629 \u0632\u0648\u0627\u062C \u0623\u0648 \u0642\u0631\u0627\u0628\u0629 \u0645\u062B\u0628\u062A\u0629 \u0648\u0645\u0633\u062A\u0645\u0631\u0629 \u0645\u0639 \u0648\u062B\u0627\u0626\u0642 \u0631\u0633\u0645\u064A\u0629 \u0648\u0633\u0643\u0646 \u0645\u0634\u062A\u0631\u0643\",\n          \"\u0627\u0644\u0643\u0641\u064A\u0644 \u064A\u0633\u062A\u0648\u0641\u064A \u0634\u0631\u0648\u0637 \u0627\u0644\u062F\u0639\u0645 \u0627\u0644\u0645\u0627\u0644\u064A \u0648\u0627\u0644\u062D\u062F \u0627\u0644\u0623\u062F\u0646\u0649 \u0644\u0644\u062F\u062E\u0644 \u0648\u0627\u0644\u0633\u0643\u0646\",\n        ],\n        potentialChallenges: [\n          \"\u062A\u0637\u0644\u0628 \u0633\u0644\u0637\u0627\u062A \u0627\u0644\u0647\u062C\u0631\u0629 \u0623\u062F\u0644\u0629 \u0634\u0627\u0645\u0644\u0629 \u0648\u0645\u0643\u062B\u0641\u0629 \u0639\u0644\u0649 \u0645\u0635\u062F\u0627\u0642\u064A\u0629 \u0627\u0644\u0639\u0644\u0627\u0642\u0629 \u0648\u0627\u0633\u062A\u0645\u0631\u0627\u0631\u064A\u062A\u0647\u0627\",\n          \"\u0627\u0644\u0633\u062C\u0644 \u0627\u0644\u0639\u062F\u0644\u064A \u0648\u062A\u0631\u0627\u062E\u064A\u0635 \u0627\u0644\u0641\u062D\u0635 \u0627\u0644\u0637\u0628\u064A \u0644\u0644\u0643\u0641\u064A\u0644 \u0648\u0627\u0644\u0645\u0643\u0641\u0648\u0644\",\n        ],\n        missingRequirements: [\n          \"\u0639\u0642\u062F \u0627\u0644\u0632\u0648\u0627\u062C \u0627\u0644\u0631\u0633\u0645\u064A \u0627\u0644\u0645\u0635\u062F\u0642 \u0623\u0635\u0648\u0644\u0627\u064B \u0648\u0627\u0644\u0645\u062A\u0631\u062C\u0645\",\n          \"\u0625\u062B\u0628\u0627\u062A\u0627\u062A \u0627\u0644\u0633\u0643\u0646 \u0627\u0644\u0645\u0634\u062A\u0631\u0643 \u0648\u0627\u0644\u062D\u0633\u0627\u0628\u0627\u062A \u0627\u0644\u0628\u0646\u0643\u064A\u0629 \u0623\u0648 \u0627\u0644\u0635\u0648\u0631 \u0627\u0644\u0639\u0627\u0626\u0644\u064A\u0629\",\n          \"\u0625\u0642\u0631\u0627\u0631\u0627\u062A \u0648\u0634\u0647\u0627\u062F\u0627\u062A \u0627\u0644\u0634\u0647\u0648\u062F \u0645\u0646 \u0627\u0644\u0623\u0642\u0627\u0631\u0628 \u0648\u0627\u0644\u0645\u062C\u062A\u0645\u0639\",\n        ],\n        actionableSteps: [\n          \"\u0625\u062C\u0631\u0627\u0621 \u0645\u0631\u0627\u062C\u0639\u0629 \u0648\u062A\u062F\u0642\u064A\u0642 \u0644\u0623\u062F\u0644\u0629 \u0627\u0644\u0639\u0644\u0627\u0642\u0629 \u0645\u0639 \u0645\u0633\u062A\u0634\u0627\u0631 \u0627\u0644\u0647\u062C\u0631\u0629 \u0641\u064A OGA\",\n          \"\u062A\u0631\u062A\u064A\u0628 \u0648\u062A\u0633\u0644\u0633\u0644 \u0627\u0644\u0645\u0644\u0641 \u0627\u0644\u0632\u0645\u0646\u064A \u0644\u0644\u0639\u0644\u0627\u0642\u0629 \u0648\u0627\u0644\u0648\u062B\u0627\u0626\u0642 \u0627\u0644\u0631\u0633\u0645\u064A\u0629\",\n          \"\u062A\u0642\u062F\u064A\u0645 \u0637\u0644\u0628 \u0644\u0645\u0651 \u0627\u0644\u0634\u0645\u0644 \u0639\u0628\u0631 \u0627\u0644\u0628\u0648\u0627\u0628\u0629 \u0627\u0644\u0625\u0644\u0643\u062A\u0631\u0648\u0646\u064A\u0629 \u0627\u0644\u0631\u0633\u0645\u064A\u0629 \u0644\u0644\u0647\u062C\u0631\u0629\",\n        ],\n        estimatedTimeline: \"\u0645\u0646 6 \u0625\u0644\u0649 12 \u0634\u0647\u0631\u0627\u064B \u0625\u062C\u0645\u0627\u0644\u064A \u0641\u062A\u0631\u0629 \u0627\u0644\u0645\u0639\u0627\u0644\u062C\u0629\",\n      };\n    }\n    if (pathway === \"investor\") {\n      return {\n        score: 96,\n        matchLevel: \"\u0645\u0637\u0627\u0628\u0642\u0629 \u0627\u0633\u062A\u062B\u0646\u0627\u0626\u064A\u0629\",\n        primaryOption: `\u0627\u0644\u0625\u0642\u0627\u0645\u0629 \u0639\u0646 \u0637\u0631\u064A\u0642 \u0627\u0644\u0627\u0633\u062A\u062B\u0645\u0627\u0631 / \u0627\u0644\u062A\u0623\u0634\u064A\u0631\u0629 \u0627\u0644\u0630\u0647\u0628\u064A\u0629 - ${country}`,\n        secondaryOption: \"\u0627\u0644\u062A\u0623\u0634\u064A\u0631\u0629 \u0627\u0644\u0630\u0647\u0628\u064A\u0629 \u0644\u0644\u0625\u0645\u0627\u0631\u0627\u062A (10 \u0633\u0646\u0648\u0627\u062A)\",\n        recommendedSubclass: \"\u0628\u0631\u0646\u0627\u0645\u062C \u0627\u0644\u0645\u0633\u062A\u062B\u0645\u0631 \u0627\u0644\u0639\u0627\u0644\u0645\u064A \u0648\u0627\u0644\u062A\u0623\u0634\u064A\u0631\u0629 \u0627\u0644\u0630\u0647\u0628\u064A\u0629\",\n        confidenceLevel: \"98% \u062B\u0642\u0629 \u0639\u0627\u0644\u064A\u0629 \u0641\u064A \u0627\u0644\u062A\u0642\u064A\u064A\u0645\",\n        keyStrengths: [\n          \"\u0648\u0641\u0631\u0629 \u0631\u0623\u0633 \u0627\u0644\u0645\u0627\u0644 \u0627\u0644\u0627\u0633\u062A\u062B\u0645\u0627\u0631\u064A \u0627\u0644\u0633\u0627\u0626\u0644 \u0628\u0645\u0627 \u064A\u062A\u062C\u0627\u0648\u0632 \u0627\u0644\u062D\u062F \u0627\u0644\u0623\u062F\u0646\u0649 \u0627\u0644\u0645\u0637\u0644\u0648\u0628 \u0642\u0627\u0646\u0648\u0646\u0627\u064B\",\n          \"\u062E\u0644\u0641\u064A\u0629 \u0645\u062B\u0628\u062A\u0629 \u0641\u064A \u0625\u062F\u0627\u0631\u0629 \u0627\u0644\u0623\u0639\u0645\u0627\u0644 \u0648\u0627\u0644\u0642\u064A\u0627\u062F\u0629 \u0627\u0644\u062A\u0646\u0641\u064A\u0630\u064A\u0629 \u0623\u0648 \u0627\u0644\u0627\u0633\u062A\u062B\u0645\u0627\u0631\",\n          \"\u0623\u0647\u0644\u064A\u0629 \u0627\u0644\u0645\u0639\u0627\u0644\u062C\u0629 \u0627\u0644\u0633\u0631\u064A\u0639\u0629 \u0627\u0644\u0645\u0645\u062A\u0627\u0632\u0629 \u0644\u0644\u062D\u0635\u0648\u0644 \u0639\u0644\u0649 \u0627\u0644\u0625\u0642\u0627\u0645\u0629 \u0627\u0644\u0630\u0647\u0628\u064A\u0629\",\n        ],\n        potentialChallenges: [\n          \"\u062A\u0637\u0644\u0628 \u0627\u0644\u062C\u0647\u0627\u062A \u0627\u0644\u062D\u0643\u0648\u0645\u064A\u0629 \u062A\u062F\u0642\u064A\u0642\u0627\u064B \u0634\u0641\u0627\u0641\u0627\u064B \u0644\u0645\u0635\u062F\u0631 \u0648\u062A\u062A\u0628\u0639 \u0627\u0644\u0623\u0645\u0648\u0627\u0644 \u0627\u0644\u0628\u0646\u0643\u064A\u0629\",\n          \"\u0627\u0644\u0641\u062D\u0648\u0635\u0627\u062A \u0627\u0644\u0625\u062F\u0627\u0631\u064A\u0629 \u0648\u0627\u0644\u0627\u0645\u062A\u062B\u0627\u0644 \u0644\u0642\u0648\u0627\u0646\u064A\u0646 \u0645\u0643\u0627\u0641\u062D\u0629 \u063A\u0633\u064A\u0644 \u0627\u0644\u0623\u0645\u0648\u0627\u0644\",\n        ],\n        missingRequirements: [\n          \"\u0627\u0644\u062A\u0642\u0627\u0631\u064A\u0631 \u0627\u0644\u0645\u0627\u0644\u064A\u0629 \u0627\u0644\u0645\u062F\u0642\u0642\u0629 \u0623\u0648 \u0634\u0647\u0627\u062F\u0629 \u0631\u0635\u064A\u062F \u0631\u0623\u0633 \u0627\u0644\u0645\u0627\u0644 \u0627\u0644\u0628\u0646\u0643\u064A\u0629\",\n          \"\u0633\u0631\u062F \u0648\u062A\u0648\u062B\u064A\u0642 \u0639\u0642\u0648\u062F \u0645\u0635\u0627\u062F\u0631 \u0627\u0644\u062B\u0631\u0648\u0629 \u0648\u0627\u0644\u0623\u0645\u0648\u0627\u0644 \u0627\u0644\u0627\u0633\u062A\u062B\u0645\u0627\u0631\u064A\u0629\",\n          \"\u062C\u0648\u0627\u0632 \u0633\u0641\u0631 \u0633\u0627\u0631\u064A \u0627\u0644\u0645\u0641\u0639\u0648\u0644 \u0644\u0645\u062F\u0629 \u0644\u0627 \u062A\u0642\u0644 \u0639\u0646 \u0633\u0646\u062A\u064A\u0646\",\n        ],\n        actionableSteps: [\n          \"\u0627\u062E\u062A\u064A\u0627\u0631 \u0627\u0644\u0639\u0642\u0627\u0631 \u0623\u0648 \u0627\u0644\u0635\u0646\u062F\u0648\u0642 \u0627\u0644\u0627\u0633\u062A\u062B\u0645\u0627\u0631\u064A \u0627\u0644\u0645\u0639\u062A\u0645\u062F \u0623\u0648 \u0647\u064A\u0643\u0644 \u0627\u0644\u0634\u0631\u0643\u0629\",\n          \"\u0627\u0633\u062A\u0643\u0645\u0627\u0644 \u0625\u062C\u0631\u0627\u0621\u0627\u062A \u0627\u0644\u0627\u0645\u062A\u062B\u0627\u0644 \u0627\u0644\u0642\u0627\u0646\u0648\u0646\u064A \u0648\u062A\u062F\u0642\u064A\u0642 \u0645\u0635\u0627\u062F\u0631 \u0627\u0644\u0623\u0645\u0648\u0627\u0644 \u0645\u0639 OGA\",\n          \"\u062A\u0642\u062F\u064A\u0645 \u0637\u0644\u0628 \u0627\u0644\u062A\u0623\u0634\u064A\u0631\u0629 \u0627\u0644\u0630\u0647\u0628\u064A\u0629 \u0648\u0627\u0644\u0625\u0642\u0627\u0645\u0629 \u0627\u0644\u0627\u0633\u062A\u062B\u0645\u0627\u0631\u064A\u0629 \u0627\u0644\u0645\u0639\u062C\u0644\u0629\",\n        ],\n        estimatedTimeline: \"\u0645\u0646 1 \u0625\u0644\u0649 3 \u0623\u0634\u0647\u0631 \u0625\u062C\u0645\u0627\u0644\u064A \u0641\u062A\u0631\u0629 \u0627\u0644\u0645\u0639\u0627\u0644\u062C\u0629\",\n      };\n    }\n    return {\n      score: 92,\n      matchLevel: \"\u0645\u0637\u0627\u0628\u0642\u0629 \u0639\u0627\u0644\u064A\u0629\",\n      primaryOption: `\u062A\u0623\u0634\u064A\u0631\u0629 \u0627\u0644\u0639\u0645\u0644 \u0648\u0647\u062C\u0631\u0629 \u0627\u0644\u0643\u0641\u0627\u0621\u0627\u062A \u0627\u0644\u0645\u0627\u0647\u0631\u0629 - ${country}`,\n      secondaryOption: \"\u0627\u0644\u0625\u0642\u0627\u0645\u0629 \u0627\u0644\u062F\u0627\u0626\u0645\u0629 \u0639\u0644\u0649 \u0623\u0633\u0627\u0633 \u0627\u0644\u0646\u0642\u0627\u0637 \u0627\u0644\u0645\u0633\u062A\u0642\u0644\u0629\",\n      recommendedSubclass: \"\u0645\u0633\u0627\u0631 \u0647\u062C\u0631\u0629 \u0627\u0644\u0643\u0641\u0627\u0621\u0627\u062A \u0648\u0643\u0641\u0627\u0644\u0629 \u0627\u0644\u0639\u0645\u0644\",\n      confidenceLevel: \"93% \u062B\u0642\u0629 \u0639\u0627\u0644\u064A\u0629 \u0641\u064A \u0627\u0644\u062A\u0642\u064A\u064A\u0645\",\n      keyStrengths: [\n        \"\u062E\u0628\u0631\u0629 \u0645\u0647\u0646\u064A\u0629 \u0641\u064A \u0642\u0637\u0627\u0639 \u0645\u0637\u0644\u0648\u0628 \u0648\u0641\u064A \u0642\u0648\u0627\u0626\u0645 \u0627\u0644\u0645\u0647\u0646 \u0630\u0627\u062A \u0627\u0644\u0623\u0648\u0644\u0648\u064A\u0629\",\n        \"\u0645\u0633\u062A\u0648\u0649 \u062A\u0639\u0644\u064A\u0645\u064A \u064A\u0637\u0627\u0628\u0642 \u0645\u0639\u0627\u064A\u064A\u0631 \u0627\u0644\u0645\u0624\u0647\u0644\u0627\u062A \u0627\u0644\u0645\u0637\u0644\u0648\u0628\u0629 \u0644\u0644\u0647\u062C\u0631\u0629 \u0648\u0627\u0644\u0639\u0645\u0644\",\n        \"\u062E\u0644\u0641\u064A\u0629 \u0645\u0646\u0627\u0633\u0628\u0629 \u062C\u062F\u0627\u064B \u0644\u0643\u0641\u0627\u0644\u0629 \u0623\u0635\u062D\u0627\u0628 \u0627\u0644\u0639\u0645\u0644 \u0623\u0648 \u0646\u0642\u0627\u0637 \u0627\u0644\u0647\u062C\u0631\u0629 \u0627\u0644\u0645\u0627\u0647\u0631\u0629\",\n      ],\n      potentialChallenges: [\n        \"\u062A\u062A\u0637\u0644\u0628 \u0628\u0639\u0636 \u0627\u0644\u062F\u0648\u0644 \u062A\u0642\u064A\u064A\u0645 \u0645\u0639\u0627\u062F\u0644\u0629 \u0627\u0644\u0645\u0647\u0627\u0631\u0627\u062A \u0648\u0627\u0644\u0634\u0647\u0627\u062F\u0627\u062A \u0645\u0646 \u0627\u0644\u062C\u0647\u0629 \u0627\u0644\u0645\u062E\u062A\u0635\u0629 \u0642\u0628\u0644 \u0627\u0644\u062A\u0623\u0634\u064A\u0631\u0629\",\n        \"\u0625\u062B\u0628\u0627\u062A \u0645\u0633\u062A\u0648\u0649 \u0627\u0644\u0644\u063A\u0629 \u0648\u0641\u0642\u0627\u064B \u0644\u0645\u062A\u0637\u0644\u0628\u0627\u062A \u0627\u0644\u062A\u0623\u0634\u064A\u0631\u0629 \u0627\u0644\u0645\u062D\u062F\u062F\u0629\",\n      ],\n      missingRequirements: [\n        \"\u0646\u062A\u064A\u062C\u0629 \u062A\u0642\u064A\u064A\u0645 \u0648\u0645\u0639\u0627\u062F\u0644\u0629 \u0627\u0644\u0645\u0624\u0647\u0644\u0627\u062A \u0648\u0627\u0644\u0634\u0647\u0627\u062F\u0627\u062A \u0627\u0644\u0623\u0643\u0627\u062F\u064A\u0645\u064A\u0629 (ECA / WES / ZAB)\",\n        \"\u062E\u0637\u0627\u0628\u0627\u062A \u062E\u0628\u0631\u0629 \u0639\u0645\u0644 \u0645\u0641\u0635\u0644\u0629 \u0628\u0627\u0644\u0645\u0647\u0627\u0645 \u0648\u0627\u0644\u0645\u0633\u0624\u0648\u0644\u064A\u0627\u062A \u0648\u0627\u0644\u0645\u0633\u0645\u0649 \u0627\u0644\u0648\u0638\u064A\u0641\u064A\",\n        \"\u0634\u0647\u0627\u062F\u0629 \u0625\u062A\u0642\u0627\u0646 \u0627\u0644\u0644\u063A\u0629 (IELTS / PTE / B1/B2 \u062D\u0633\u0628 \u0627\u0644\u062F\u0648\u0644\u0629)\",\n      ],\n      actionableSteps: [\n        \"\u0628\u062F\u0621 \u062A\u062F\u0642\u064A\u0642 \u0627\u0644\u0645\u0633\u062A\u0646\u062F\u0627\u062A \u0645\u0639 \u0645\u0633\u062A\u0634\u0627\u0631 \u0627\u0644\u0647\u062C\u0631\u0629 \u0627\u0644\u0623\u0648\u0644 \u0641\u064A OGA\",\n        \"\u0625\u0643\u0645\u0627\u0644 \u062A\u0642\u064A\u064A\u0645 \u0627\u0644\u0645\u0647\u0627\u0645 \u0648\u0627\u0644\u0634\u0647\u0627\u062F\u0627\u062A \u0627\u0644\u0639\u0644\u0645\u064A\u0629 \u0648\u0627\u0644\u0645\u0647\u0646\u064A\u0629\",\n        \"\u062A\u0642\u062F\u064A\u0645 \u0645\u0644\u0641 \u0627\u0644\u062A\u0639\u0628\u064A\u0631 \u0639\u0646 \u0627\u0644\u0631\u063A\u0628\u0629 (EOI) \u0623\u0648 \u0637\u0644\u0628 \u0643\u0641\u0627\u0644\u0629 \u0635\u0627\u062D\u0628 \u0627\u0644\u0639\u0645\u0644\",\n      ],\n      estimatedTimeline: \"\u0645\u0646 3 \u0625\u0644\u0649 6 \u0623\u0634\u0647\u0631 \u0625\u062C\u0645\u0627\u0644\u064A \u0641\u062A\u0631\u0629 \u0627\u0644\u0645\u0639\u0627\u0644\u062C\u0629\",\n    };\n  }\n\n  if (pathway === \"humanitarian\") {\n    return {\n      score: 94,\n      matchLevel: \"Exceptional Match\",\n      primaryOption: `${country} Subclass 202 Global Special Humanitarian Visa`,\n      secondaryOption: `${country} Subclass 200 Refugee Visa`,\n      recommendedSubclass: \"Subclass 202 (Global Special Humanitarian)\",\n      confidenceLevel: \"95% High Confidence\",\n      keyStrengths: [\n        \"Applicant is outside home country with clear humanitarian protection need\",\n        \"Australian proposer or family sponsorship significantly enhances visa priority\",\n        \"OGA Istanbul specialized 100% online ImmiAccount submission protocol\",\n      ],\n      potentialChallenges: [\n        \"Proposer declarations and persecution evidence require structured legal narrative\",\n        \"Consular verification queues require complete initial evidence bundle\",\n      ],\n      missingRequirements: [\n        \"UNHCR registration certificate or case confirmation letter (if available)\",\n        \"Australian proposer citizenship / permanent residency proof\",\n        \"Certified English translations of civil identity and family records\",\n      ],\n      actionableSteps: [\n        \"Schedule an OGA Humanitarian Consultation with our Istanbul team\",\n        \"Compile identity, persecution narrative, and proposer documents for OGA audit\",\n        \"Submit 100% online ImmiAccount application with OGA representation\",\n      ],\n      estimatedTimeline: \"4 to 8 months total processing timeline\",\n    };\n  }\n  if (pathway === \"tourist\") {\n    return {\n      score: 88,\n      matchLevel: \"High Match\",\n      primaryOption: `${country} Tourism & Visitor Visa (Subclass 600 / Standard)`,\n      secondaryOption: \"Schengen Multi-Entry Visitor Visa\",\n      recommendedSubclass: \"Visitor Visa (Subclass 600 / Tourist Stream)\",\n      confidenceLevel: \"90% High Confidence\",\n      keyStrengths: [\n        \"Demonstrated financial liquidity and savings to cover travel duration\",\n        \"Established ties to home country (employment/property) supporting return\",\n        \"Clear holiday or visitor itinerary with verified bookings\",\n      ],\n      potentialChallenges: [\n        \"Visa officers require verifiable proof of income and ties to home country\",\n        \"Travel history scrutiny requires clear bank statement consistency\",\n      ],\n      missingRequirements: [\n        \"6-month official bank statements with stamp and balance certificate\",\n        \"Employer leave approval letter or business registration certificate\",\n        \"Confirmed flight itinerary and hotel reservation dossier\",\n      ],\n      actionableSteps: [\n        \"Complete OGA Visitor Visa document verification checklist\",\n        \"Prepare bank letters and ties-to-home-country supporting folder\",\n        \"Submit online visitor application with OGA cover letter\",\n      ],\n      estimatedTimeline: \"2 to 4 weeks total processing timeline\",\n    };\n  }\n  if (pathway === \"student\") {\n    return {\n      score: 91,\n      matchLevel: \"High Match\",\n      primaryOption: `${country} Student Visa (Subclass 500 / Study Permit)`,\n      secondaryOption: \"Post-Study Graduate Work Pathway\",\n      recommendedSubclass: \"Student Visa (Subclass 500 / Higher Education)\",\n      confidenceLevel: \"92% High Confidence\",\n      keyStrengths: [\n        \"Academic background aligns with target university admission criteria\",\n        \"Demonstrated funding capacity for tuition and living expenses\",\n        \"Clear progression from previous study level to intended course\",\n      ],\n      potentialChallenges: [\n        \"Genuine Student (GS) statement must explain career goals clearly\",\n        \"English language proficiency must meet university unconditional threshold\",\n      ],\n      missingRequirements: [\n        \"Official academic transcripts and degree certificates\",\n        \"Valid IELTS / PTE English language test scorecard\",\n        \"Proof of funds / sponsor financial sponsorship affidavit\",\n      ],\n      actionableSteps: [\n        \"Secure university Confirmation of Enrolment (CoE / Letter of Acceptance)\",\n        \"Draft OGA-reviewed Genuine Student / Statement of Purpose narrative\",\n        \"Lodge student visa application with health and insurance verification\",\n      ],\n      estimatedTimeline: \"4 to 8 weeks total processing timeline\",\n    };\n  }\n  if (pathway === \"family\") {\n    return {\n      score: 93,\n      matchLevel: \"Exceptional Match\",\n      primaryOption: `${country} Partner / Family Reunification Visa`,\n      secondaryOption: \"Prospective Marriage / Dependent Visa Route\",\n      recommendedSubclass: \"Partner Visa (Subclass 309/100 or Spousal Route)\",\n      confidenceLevel: \"94% High Confidence\",\n      keyStrengths: [\n        \"Sponsor holds eligible citizenship or permanent resident status\",\n        \"Long-standing genuine relationship with verifiable cohabitation history\",\n        \"Sponsor meets required financial support and accommodation thresholds\",\n      ],\n      potentialChallenges: [\n        \"Extensive relationship evidence required across financial, social, and household domains\",\n        \"Sponsor police checks and character clearances must be updated\",\n      ],\n      missingRequirements: [\n        \"Joint bank accounts, lease agreements, or shared utility statements\",\n        \"Civil marriage certificate with official apostille/legalization\",\n        \"Statutory declarations from family and community witnesses\",\n      ],\n      actionableSteps: [\n        \"Conduct OGA Relationship Evidence Audit with senior consultant\",\n        \"Assemble chronologically ordered relationship timeline dossier\",\n        \"Submit comprehensive spousal application via online portal\",\n      ],\n      estimatedTimeline: \"6 to 12 months total processing timeline\",\n    };\n  }\n  if (pathway === \"investor\") {\n    return {\n      score: 96,\n      matchLevel: \"Exceptional Match\",\n      primaryOption: `${country} Residency by Investment / Golden Visa`,\n      secondaryOption: \"UAE 10-Year Golden Visa (Investor Route)\",\n      recommendedSubclass: \"Global Investor / Golden Visa Program\",\n      confidenceLevel: \"98% High Confidence\",\n      keyStrengths: [\n        \"Available liquid capital exceeds minimum statutory investment threshold\",\n        \"Verified business leadership and executive background\",\n        \"Fast-track processing eligibility for high-net-worth investors\",\n      ],\n      potentialChallenges: [\n        \"Source of funds documentation requires transparent bank tracing\",\n        \"Compliance checks with international anti-money-laundering rules\",\n      ],\n      missingRequirements: [\n        \"Audited financial statements or bank capital verification letters\",\n        \"Comprehensive source of wealth narrative and supporting contracts\",\n        \"Valid passport copy with 2+ years remaining validity\",\n      ],\n      actionableSteps: [\n        \"Select target real estate, fund, or business investment structure\",\n        \"Complete OGA legal compliance and source-of-funds verification\",\n        \"Lodge expedited Golden Visa / residency application\",\n      ],\n      estimatedTimeline: \"1 to 3 months total processing timeline\",\n    };\n  }\n  return {\n    score: 92,\n    matchLevel: \"High Match\",\n    primaryOption: `${country} Skilled Migration / Work Visa`,\n    secondaryOption: \"Points-Based Independent Skilled Residency\",\n    recommendedSubclass: \"Skilled Independent / Employer Sponsored Route\",\n    confidenceLevel: \"93% High Confidence\",\n    keyStrengths: [\n      \"Professional experience in a high-demand critical industry sector\",\n      \"Education level meets statutory qualification standards\",\n      \"Favorable background for employer sponsorship or points assessment\",\n    ],\n    potentialChallenges: [\n      \"Formal skills assessment body evaluation required before visa submission\",\n      \"English language proficiency must meet competitive threshold\",\n    ],\n    missingRequirements: [\n      \"Official Skills Assessment result from designated assessing authority\",\n      \"Academic Credential Evaluation (ECA / WES / UK NARIC)\",\n      \"Detailed employment reference letters with roles and responsibilities\",\n    ],\n    actionableSteps: [\n      \"Initiate OGA Document Audit with Senior Immigration Consultant\",\n      \"Complete professional skills assessment and credential evaluation\",\n      \"Submit Expression of Interest (EOI) or employer-sponsored petition\",\n    ],\n    estimatedTimeline: \"3 to 6 months total processing timeline\",\n  };\n};\n\n// AI Visa Eligibility Evaluator Endpoint\napp.post(\"/api/assess\", async (req, res) => {\n  try {\n    const {\n      targetCountry = \"Australia\",\n      visaCategory = \"Refugee & Humanitarian (Subclass 200-204)\",\n      nationality = \"Not specified\",\n      pathwayType = \"humanitarian\",\n      answers = {},\n      educationLevel = \"N/A\",\n      workExperienceYears = \"N/A\",\n      investmentBudget = \"N/A\",\n      familyStatus = \"N/A\",\n      language = \"ar\",\n    } = req.body;\n\n    const fallbackResult = getPathwayFallback(pathwayType, targetCountry, visaCategory, language);\n\n    const ai = getGeminiClient();\n    if (!ai) {\n      res.json(fallbackResult);\n      return;\n    }\n\n    const langNames: Record<string, string> = {\n      ar: \"Arabic (\u0627\u0644\u0639\u0631\u0628\u064A\u0629)\",\n      fa: \"Persian (\u0641\u0627\u0631\u0633\u06CC)\",\n      tr: \"Turkish (T\u00FCrk\u00E7e)\",\n      en: \"English\",\n    };\n    const targetLangName = langNames[language] || \"Arabic\";\n\n    const prompt = `Perform an intelligent immigration eligibility assessment for Oga Immigration based on the applicant's specific visa pathway.\nUser details:\n- Target Country: ${targetCountry}\n- Desired Visa/Category: ${visaCategory}\n- Pathway Type: ${pathwayType}\n- Current Nationality: ${nationality}\n- Applicant Answers to Pathway-Specific Assessment: ${JSON.stringify(answers, null, 2)}\n- General fields: Education: ${educationLevel}, Work Experience: ${workExperienceYears}, Investment Budget: ${investmentBudget}, Family Status: ${familyStatus}\n- Output Language: ${targetLangName} (Language code: ${language})\n\nSTRICT MANDATORY LANGUAGE REQUIREMENT:\nYou MUST generate ALL JSON text values strictly in ${targetLangName} (${language}).\nIf the output language is Arabic (${language} = 'ar'), EVERY SINGLE FIELD (primaryOption, secondaryOption, recommendedSubclass, confidenceLevel, keyStrengths, potentialChallenges, missingRequirements, actionableSteps, estimatedTimeline) MUST BE WRITTEN IN NATURAL ARABIC. Do NOT return English text when Arabic is requested.\n\nCRITICAL RULES BY PATHWAY:\n1. If pathwayType is \"humanitarian\" or visaCategory is humanitarian/refugee (especially for Australia):\n   - Do NOT judge eligibility on education or corporate work experience.\n   - Judge eligibility based on persecution risk, UNHCR registration, current location (outside/inside home country), and whether they have an Australian proposer/sponsor or immediate family.\n   - In \"recommendedSubclass\", identify the most suitable Australian humanitarian visa subclass based on their answers (Subclass 200, 201, 202, 203, or 204).\n2. If pathwayType is \"tourist\":\n   - Evaluate ties to home country (property, steady employment, family), savings, travel history, and planned duration.\n3. If pathwayType is \"work\":\n   - Evaluate occupation demand, professional experience, degree, language proficiency, and employer sponsorship.\n4. If pathwayType is \"student\":\n   - Evaluate intended course level, language proficiency, funding source, and academic history/gaps.\n5. If pathwayType is \"family\":\n   - Evaluate sponsor relationship, sponsor citizenship/PR status, relationship duration, and residence evidence.\n6. If pathwayType is \"investor\":\n   - Evaluate liquid capital, net worth, business ownership experience, and preferred investment type.\n\nRespond in valid JSON format matching this schema:\n{\n  \"score\": number (0 to 100 representing eligibility strength),\n  \"matchLevel\": string (in ${targetLangName}, e.g. \"\u0645\u0637\u0627\u0628\u0642\u0629 \u0627\u0633\u062A\u062B\u0646\u0627\u0626\u064A\u0629\" for Arabic),\n  \"primaryOption\": string (Specific visa title in ${targetLangName}),\n  \"secondaryOption\": string (Alternative visa route in ${targetLangName}),\n  \"recommendedSubclass\": string (Specific subclass or program name in ${targetLangName}),\n  \"confidenceLevel\": string (Confidence string in ${targetLangName}),\n  \"keyStrengths\": array of 3 bullet strings in ${targetLangName},\n  \"potentialChallenges\": array of 2 bullet strings in ${targetLangName},\n  \"missingRequirements\": array of 3 specific missing documents or steps in ${targetLangName},\n  \"actionableSteps\": array of 3 bullet strings in ${targetLangName},\n  \"estimatedTimeline\": string in ${targetLangName}\n}`;\n\n    const response = await ai.models.generateContent({\n      model: \"gemini-3.6-flash\",\n      contents: prompt,\n      config: {\n        responseMimeType: \"application/json\",\n      },\n    });\n\n    let rawText = response.text || \"{}\";\n    rawText = rawText.replace(/```json/gi, \"\").replace(/```/g, \"\").trim();\n\n    let parsed: any = {};\n    try {\n      parsed = JSON.parse(rawText);\n      if (!parsed.score || !parsed.primaryOption) {\n        parsed = fallbackResult;\n      }\n    } catch (_parseErr) {\n      parsed = fallbackResult;\n    }\n    res.json(parsed);\n  } catch (err: any) {\n    console.error(\"Error in /api/assess:\", err);\n    const {\n      targetCountry = \"Australia\",\n      visaCategory = \"Refugee & Humanitarian (Subclass 200-204)\",\n      pathwayType = \"humanitarian\",\n      language = \"ar\",\n    } = req.body || {};\n    res.json(getPathwayFallback(pathwayType, targetCountry, visaCategory, language));\n  }\n});\n\n// Setup Vite Development or Static Production Server\nasync function startServer() {\n  if (process.env.NODE_ENV !== \"production\") {\n    const vite = await createViteServer({\n      server: { middlewareMode: true },\n      appType: \"spa\",\n    });\n    app.use(vite.middlewares);\n  } else {\n    const distPath = path.join(process.cwd(), \"dist\");\n    app.use(express.static(distPath));\n    app.get(\"*\", (_req, res) => {\n      res.sendFile(path.join(distPath, \"index.html\"));\n    });\n  }\n\n  app.listen(PORT, \"0.0.0.0\", () => {\n    console.log(`Oga Immigration server listening on http://0.0.0.0:${PORT}`);\n  });\n}\n\nstartServer();\n"],
  "mappings": "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",
  "names": ["dotenv", "express", "mysql", "nodemailer", "crypto", "createViteServer", "path"]
}
