/**
 * Chess Opening Database
 * Lookup by move prefix (space-separated SAN moves)
 */
const Openings = (function() {
  // Database: key = move sequence, value = {eco, name, name_ar}
  const db = {
    // === KING'S PAWN (1.e4) ===
    'e4': {eco: 'B00', name: "King's Pawn", name_ar: 'افتتاح بيدق الملك'},
    'e4 e5': {eco: 'C20', name: "King's Pawn Game", name_ar: 'لعبة بيدق الملك'},
    'e4 e5 Nf3': {eco: 'C40', name: "King's Knight Opening", name_ar: 'افتتاح حصان الملك'},
    'e4 e5 Nf3 Nc6': {eco: 'C44', name: "King's Knight Opening", name_ar: 'افتتاح حصان الملك'},

    // Ruy Lopez
    'e4 e5 Nf3 Nc6 Bb5': {eco: 'C60', name: 'Ruy Lopez', name_ar: 'روي لوبيز'},
    'e4 e5 Nf3 Nc6 Bb5 a6': {eco: 'C68', name: 'Ruy Lopez: Morphy Defense', name_ar: 'روي لوبيز: دفاع مورفي'},
    'e4 e5 Nf3 Nc6 Bb5 a6 Ba4': {eco: 'C70', name: 'Ruy Lopez: Morphy Defense', name_ar: 'روي لوبيز: دفاع مورفي'},
    'e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6': {eco: 'C72', name: 'Ruy Lopez: Morphy Defense', name_ar: 'روي لوبيز: دفاع مورفي'},
    'e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 O-O': {eco: 'C78', name: 'Ruy Lopez: Morphy Defense', name_ar: 'روي لوبيز: دفاع مورفي'},
    'e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 O-O Be7': {eco: 'C84', name: 'Ruy Lopez: Closed', name_ar: 'روي لوبيز: المغلق'},
    'e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 O-O Be7 Re1 b5 Bb3 O-O c3 d5': {eco: 'C89', name: 'Ruy Lopez: Marshall Attack', name_ar: 'روي لوبيز: هجوم مارشال'},
    'e4 e5 Nf3 Nc6 Bb5 Nf6': {eco: 'C65', name: 'Ruy Lopez: Berlin Defense', name_ar: 'روي لوبيز: دفاع برلين'},
    'e4 e5 Nf3 Nc6 Bb5 Nf6 O-O Nxe4': {eco: 'C67', name: 'Ruy Lopez: Berlin Defense, Rio de Janeiro', name_ar: 'روي لوبيز: دفاع برلين'},

    // Italian Game
    'e4 e5 Nf3 Nc6 Bc4': {eco: 'C50', name: 'Italian Game', name_ar: 'اللعبة الايطالية'},
    'e4 e5 Nf3 Nc6 Bc4 Bc5': {eco: 'C50', name: 'Italian Game: Giuoco Piano', name_ar: 'اللعبة الايطالية: جيوكو بيانو'},
    'e4 e5 Nf3 Nc6 Bc4 Bc5 b4': {eco: 'C51', name: 'Italian Game: Evans Gambit', name_ar: 'اللعبة الايطالية: غامبيت ايفانز'},
    'e4 e5 Nf3 Nc6 Bc4 Bc5 c3': {eco: 'C54', name: 'Italian Game: Classical', name_ar: 'اللعبة الايطالية: الكلاسيكي'},
    'e4 e5 Nf3 Nc6 Bc4 Nf6': {eco: 'C55', name: 'Italian Game: Two Knights Defense', name_ar: 'اللعبة الايطالية: دفاع الحصانين'},
    'e4 e5 Nf3 Nc6 Bc4 Nf6 Ng5': {eco: 'C57', name: 'Italian Game: Fried Liver Attack', name_ar: 'اللعبة الايطالية: هجوم الكبد المقلي'},

    // Scotch Game
    'e4 e5 Nf3 Nc6 d4': {eco: 'C44', name: 'Scotch Game', name_ar: 'اللعبة الاسكتلندية'},
    'e4 e5 Nf3 Nc6 d4 exd4': {eco: 'C44', name: 'Scotch Game', name_ar: 'اللعبة الاسكتلندية'},
    'e4 e5 Nf3 Nc6 d4 exd4 Nxd4': {eco: 'C45', name: 'Scotch Game', name_ar: 'اللعبة الاسكتلندية'},
    'e4 e5 Nf3 Nc6 d4 exd4 Bc4': {eco: 'C44', name: 'Scotch Gambit', name_ar: 'غامبيت اسكتلندي'},

    // Petrov's Defense
    'e4 e5 Nf3 Nf6': {eco: 'C42', name: "Petrov's Defense", name_ar: 'دفاع بتروف'},
    'e4 e5 Nf3 Nf6 Nxe5': {eco: 'C42', name: "Petrov's Defense: Classical", name_ar: 'دفاع بتروف: الكلاسيكي'},
    'e4 e5 Nf3 Nf6 d4': {eco: 'C43', name: "Petrov's Defense: Steinitz Attack", name_ar: 'دفاع بتروف: هجوم شتاينتز'},

    // Philidor Defense
    'e4 e5 Nf3 d6': {eco: 'C41', name: 'Philidor Defense', name_ar: 'دفاع فيليدور'},
    'e4 e5 Nf3 d6 d4': {eco: 'C41', name: 'Philidor Defense', name_ar: 'دفاع فيليدور'},

    // King's Gambit
    'e4 e5 f4': {eco: 'C30', name: "King's Gambit", name_ar: 'غامبيت الملك'},
    'e4 e5 f4 exf4': {eco: 'C33', name: "King's Gambit Accepted", name_ar: 'غامبيت الملك المقبول'},
    'e4 e5 f4 Bc5': {eco: 'C30', name: "King's Gambit Declined", name_ar: 'غامبيت الملك المرفوض'},

    // Vienna Game
    'e4 e5 Nc3': {eco: 'C25', name: 'Vienna Game', name_ar: 'لعبة فيينا'},
    'e4 e5 Nc3 Nf6': {eco: 'C26', name: 'Vienna Game', name_ar: 'لعبة فيينا'},
    'e4 e5 Nc3 Nc6 f4': {eco: 'C25', name: 'Vienna Gambit', name_ar: 'غامبيت فيينا'},

    // Four Knights
    'e4 e5 Nf3 Nc6 Nc3 Nf6': {eco: 'C46', name: 'Four Knights Game', name_ar: 'لعبة الفرسان الاربعة'},

    // === SICILIAN DEFENSE ===
    'e4 c5': {eco: 'B20', name: 'Sicilian Defense', name_ar: 'الدفاع الصقلي'},
    'e4 c5 Nf3': {eco: 'B27', name: 'Sicilian Defense', name_ar: 'الدفاع الصقلي'},
    'e4 c5 Nf3 d6': {eco: 'B50', name: 'Sicilian Defense', name_ar: 'الدفاع الصقلي'},
    'e4 c5 Nf3 d6 d4': {eco: 'B50', name: 'Sicilian Defense: Open', name_ar: 'الدفاع الصقلي: المفتوح'},
    'e4 c5 Nf3 d6 d4 cxd4 Nxd4': {eco: 'B50', name: 'Sicilian Defense: Open', name_ar: 'الدفاع الصقلي: المفتوح'},
    'e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3': {eco: 'B56', name: 'Sicilian Defense: Open', name_ar: 'الدفاع الصقلي: المفتوح'},
    'e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 a6': {eco: 'B90', name: 'Sicilian Defense: Najdorf', name_ar: 'الدفاع الصقلي: نايدورف'},
    'e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 a6 Bg5': {eco: 'B94', name: 'Sicilian Najdorf: Classical', name_ar: 'الصقلي نايدورف: الكلاسيكي'},
    'e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 a6 Be2': {eco: 'B92', name: 'Sicilian Najdorf: Opocensky', name_ar: 'الصقلي نايدورف: اوبوتشنسكي'},
    'e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 g6': {eco: 'B70', name: 'Sicilian Defense: Dragon', name_ar: 'الدفاع الصقلي: التنين'},
    'e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 g6 Be3 Bg7 f3': {eco: 'B76', name: 'Sicilian Dragon: Yugoslav Attack', name_ar: 'الصقلي التنين: الهجوم اليوغسلافي'},
    'e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 e6': {eco: 'B80', name: 'Sicilian Defense: Scheveningen', name_ar: 'الدفاع الصقلي: شيفننغن'},
    'e4 c5 Nf3 Nc6': {eco: 'B30', name: 'Sicilian Defense', name_ar: 'الدفاع الصقلي'},
    'e4 c5 Nf3 Nc6 d4 cxd4 Nxd4 Nf6 Nc3 e5': {eco: 'B33', name: 'Sicilian Defense: Sveshnikov', name_ar: 'الدفاع الصقلي: سفيشنيكوف'},
    'e4 c5 Nf3 e6': {eco: 'B40', name: 'Sicilian Defense', name_ar: 'الدفاع الصقلي'},
    'e4 c5 Nf3 e6 d4 cxd4 Nxd4 Nc6': {eco: 'B45', name: 'Sicilian Defense: Taimanov', name_ar: 'الدفاع الصقلي: تايمانوف'},
    'e4 c5 Nc3': {eco: 'B23', name: 'Sicilian Defense: Closed', name_ar: 'الدفاع الصقلي: المغلق'},
    'e4 c5 c3': {eco: 'B22', name: 'Sicilian Defense: Alapin', name_ar: 'الدفاع الصقلي: الابين'},
    'e4 c5 d4 cxd4 c3': {eco: 'B21', name: 'Sicilian Defense: Smith-Morra Gambit', name_ar: 'الدفاع الصقلي: غامبيت سميث-مورا'},

    // === FRENCH DEFENSE ===
    'e4 e6': {eco: 'C00', name: 'French Defense', name_ar: 'الدفاع الفرنسي'},
    'e4 e6 d4': {eco: 'C00', name: 'French Defense', name_ar: 'الدفاع الفرنسي'},
    'e4 e6 d4 d5': {eco: 'C01', name: 'French Defense', name_ar: 'الدفاع الفرنسي'},
    'e4 e6 d4 d5 Nc3': {eco: 'C03', name: 'French Defense', name_ar: 'الدفاع الفرنسي'},
    'e4 e6 d4 d5 Nc3 Bb4': {eco: 'C15', name: 'French Defense: Winawer', name_ar: 'الدفاع الفرنسي: فيناور'},
    'e4 e6 d4 d5 Nc3 Bb4 e5': {eco: 'C16', name: 'French Winawer: Advance', name_ar: 'الفرنسي فيناور: المتقدم'},
    'e4 e6 d4 d5 Nc3 Nf6': {eco: 'C10', name: 'French Defense: Classical', name_ar: 'الدفاع الفرنسي: الكلاسيكي'},
    'e4 e6 d4 d5 Nc3 Nf6 Bg5': {eco: 'C13', name: 'French Defense: Classical, Burn', name_ar: 'الدفاع الفرنسي: الكلاسيكي بيرن'},
    'e4 e6 d4 d5 e5': {eco: 'C02', name: 'French Defense: Advance', name_ar: 'الدفاع الفرنسي: المتقدم'},
    'e4 e6 d4 d5 Nd2': {eco: 'C03', name: 'French Defense: Tarrasch', name_ar: 'الدفاع الفرنسي: تاراش'},
    'e4 e6 d4 d5 exd5 exd5': {eco: 'C01', name: 'French Defense: Exchange', name_ar: 'الدفاع الفرنسي: التبادل'},

    // === CARO-KANN ===
    'e4 c6': {eco: 'B10', name: 'Caro-Kann Defense', name_ar: 'دفاع كارو-كان'},
    'e4 c6 d4': {eco: 'B10', name: 'Caro-Kann Defense', name_ar: 'دفاع كارو-كان'},
    'e4 c6 d4 d5': {eco: 'B12', name: 'Caro-Kann Defense', name_ar: 'دفاع كارو-كان'},
    'e4 c6 d4 d5 Nc3': {eco: 'B15', name: 'Caro-Kann Defense', name_ar: 'دفاع كارو-كان'},
    'e4 c6 d4 d5 Nc3 dxe4 Nxe4': {eco: 'B15', name: 'Caro-Kann: Classical', name_ar: 'كارو-كان: الكلاسيكي'},
    'e4 c6 d4 d5 Nc3 dxe4 Nxe4 Bf5': {eco: 'B18', name: 'Caro-Kann: Classical', name_ar: 'كارو-كان: الكلاسيكي'},
    'e4 c6 d4 d5 Nc3 dxe4 Nxe4 Nd7': {eco: 'B17', name: 'Caro-Kann: Steinitz', name_ar: 'كارو-كان: شتاينتز'},
    'e4 c6 d4 d5 e5': {eco: 'B12', name: 'Caro-Kann: Advance', name_ar: 'كارو-كان: المتقدم'},
    'e4 c6 d4 d5 exd5 cxd5': {eco: 'B13', name: 'Caro-Kann: Exchange', name_ar: 'كارو-كان: التبادل'},
    'e4 c6 d4 d5 Nd2': {eco: 'B12', name: 'Caro-Kann: Short Variation', name_ar: 'كارو-كان: المختصر'},

    // === SCANDINAVIAN ===
    'e4 d5': {eco: 'B01', name: 'Scandinavian Defense', name_ar: 'الدفاع الاسكندنافي'},
    'e4 d5 exd5 Qxd5': {eco: 'B01', name: 'Scandinavian Defense: Mieses-Kotroc', name_ar: 'الاسكندنافي: ميسيس-كوتروك'},
    'e4 d5 exd5 Nf6': {eco: 'B01', name: 'Scandinavian Defense: Modern', name_ar: 'الاسكندنافي: الحديث'},

    // === PIRC DEFENSE ===
    'e4 d6': {eco: 'B07', name: 'Pirc Defense', name_ar: 'دفاع بيرك'},
    'e4 d6 d4 Nf6': {eco: 'B07', name: 'Pirc Defense', name_ar: 'دفاع بيرك'},
    'e4 d6 d4 Nf6 Nc3 g6': {eco: 'B07', name: 'Pirc Defense: Classical', name_ar: 'دفاع بيرك: الكلاسيكي'},
    'e4 d6 d4 Nf6 Nc3 g6 f4': {eco: 'B09', name: 'Pirc Defense: Austrian Attack', name_ar: 'دفاع بيرك: الهجوم النمساوي'},

    // === ALEKHINE'S DEFENSE ===
    'e4 Nf6': {eco: 'B02', name: "Alekhine's Defense", name_ar: 'دفاع اليخين'},
    'e4 Nf6 e5 Nd5': {eco: 'B03', name: "Alekhine's Defense", name_ar: 'دفاع اليخين'},
    'e4 Nf6 e5 Nd5 d4 d6': {eco: 'B05', name: "Alekhine's Defense: Modern", name_ar: 'دفاع اليخين: الحديث'},

    // === QUEEN'S PAWN (1.d4) ===
    'd4': {eco: 'A45', name: "Queen's Pawn", name_ar: 'افتتاح بيدق الوزير'},
    'd4 d5': {eco: 'D00', name: "Queen's Pawn Game", name_ar: 'لعبة بيدق الوزير'},
    'd4 Nf6': {eco: 'A45', name: "Indian Defense", name_ar: 'الدفاع الهندي'},

    // Queen's Gambit
    'd4 d5 c4': {eco: 'D06', name: "Queen's Gambit", name_ar: 'غامبيت الملكة'},
    'd4 d5 c4 e6': {eco: 'D30', name: "Queen's Gambit Declined", name_ar: 'غامبيت الملكة المرفوض'},
    'd4 d5 c4 e6 Nc3': {eco: 'D31', name: "Queen's Gambit Declined", name_ar: 'غامبيت الملكة المرفوض'},
    'd4 d5 c4 e6 Nc3 Nf6': {eco: 'D35', name: "Queen's Gambit Declined: Exchange", name_ar: 'غامبيت الملكة المرفوض: التبادل'},
    'd4 d5 c4 e6 Nc3 Nf6 Bg5': {eco: 'D37', name: "Queen's Gambit Declined: Classical", name_ar: 'غامبيت الملكة المرفوض: الكلاسيكي'},
    'd4 d5 c4 e6 Nf3 Nf6 Nc3 Be7 Bf4': {eco: 'D38', name: "Queen's Gambit Declined: Ragozin", name_ar: 'غامبيت الملكة المرفوض: راغوزين'},
    'd4 d5 c4 dxc4': {eco: 'D20', name: "Queen's Gambit Accepted", name_ar: 'غامبيت الملكة المقبول'},
    'd4 d5 c4 dxc4 Nf3': {eco: 'D25', name: "Queen's Gambit Accepted", name_ar: 'غامبيت الملكة المقبول'},
    'd4 d5 c4 c6': {eco: 'D10', name: 'Slav Defense', name_ar: 'الدفاع السلافي'},
    'd4 d5 c4 c6 Nf3 Nf6 Nc3': {eco: 'D15', name: 'Slav Defense', name_ar: 'الدفاع السلافي'},
    'd4 d5 c4 c6 Nf3 Nf6 Nc3 dxc4': {eco: 'D17', name: 'Slav Defense: Czech', name_ar: 'الدفاع السلافي: التشيكي'},
    'd4 d5 c4 c6 Nf3 Nf6 Nc3 e6': {eco: 'D45', name: 'Semi-Slav Defense', name_ar: 'الدفاع شبه السلافي'},

    // London System
    'd4 d5 Bf4': {eco: 'D00', name: 'London System', name_ar: 'نظام لندن'},
    'd4 d5 Nf3 Nf6 Bf4': {eco: 'D00', name: 'London System', name_ar: 'نظام لندن'},
    'd4 Nf6 Bf4': {eco: 'A45', name: 'London System', name_ar: 'نظام لندن'},
    'd4 Nf6 Nf3 e6 Bf4': {eco: 'A46', name: 'London System', name_ar: 'نظام لندن'},

    // King's Indian Defense
    'd4 Nf6 c4 g6': {eco: 'E60', name: "King's Indian Defense", name_ar: 'الدفاع الهندي الملكي'},
    'd4 Nf6 c4 g6 Nc3 Bg7': {eco: 'E70', name: "King's Indian Defense", name_ar: 'الدفاع الهندي الملكي'},
    'd4 Nf6 c4 g6 Nc3 Bg7 e4 d6': {eco: 'E70', name: "King's Indian Defense", name_ar: 'الدفاع الهندي الملكي'},
    'd4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Nf3 O-O Be2 e5': {eco: 'E90', name: "King's Indian: Classical", name_ar: 'الهندي الملكي: الكلاسيكي'},
    'd4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f3': {eco: 'E81', name: "King's Indian: Saemisch", name_ar: 'الهندي الملكي: سيميش'},
    'd4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f4': {eco: 'E76', name: "King's Indian: Four Pawns Attack", name_ar: 'الهندي الملكي: هجوم الاربعة بيادق'},

    // Nimzo-Indian
    'd4 Nf6 c4 e6': {eco: 'E00', name: 'Indian Defense', name_ar: 'الدفاع الهندي'},
    'd4 Nf6 c4 e6 Nc3 Bb4': {eco: 'E20', name: 'Nimzo-Indian Defense', name_ar: 'الدفاع الهندي نيمزو'},
    'd4 Nf6 c4 e6 Nc3 Bb4 Qc2': {eco: 'E32', name: 'Nimzo-Indian: Classical', name_ar: 'نيمزو هندي: الكلاسيكي'},
    'd4 Nf6 c4 e6 Nc3 Bb4 e3': {eco: 'E40', name: 'Nimzo-Indian: Rubinstein', name_ar: 'نيمزو هندي: روبنشتاين'},

    // Grunfeld Defense
    'd4 Nf6 c4 g6 Nc3 d5': {eco: 'D70', name: 'Grunfeld Defense', name_ar: 'دفاع غرونفيلد'},
    'd4 Nf6 c4 g6 Nc3 d5 cxd5 Nxd5': {eco: 'D80', name: 'Grunfeld Defense: Exchange', name_ar: 'غرونفيلد: التبادل'},
    'd4 Nf6 c4 g6 Nc3 d5 Nf3': {eco: 'D71', name: 'Grunfeld Defense', name_ar: 'دفاع غرونفيلد'},

    // Catalan
    'd4 Nf6 c4 e6 g3': {eco: 'E01', name: 'Catalan Opening', name_ar: 'الافتتاح الكتلاني'},
    'd4 Nf6 c4 e6 g3 d5': {eco: 'E04', name: 'Catalan Opening', name_ar: 'الافتتاح الكتلاني'},
    'd4 Nf6 c4 e6 g3 d5 Bg2': {eco: 'E04', name: 'Catalan Opening', name_ar: 'الافتتاح الكتلاني'},

    // Queen's Indian
    'd4 Nf6 c4 e6 Nf3 b6': {eco: 'E15', name: "Queen's Indian Defense", name_ar: 'الدفاع الهندي الملكة'},

    // Bogo-Indian
    'd4 Nf6 c4 e6 Nf3 Bb4+': {eco: 'E11', name: 'Bogo-Indian Defense', name_ar: 'الدفاع الهندي بوغو'},

    // Dutch Defense
    'd4 f5': {eco: 'A80', name: 'Dutch Defense', name_ar: 'الدفاع الهولندي'},
    'd4 f5 c4 Nf6 g3 e6 Bg2': {eco: 'A83', name: 'Dutch Defense: Stonewall', name_ar: 'الدفاع الهولندي: الجدار الحجري'},
    'd4 f5 g3': {eco: 'A81', name: 'Dutch Defense: Leningrad', name_ar: 'الدفاع الهولندي: لينينغراد'},

    // === ENGLISH OPENING ===
    'c4': {eco: 'A10', name: 'English Opening', name_ar: 'الافتتاح الانجليزي'},
    'c4 e5': {eco: 'A20', name: 'English Opening: Reversed Sicilian', name_ar: 'الانجليزي: الصقلي المعكوس'},
    'c4 c5': {eco: 'A30', name: 'English Opening: Symmetrical', name_ar: 'الانجليزي: المتماثل'},
    'c4 Nf6': {eco: 'A15', name: 'English Opening', name_ar: 'الافتتاح الانجليزي'},
    'c4 Nf6 Nc3 e5': {eco: 'A25', name: 'English Opening', name_ar: 'الافتتاح الانجليزي'},
    'c4 Nf6 Nc3 g6': {eco: 'A16', name: 'English Opening', name_ar: 'الافتتاح الانجليزي'},
    'c4 e6': {eco: 'A13', name: 'English Opening', name_ar: 'الافتتاح الانجليزي'},

    // === RETI OPENING ===
    'Nf3': {eco: 'A04', name: 'Reti Opening', name_ar: 'افتتاح ريتي'},
    'Nf3 d5': {eco: 'A05', name: 'Reti Opening', name_ar: 'افتتاح ريتي'},
    'Nf3 d5 c4': {eco: 'A09', name: 'Reti Opening', name_ar: 'افتتاح ريتي'},
    'Nf3 Nf6 g3': {eco: 'A06', name: 'Reti Opening', name_ar: 'افتتاح ريتي'},

    // === BIRD'S OPENING ===
    'f4': {eco: 'A02', name: "Bird's Opening", name_ar: 'افتتاح بيرد'},
    'f4 d5': {eco: 'A03', name: "Bird's Opening", name_ar: 'افتتاح بيرد'},

    // === QUEEN'S PAWN MISC ===
    'd4 d5 Nf3 Nf6 e3 e6 Bd3': {eco: 'D05', name: 'Colle System', name_ar: 'نظام كولي'},
    'd4 d5 c4 e6 Nf3 Nf6 g3': {eco: 'D37', name: 'Catalan Variation', name_ar: 'تنويعة الكتلاني'},

    // === MODERN / OTHER ===
    'e4 g6': {eco: 'B06', name: 'Modern Defense', name_ar: 'الدفاع الحديث'},
    'e4 g6 d4 Bg7': {eco: 'B06', name: 'Modern Defense', name_ar: 'الدفاع الحديث'},
    'd4 g6': {eco: 'A40', name: 'Modern Defense', name_ar: 'الدفاع الحديث'},

    // Benoni
    'd4 Nf6 c4 c5 d5 e6': {eco: 'A60', name: 'Benoni Defense', name_ar: 'دفاع بينوني'},
    'd4 Nf6 c4 c5 d5 e6 Nc3 exd5 cxd5 d6': {eco: 'A70', name: 'Benoni Defense: Classical', name_ar: 'بينوني: الكلاسيكي'},

    // Budapest Gambit
    'd4 Nf6 c4 e5': {eco: 'A51', name: 'Budapest Gambit', name_ar: 'غامبيت بودابست'},

    // Trompowsky
    'd4 Nf6 Bg5': {eco: 'A45', name: 'Trompowsky Attack', name_ar: 'هجوم ترومبوفسكي'},

    // Torre Attack
    'd4 Nf6 Nf3 e6 Bg5': {eco: 'A46', name: 'Torre Attack', name_ar: 'هجوم توري'},

    // Zukertort
    'Nf3 d5 d4 Nf6 c4 e6': {eco: 'D02', name: 'Zukertort Opening', name_ar: 'افتتاح زوكرتورت'}
  };

  // Sort keys by length (longest first) for prefix matching
  const sortedKeys = Object.keys(db).sort((a, b) => b.length - a.length);

  return {
    /**
     * Look up the opening for a given move sequence.
     * @param {string} moves - Space-separated SAN moves (e.g. "e4 e5 Nf3 Nc6 Bb5")
     * @returns {{eco: string, name: string, name_ar: string}|null}
     */
    lookup: function(moves) {
      if (!moves || moves.trim() === '') return null;
      const normalized = moves.trim();
      // Try exact match first
      if (db[normalized]) return db[normalized];
      // Find longest prefix match
      for (let i = 0; i < sortedKeys.length; i++) {
        const key = sortedKeys[i];
        if (normalized === key || normalized.startsWith(key + ' ')) {
          return db[key];
        }
      }
      return null;
    },

    /**
     * Get all openings in the database.
     * @returns {Object}
     */
    getAll: function() {
      return db;
    }
  };
})();
