# -*- coding: utf-8 -*-
"""Level 4 — Mission Grammaire, from « Grammaire 4 » (SABIS).
Each lesson follows the book: J'observe -> Je retiens (rule cards) -> Je m'entraîne (activities).
The book has no answer key for most exercises: answers below were written and checked by hand."""
from .kit import fill, rewrite, match, choose, hunt, rules, lesson, act, sort, order, vf, speed

MF = [("m", "Masculin", "مذكّر", "👦"), ("f", "Féminin", "مؤنث", "👧")]


def noms():
    lid = "l4-gr01"
    cards = [("Les noms de personnes, de pays, de villes et d'habitants sont des NOMS PROPRES : ils prennent une majuscule. — Sophie vit en France.", "أسماء العَلَم (أشخاص، بلدان، مدن، سكان) تبدأ دائماً بحرف كبير", "🔠"),
             ("Les noms de personnes, d'objets, d'animaux, de sentiments sont des NOMS COMMUNS. — un garçon, une fraise, la joie", "أسماء الجنس: أشخاص وأشياء وحيوانات ومشاعر", "🔡"),
             ("Pas d'article devant un nom de ville ou de personne. — Paris est une ville. Sophie est une fille.", "لا أداة تعريف قبل اسم مدينة أو شخص", "🚫"),
             ("Continent, pays, région, fleuve, habitants : avec un article. — la Suisse, le Nil, les Bretons", "القارات والبلدان والأنهار والسكان تسبقها أداة", "🗺️"),
             ("Jamais d'article après « en ». — Il va en Chine.", "لا أداة بعد en", "✈️")]
    pc = [("Armand", "p"), ("Bordeaux", "p"), ("le Japon", "p"), ("les Italiens", "p"), ("la Seine", "p"), ("Anna", "p"), ("l'Inde", "p"),
          ("un garçon", "c"), ("une sœur", "c"), ("la joie", "c"), ("un oiseau", "c"), ("la crainte", "c"), ("une tour", "c"), ("le professeur", "c")]
    intrus = [("L'Égypte – Le professeur – La table – Les enfants : l'intrus ?", ["L'Égypte", "Le professeur", "La table", "Les enfants"], "L'Égypte", None, "L'Égypte اسم عَلَم والباقي أسماء جنس"),
              ("Paris – Rome – La Belgique – L'habitant : l'intrus ?", ["Paris", "Rome", "La Belgique", "L'habitant"], "L'habitant", None, "l'habitant اسم جنس والباقي أسماء عَلَم"),
              ("La crainte – La joie – La haine – La Seine : l'intrus ?", ["La crainte", "La joie", "La haine", "La Seine"], "La Seine", None, "la Seine نهر (اسم عَلَم) والباقي مشاعر"),
              ("Un igloo – Une tour – Un château – Un Français : l'intrus ?", ["Un igloo", "Une tour", "Un château", "Un Français"], "Un Français", None, "un Français من السكان (اسم عَلَم) والباقي أبنية")]
    hu = [("*guillaume* et Simon ont rendu visite à leur voisin.", "Guillaume", "اسم شخص: حرف كبير"),
          ("Ils ont rendu visite à leur voisin et à son fils *marc*.", "Marc", "اسم شخص: حرف كبير"),
          ("Vous avez pris le train à *toulouse* pour aller à Bordeaux.", "Toulouse", "اسم مدينة: حرف كبير"),
          ("Il relie Paris à *mexico* en quatre heures.", "Mexico", "اسم مدينة: حرف كبير"),
          ("Le *concorde* est un avion très rapide.", "Concorde", "اسم الطائرة اسم عَلَم: حرف كبير")]
    genre = [(w, g) for w, g in [("verre", "m"), ("ciseaux", "m"), ("rideau", "m"), ("lune", "f"), ("calendrier", "m"), ("fortune", "f"), ("lampe", "f"),
                                 ("stylo", "m"), ("armoire", "f"), ("comédie", "f"), ("avion", "m"), ("fusée", "f"), ("musée", "m"), ("menthe", "f"),
                                 ("région", "f"), ("oreille", "f"), ("orchestre", "m"), ("pistolet", "m")]]
    art = [("___ pauvre petite fille pleure à haute voix.", ["La", "Le", "(rien)"], "La", None, "اسم جنس مؤنث: La"),
           ("___ Beyrouth est la capitale du Liban.", ["La", "Le", "(rien)"], "(rien)", None, "اسم مدينة: لا أداة"),
           ("___ France est un pays européen.", ["La", "Le", "(rien)"], "La", None, "اسم بلد: مع أداة"),
           ("Le gobelet de ___ Sarah est posé sur le lavabo.", ["la", "le", "(rien)"], "(rien)", None, "اسم شخص: لا أداة"),
           ("Je n'ai jamais visité ___ Maroc.", ["le", "la", "(rien)"], "le", None, "اسم بلد مذكر: le"),
           ("Ma ville préférée est ___ Marseille.", ["la", "le", "(rien)"], "(rien)", None, "اسم مدينة: لا أداة"),
           ("Il va en ___ Chine pour son kung-fu.", ["la", "le", "(rien)"], "(rien)", None, "لا أداة بعد en")]
    return lesson(lid, "Ch. 1", "Les noms propres et les noms communs", "أسماء العَلَم وأسماء الجنس", "🏷️", [
        rules(lid, 1, cards), sort(lid, 2, [("p", "Nom propre", "اسم عَلَم", "🔠"), ("c", "Nom commun", "اسم جنس", "🔡")], pc, "Propre ou commun ?", "عَلَم أم جنس؟"),
        choose(lid, 3, intrus, "Trouve l'intrus", "اكتشف الدخيل"), hunt(lid, 4, hu, "Les majuscules oubliées", "الحروف الكبيرة المنسيّة", case=True, instr="Je trouve le mot qui doit prendre une majuscule et je le récris.", instr_ar="المس الكلمة التي تحتاج حرفاً كبيراً ثم اكتبها صحيحة."),
        sort(lid, 5, MF, genre, "Masculin ou féminin ?", "مذكّر أم مؤنث؟"), choose(lid, 6, art, "Un article… ou rien ?", "أداة… أم لا شيء؟")])


def articles():
    lid = "l4-gr02"
    cards = [("Indéfinis : un, une, des — on ne sait pas exactement de qui on parle. — Des bûcherons coupent des arbres.", "أدوات النكرة un, une, des: لشيء غير محدد", "❓"),
             ("Définis : le, la, l', les — on sait de qui on parle, ou c'est une généralité. — Le Soleil est une étoile.", "أدوات المعرفة le, la, l', les: لشيء معروف أو عام", "☀️"),
             ("Devant une voyelle ou un h muet : l'. — l'univers, l'étoile, l'hôtel", "قبل حرف علة أو h صامتة: l'", "🔤"),
             ("Mais le h aspiré garde le / la : le hasard, le héros, le hamac, la hache, le hibou.", "لكن h المنطوقة تبقي le / la", "😮"),
             ("Le, la, les devant : une langue, une matière, un sport, un repas, une saison, une date, une habitude (les lundis), une mesure (2 euros le kilo).", "أداة المعرفة قبل اللغات والمواد والرياضات والوجبات والفصول والتواريخ", "📅")]
    lap = [("orage", "l"), ("averse", "l"), ("éléphant", "l"), ("avion", "l"), ("année", "l"), ("chatte", "la"), ("vache", "la"), ("vaisselle", "la"),
           ("prison", "la"), ("renard", "le"), ("gobelet", "le"), ("portefeuille", "le"), ("héros", "le"), ("hamac", "le"), ("ciment", "le")]
    hu = [("Il porte *la* chaussettes grises.", "les", "chaussettes جمع: les"), ("*La* chauffeur s'arrête au feu rouge.", "Le", "chauffeur مذكر: Le"),
          ("*Le* candidate gagnante monte sur le podium.", "La", "candidate مؤنث: La"), ("*La* résultat de fin d'année est excellent.", "Le", "résultat مذكر: Le"),
          ("Les lumières vives attirent *l'insectes* nocturnes.", "les insectes", "جمع: les"), ("*Le* fille glisse sur la glace.", "La", "fille مؤنث: La")]
    ex = ["___ pays = le ; les", "___ décoration = la", "___ judo = le", "___ œil = l'", "___ héros = le ; les", "___ dîner = le", "___ équipes = les",
          "___ hamac = le", "___ silhouette = la", "___ photographes = les"]
    use = ["En classe, nous apprenons ___ chinois. = le", "___ dîner n'est pas un repas essentiel pour moi. = Le",
           "___ anglais est une langue germanique. = L'", "___ plastique est une matière synthétique. = Le",
           "___ vers de terre se nourrissent de plantes. = Les", "J'apprends ___ chimie dans les meilleurs laboratoires. = la",
           "___ ouïe diminue avec l'âge. = L'", "C'est ___ printemps, ___ fleurs bourgeonnent. = le | les",
           "___ automne commence le 21 septembre. = L'", "___ jeudi après-midi, j'allais au cinéma. = Le",
           "On trouve de la vitamine C dans ___ jus d'orange. = le", "Ces tomates se vendent 2 euros ___ kilo. = le"]
    return lesson(lid, "Ch. 2-1", "Les articles définis et indéfinis", "أدوات المعرفة والنكرة", "📌", [
        rules(lid, 1, cards), sort(lid, 2, [("l", "L'", "قبل حرف علة", "🔤"), ("le", "Le", "مذكّر", "👦"), ("la", "La", "مؤنث", "👧")], lap, "L', le ou la ?", "L' أم le أم la؟"),
        hunt(lid, 3, hu, "L'article qui cloche", "الأداة الخاطئة", instr="Je trouve l'article faux et je le corrige.", instr_ar="المس الأداة الخاطئة ثم صحّحها."),
        fill(lid, 4, ex, "Le, la, l' ou les ?", "le أم la أم l' أم les؟", "J'écris l'article défini.", "اكتب أداة المعرفة المناسبة."),
        fill(lid, 5, use, "Langues, repas, saisons…", "لغات ووجبات وفصول…", "J'ajoute l'article défini qui convient.", "أضف أداة المعرفة المناسبة.")])


def contractes():
    lid = "l4-gr03"
    cards = [("à + le = au : Je vais au cinéma. — à + les = aux : la fille aux cheveux longs.", "à + le تصبح au، وà + les تصبح aux", "🔗"),
             ("à la et à l' ne changent pas : Je parle à la maman, à l'amie, à l'homme.", "à la وà l' لا تتغيران", "✋"),
             ("de + le = du : le pays du Soleil levant. — de + les = des : le parfum des fleurs.", "de + le تصبح du، وde + les تصبح des", "🌸"),
             ("de la et de l' ne changent pas : le sens de l'humour, le couvercle de la casserole.", "de la وde l' لا تتغيران", "😄")]
    rel = [("J'adore les pâtes", "à la crème."), ("J'ai fait un tour", "au jardin zoologique."), ("Vous achetez des gâteaux", "au chocolat."),
           ("Ne t'assieds pas", "à l'arrière de la voiture."), ("Mon frère est hospitalisé", "aux soins intensifs.")]
    ex = ["Je ne parle plus ___ amies de ma sœur. = aux", "Demande ___ papa de ton copain pourquoi il ne va pas ___ cinéma. = au | au",
          "Il donne des engrais ___ plantes. = aux", "Il mange un pain ___ raisins. = aux",
          "Les gens qui ont peur ___ tonnerre me font rire. = du", "Elle soulève le couvercle ___ casserole. = de la",
          "C'est une personne qui a le sens ___ humour. = de l'", "Le tic-tac ___ horloge m'endort. = de l'", "Le goût ___ fruits n'est pas terrible. = des"]
    ch = [("Il a raconté une histoire ___ directeur.", ["au", "à le", "aux"], "au"), ("Il a accédé ___ plus hautes fonctions de l'État.", ["aux", "à les", "au"], "aux"),
          ("Elle est arrivée en retard ___ bureau.", ["au", "à la", "aux"], "au"), ("La hauteur ___ bâtiment est hors norme.", ["du", "de le", "des"], "du"),
          ("On appelle le Liban le Pays ___ Cèdres.", ["des", "de les", "du"], "des"), ("Les gens ___ village voisin sont accueillants.", ["du", "de le", "de la"], "du")]
    return lesson(lid, "Ch. 2-2", "Les articles contractés : au, aux, du, des", "الأدوات المدمجة: au, aux, du, des", "🔗", [
        rules(lid, 1, cards), match(lid, 2, rel), fill(lid, 3, ex, "Au, aux, du, des…", "au, aux, du, des…", "J'écris l'article contracté qui convient.", "اكتب الأداة المناسبة."),
        choose(lid, 4, ch, "La bonne contraction", "الدمج الصحيح")])


def partitifs():
    lid = "l4-gr04"
    cards = [("Du, de la, de l' : une quantité qu'on ne compte pas, une partie. — Il ajoute du lait. Il y aura du vent.", "أداة التبعيض: لكمية لا تُعدّ أو لجزء من شيء", "🥛"),
             ("Des : un nom toujours au pluriel. — Nous mangeons des épinards.", "des: لاسم يأتي جمعاً دائماً", "🥬"),
             ("Après beaucoup, peu, trop, assez, combien, moins, plus : de / d'. — beaucoup de chocolat, assez d'eau", "بعد كلمات الكمية: de / d'", "⚖️"),
             ("Phrase négative : du, de la, des → de / d'. — Il n'y a pas de fromage.", "في النفي تصبح أداة التبعيض de / d'", "🚫"),
             ("Sauf avec être : Ce n'est pas du sel. — Avec garde l'article, sans l'enlève : avec du sucre / sans sucre.", "إلا مع être، وبعد sans تُحذف الأداة", "☕")]
    ex = ["Pourrais-tu me rapporter ___ pain, ___ confiture et ___ miel ? = du | de la | du", "Leila mange ___ glace. = de la",
          "Pour guérir, le médecin t'a dit de boire ___ eau. = de l'", "Il y a ___ pâtes au menu aujourd'hui. = des",
          "On attend ___ pluie pour demain. = de la", "Les volcans crachent ___ vapeur. = de la", "Le cactus vit avec très peu ___ eau. = d'"]
    ch = [("Il n'a pas ___ courage.", ["du", "de", "de la", "des"], "de"), ("Il ne tombe jamais ___ pluie dans ces régions.", ["de", "des", "de la", "du"], "de"),
          ("Il n'a pas ___ argent.", ["de", "des", "d'", "du"], "d'"), ("Il parle sans faire ___ fautes.", ["des", "de", "du", "de la"], "de"),
          ("Ce n'est pas ___ confiture.", ["des", "de la", "du", "de l'"], "de la"), ("Mon père n'aime pas boire ___ café.", ["de", "du", "des"], "de"),
          ("Il n'y a pas ___ eau au frigo.", ["d'", "de l'", "de la"], "d'")]
    rw = [("Il y a du vent ce matin.", "Il n'y a pas de vent ce matin."), ("Je mangerai des céréales.", "Je ne mangerai pas de céréales."),
          ("Il y a des épinards dans la casserole.", "Il n'y a pas d'épinards dans la casserole."), ("Elle fait du sport tous les matins.", "Elle ne fait pas de sport tous les matins."),
          ("L'enfant éprouve de la crainte.", "L'enfant n'éprouve pas de crainte.")]
    return lesson(lid, "Ch. 2-3", "Les partitifs : du, de la, des", "أدوات التبعيض: du, de la, des", "🍯", [
        rules(lid, 1, cards), fill(lid, 2, ex, "Du, de la, de l', des", "du أو de la أو de l' أو des", "J'écris le partitif qui convient.", "اكتب أداة التبعيض المناسبة."),
        choose(lid, 3, ch, "À la forme négative", "في صيغة النفي"),
        rewrite(lid, 4, "Je mets la phrase à la forme négative (ne… pas).", "حوّل الجملة إلى النفي (ne… pas).", rw, "Je dis non !", "أنفي الجملة")])


def demonstratifs():
    lid = "l4-gr05"
    cards = [("Ce + nom masculin singulier : ce chemin. — Cette + nom féminin : cette route. — Ces + pluriel : ces pommes.", "أسماء الإشارة: ce للمذكر، cette للمؤنث، ces للجمع", "👉"),
             ("Ce devient cet devant une voyelle ou un h muet : cet abricot, cet enfant, cet hiver, cet homme.", "ce تصبح cet قبل حرف علة أو h صامتة", "🍑"),
             ("Mais ce reste ce devant un h aspiré : ce hamac, ce héros, ce hibou.", "وتبقى ce قبل h المنطوقة", "🦉")]
    dem = [("pomme de terre", "cette"), ("tableau", "ce"), ("chaises", "ces"), ("habitude", "cette"), ("tonnerre", "ce"), ("écharpe", "cette"),
           ("appartement", "cet"), ("homme", "cet"), ("visage", "ce"), ("bouteille", "cette"), ("directeur", "ce"), ("hôtels", "ces"), ("héros", "ce"), ("hiver", "cet")]
    ex = ["Surtout ne prends pas ___ chemin ! = ce", "Regardez comme ___ arbres sont splendides ! = ces", "Ne partez pas sans ___ uniforme. = cet",
          "___ grande tortue fait partie d'une espèce rare. = Cette", "___ champignons sont vénéneux. = Ces", "___ produit est d'une grande qualité. = Ce",
          "J'ai décidé de ne plus utiliser ___ ordinateur. = cet", "___ homme est le chef du département de sciences. = Cet"]
    rw = [("Ces étoiles apparaissent en premier dans le ciel.", "Cette étoile apparaît en premier dans le ciel. ; Cette étoile apparait en premier dans le ciel."),
          ("Ces papillons sont jolis.", "Ce papillon est joli."), ("Ces magazines paraissent tous les mois.", "Ce magazine paraît tous les mois. ; Ce magazine parait tous les mois."),
          ("Ces bicyclettes noires sont à vendre.", "Cette bicyclette noire est à vendre."), ("Ces aviateurs survolent la région.", "Cet aviateur survole la région.")]
    return lesson(lid, "Ch. 2-4", "Les démonstratifs : ce, cet, cette, ces", "أسماء الإشارة: ce, cet, cette, ces", "👉", [
        rules(lid, 1, cards), sort(lid, 2, [("ce", "Ce", "مذكّر", "👦"), ("cet", "Cet", "مذكّر + حرف علة", "🍑"), ("cette", "Cette", "مؤنث", "👧"), ("ces", "Ces", "جمع", "👥")], dem,
                                   "Ce, cet, cette ou ces ?", "ce أم cet أم cette أم ces؟"),
        fill(lid, 3, ex, "Le bon démonstratif", "اسم الإشارة المناسب", "J'écris ce, cet, cette ou ces.", "اكتب ce أو cet أو cette أو ces."),
        rewrite(lid, 4, "Je mets la phrase au singulier.", "حوّل الجملة إلى المفرد.", rw, "Au singulier", "إلى المفرد")])


def possessifs():
    lid = "l4-gr06"
    cards = [("Un possesseur : mon, ma, mes — ton, ta, tes — son, sa, ses.", "مالك واحد: mon, ma, mes / ton, ta, tes / son, sa, ses", "🎒"),
             ("Plusieurs possesseurs : notre, nos — votre, vos — leur, leurs.", "عدة مالكين: notre, nos / votre, vos / leur, leurs", "👨‍👩‍👧"),
             ("Ma, ta, sa deviennent mon, ton, son devant une voyelle ou un h muet : mon amie, ton histoire.", "ma, ta, sa تصبح mon, ton, son قبل حرف علة", "💡"),
             ("Leur + un seul objet commun : leur chef. — Leurs + plusieurs objets : leurs fils.", "leur لشيء واحد مشترك، وleurs لعدة أشياء", "⚖️"),
             ("Déterminants indéfinis : chaque, plusieurs, quelques, certains, aucun, tout, même, autre… — Chaque semaine, il va au marché.", "محدِّدات مبهمة لا تحدد الاسم بدقة", "🌫️")]
    ex = ["Ces pantoufles sont à elle. Ce sont ___ pantoufles. = ses", "C'est l'appartement où j'habite. C'est ___ appartement. = mon",
          "Cette gourde m'appartient. C'est ___ gourde. = ma", "Ce livre est à toi. C'est ___ livre. = ton", "Il m'a parlé des projets qu'il a. Il m'a parlé de ___ projets. = ses",
          "Cette voiture est à toi. C'est ___ voiture. = ta", "Cette amie est la tienne. C'est ___ amie. = ton", "Tu écris bien. J'ai aimé ___ histoire. = ton"]
    lr = [("Ils ont remballé ___ affaires.", ["leur", "leurs"], "leurs"), ("Je leur avais dit d'arriver à l'heure pour ___ examen.", ["leur", "leurs"], "leur"),
          ("___ jours sont comptés.", ["Leur", "Leurs"], "Leurs"), ("Les marmottes préparent ___ terriers pour hiberner.", ["leur", "leurs"], "leurs"),
          ("___ sœur n'est jamais revenue.", ["Leur", "Leurs"], "Leur"), ("Ils ont oublié ___ chat loin derrière eux.", ["leur", "leurs"], "leur"),
          ("Les élèves de grade 4 : ___ classe est la mieux décorée.", ["leur", "leurs"], "leur"), ("Ils soignent bien ___ animaux.", ["leur", "leurs"], "leurs"),
          ("C'est l'ami de Jacques et de Robert. C'est ___ ami.", ["leur", "leurs"], "leur")]
    ind = [("___ éléphants vont à la montagne.", ["Quelques", "Nul", "Tel"], "Quelques"), ("Les élèves de CM1 ont les ___ livres.", ["certains", "tous", "mêmes"], "mêmes"),
           ("___ matin, il prend un chemin différent.", ["Bien des fois", "Chaque", "Tout"], "Chaque"), ("___ mes amis sont venus au dîner.", ["Tel", "Plusieurs", "Tous"], "Tous"),
           ("Je n'ai reçu ___ lettre aujourd'hui.", ["aucune", "aucun", "chaque"], "aucune"), ("Il existe ___ variétés de fraises.", ["différentes", "chaque", "nul"], "différentes")]
    return lesson(lid, "Ch. 2-5", "Les possessifs et les indéfinis", "صفات الملكية والمحدِّدات المبهمة", "🎒", [
        rules(lid, 1, cards), fill(lid, 2, ex, "À qui est-ce ?", "لمن هذا؟", "J'écris le possessif qui convient.", "اكتب صفة الملكية المناسبة."),
        choose(lid, 3, lr, "Leur ou leurs ?", "leur أم leurs؟"), choose(lid, 4, ind, "Le bon déterminant indéfini", "المحدِّد المبهم المناسب")])


def pluriel():
    lid = "l4-gr07"
    cards = [("En général, on ajoute -s : une fleur → des fleurs. Les noms en -s, -x, -z ne changent pas : une souris → des souris, un nez → des nez.", "الجمع عادةً بإضافة s، والأسماء المنتهية بـ s, x, z لا تتغير", "➕"),
             ("-eu, -eau, -au → -x : un château → des châteaux, un feu → des feux. Sauf : bleus, pneus, émeus, landaus, sarraus.", "eu, eau, au تأخذ x (مع استثناءات)", "🏰"),
             ("-al → -aux : un cheval → des chevaux. Sauf : bals, carnavals, chacals, festivals, récitals, régals.", "al تصبح aux (مع استثناءات)", "🐎"),
             ("-ail → -s : des détails. Sauf : baux, coraux, émaux, travaux, vitraux, soupiraux, vantaux.", "ail تأخذ s، إلا سبع كلمات تصبح aux", "🪟"),
             ("-ou → -s : des clous. Sauf 7 : bijoux, cailloux, choux, genoux, hiboux, joujoux, poux.", "ou تأخذ s، إلا سبع كلمات تأخذ x", "🦉")]
    pl = [("un cheval", "aux"), ("un journal", "aux"), ("un travail", "aux"), ("un corail", "aux"), ("un vitrail", "aux"), ("un bijou", "x"), ("un hibou", "x"),
          ("un genou", "x"), ("un château", "x"), ("un jeu", "x"), ("un tuyau", "x"), ("un pneu", "s"), ("un festival", "s"), ("un détail", "s"),
          ("un clou", "s"), ("un kangourou", "s"), ("un chandail", "s"), ("une souris", "="), ("un nez", "="), ("un silex", "=")]
    ex = ["Lors du Tour de France, les (cycliste) ___ passent par notre village. = cyclistes",
          "Les (pêcheur) ___ mettent leurs (poisson) ___ dans des (panier) ___. = pêcheurs | poissons | paniers",
          "À la chorale, les (enfant) ___ ont des (voix) ___ pures. = enfants | voix",
          "Les (oiseau) ___ se posent sur ma fenêtre. = oiseaux", "Les enfants portent des (sarrau) ___ gris. = sarraus",
          "Il faudra renouveler les (bail) ___. = baux", "Les Japonaises manient leurs (éventail) ___. = éventails",
          "L'odeur de la tarte s'échappe des (soupirail) ___. = soupiraux", "Le train roule sur des (rail) ___. = rails",
          "Au supermarché, les (chou) ___ sont rangés. = choux", "Émile et Karim sont les (chouchou) ___ des professeurs. = chouchous"]
    sg = [("Les hôpitaux", ["L'hôpital", "L'hôpitau", "L'hôpitail"], "L'hôpital"), ("Les animaux", ["L'animal", "L'animau", "L'animail"], "L'animal"),
          ("Les travaux", ["Le travail", "Le travau", "Le traval"], "Le travail"), ("Les généraux", ["Le général", "Le générau", "Le généreau"], "Le général"),
          ("Les cals", ["Le cal", "Le cau", "Le cail"], "Le cal"), ("Les végétaux", ["Le végétal", "Le végéteau", "Le végétail"], "Le végétal")]
    quick = [(w, w, {"aux": "-aux", "x": "-x", "s": "-s", "=": "ne change pas"}[b]) for w, b in pl]
    return lesson(lid, "Ch. 3", "Le pluriel des noms", "جمع الأسماء", "👥", [
        rules(lid, 1, cards), sort(lid, 2, [("s", "+ s", "تأخذ s", "➕"), ("x", "+ x", "تأخذ x", "✖️"), ("aux", "→ aux", "تصبح aux", "🔁"), ("=", "=", "لا تتغير", "🟰")], pl,
                                   "Quel pluriel ?", "أي جمع؟"),
        fill(lid, 3, ex, "J'accorde les noms", "أجمع الأسماء", "J'écris le nom au pluriel.", "اكتب الاسم بصيغة الجمع."),
        choose(lid, 4, [(f"{a} → au singulier ?", c, r) for a, c, r in sg], "Retour au singulier", "العودة إلى المفرد"),
        speed(lid, 5, quick, "Défi chrono : le pluriel", "تحدّي السرعة: الجمع", 60, 12, pool=["-s", "-x", "-aux", "ne change pas"], ask="كيف يُجمع؟",
              instr=("Le plus vite possible : comment ce nom fait-il son pluriel ?", "بأسرع ما يمكن: كيف يُجمع هذا الاسم؟"))])


def feminin_noms():
    lid = "l4-gr08"
    cards = [("En général : + e. — un ami → une amie, un Français → une Française", "المؤنث عادةً بإضافة e", "➕"),
             ("-en, -on → -enne, -onne : un lion → une lionne, un comédien → une comédienne", "en, on: نضاعف n ونضيف e", "🦁"),
             ("-an, -in → + e : un lapin → une lapine. Sauf : une paysanne, Jeanne.", "an, in: نضيف e فقط", "🐇"),
             ("-f, -p → -ve ; -x → -se : un loup → une louve, un époux → une épouse. Sauf : vieille, rousse.", "f, p تصبح ve، وx تصبح se", "🐺"),
             ("-e ne change pas : un / une astronaute. Sauf : ânesse, comtesse, hôtesse, maîtresse, poétesse, princesse, tigresse.", "المنتهي بـ e لا يتغير غالباً (مع استثناءات esse)", "👑"),
             ("-er, -ier → -ère, -ière : un boulanger → une boulangère, un pâtissier → une pâtissière", "er, ier تصبح ère, ière", "🥖")]
    ex = ["Leila est une (Égyptien) ___ aux yeux noirs. = Égyptienne", "Ma mère est une (électricien) ___ douée. = électricienne",
          "Cette femme est (champion) ___ du monde d'équitation. = championne", "Cette (sultan) ___ raconte de belles histoires. = sultane",
          "Cécile, ma (voisin) ___, est professeur de français. = voisine", "Cette (jaloux) ___ taquine sa petite sœur. = jalouse",
          "La (sportif) ___ à côté de Jeanne est championne de tennis. = sportive", "Madame Tati est une (ouvrier) ___ qualifiée. = ouvrière",
          "La (berger) ___ se promène avec ses moutons. = bergère", "Cette (infirmier) ___ s'est bien occupée de moi. = infirmière"]
    ch = [("La ___ protège son petit.", ["tigresse", "tigre", "tigrette"], "tigresse"), ("Nous rendons visite à la ___ dans son château.", ["vicomtaine", "vicomtèse", "vicomtesse"], "vicomtesse"),
          ("Une ___ se balade dans la rue. (pauvre)", ["pauvresse", "pauvrelle", "pauvrèse"], "pauvresse"), ("Captif → ?", ["captise", "captive", "captivée"], "captive"),
          ("Vieux → ?", ["vieve", "vieise", "vieille"], "vieille"), ("Un fils → ?", ["une fille", "une filse", "une fise"], "une fille"),
          ("Un héros → ?", ["une héroïne", "une hérosse", "une hérose"], "une héroïne"), ("La (Latin) s'est perdue dans la forêt.", ["Latine", "Latinne", "Lattine"], "Latine")]
    fem = [("un lion", "une lionne"), ("un paysan", "une paysanne"), ("un loup", "une louve"), ("un époux", "une épouse"), ("un prince", "une princesse"),
           ("un marquis", "une marquise"), ("un boulanger", "une boulangère"), ("un héritier", "une héritière")]
    return lesson(lid, "Ch. 4", "Le masculin et le féminin des noms", "تذكير الأسماء وتأنيثها", "👫", [
        rules(lid, 1, cards), match(lid, 2, fem, "Le couple", "الزوج: مذكر ومؤنث"),
        choose(lid, 3, ch, "Le bon féminin", "المؤنث الصحيح"),
        fill(lid, 4, ex, "Au féminin", "إلى المؤنث", "J'écris le nom au féminin.", "اكتب الاسم بصيغة المؤنث.")])


def adj_accord():
    lid = "l4-gr09"
    cards = [("L'adjectif s'accorde en genre et en nombre avec le nom. — une blouse blanche, les petits élèves", "الصفة تتبع الموصوف في الجنس والعدد", "🔗"),
             ("Plusieurs noms : masculin + masculin → masc. plur. ; féminin + féminin → fém. plur. ; un seul masculin suffit → masc. plur.", "صفة لعدة أسماء: يكفي مذكر واحد لتكون مذكراً جمعاً", "👨‍👩‍👧"),
             ("Couleur composée ou tirée d'un fruit, d'une fleur, d'une pierre : invariable. — des ardoises gris bleu, des rideaux orange. Sauf : rose, mauve, pourpre, écarlate, fauve.", "ألوان مركّبة أو مأخوذة من فاكهة أو حجر: لا تتغير", "🎨"),
             ("Adjectif court (gros, grand, bon, petit, joli) : avant le nom. Long, couleur, forme, -ant, nationalité : après. — un inventeur japonais", "الصفة القصيرة قبل الاسم، والطويلة واللون والجنسية بعده", "📏"),
             ("Adjectif avant le nom : des → de. — Il y a de beaux tapis.", "إذا سبقت الصفةُ الاسمَ تصبح des ← de", "🧶")]
    rel = [("Une observation", "précise"), ("Un poids", "lourd"), ("Des rues", "désertes"), ("Un regard", "inquiétant"), ("Une redingote", "verte")]
    ex = ["Une (grand) ___ maison = grande", "Une idée (génial) ___ = géniale", "Des rues (étroit) ___ = étroites", "Une table (bas) ___ = basse",
          "Des pluies (abondant) ___ = abondantes", "Une personne (fatigué) ___ = fatiguée",
          "Tu as un oncle et une tante aussi (gentil) ___. = gentils", "Bien (mûr) ___, la poire et la banane sont (délicieux) ___. = mûres ; mures | délicieuses",
          "La viande et les légumes sont bien (cuit) ___. = cuits", "L'escargot et la grenouille (craintif) ___ restent à l'abri. = craintifs"]
    hu = [("Le passager porte une veste et un gilet *noires*.", "noirs", "مذكر واحد يكفي: noirs"),
          ("La lumière passe sous la porte et la fenêtre *fermée*.", "fermées", "اسمان مؤنثان: fermées"),
          ("Ses gâteaux *préférées* sont au chocolat.", "préférés", "gâteaux مذكر جمع"),
          ("Les rideaux de sa chambre sont *oranges*.", "orange", "لون مأخوذ من فاكهة: لا يتغير"),
          ("Il y a *des* beaux tapis en Belgique.", "de", "الصفة قبل الاسم: de")]
    od = ["Les musiciens mexicains portent de grands chapeaux.", "Aujourd'hui, je me suis réveillée de bonne humeur.",
          "L'inventeur de cette machine électronique est japonais.", "Mon petit frère adore les raisins secs.", "Elle a interviewé une actrice connue."]
    rw = [("Un mur blanc", "Des murs blancs"), ("Un pain chaud", "Des pains chauds"), ("Un grand piano", "De grands pianos"),
          ("Un poisson rouge", "Des poissons rouges"), ("Ce meuble ancien", "Ces meubles anciens")]
    return lesson(lid, "Ch. 5-1", "L'adjectif : accord et place", "الصفة: المطابقة والموقع", "🎨", [
        rules(lid, 1, cards), match(lid, 2, rel, "Chaque nom et son adjectif", "كل اسم وصفته"),
        fill(lid, 3, ex, "J'accorde l'adjectif", "أطابق الصفة", "J'écris l'adjectif bien accordé.", "اكتب الصفة مطابقة للموصوف."),
        hunt(lid, 4, hu, "L'accord qui cloche", "المطابقة الخاطئة", instr="Je trouve l'adjectif mal accordé et je le corrige.", instr_ar="المس الكلمة الخاطئة ثم صحّحها."),
        order(lid, 5, od, "L'adjectif à sa place", "الصفة في مكانها"),
        rewrite(lid, 6, "Je mets l'expression au pluriel.", "حوّل العبارة إلى الجمع.", rw, "Au pluriel", "إلى الجمع")])


def adj_feminin():
    lid = "l4-gr10"
    cards = [("En général : + e. — plein → pleine. Déjà en -e : pas de changement. — clair / claire, limpide / limpide", "المؤنث عادةً بإضافة e، والمنتهي بـ e لا يتغير", "➕"),
             ("-x → -se : heureux → heureuse. Sauf : douce, fausse, rousse, vieille.", "x تصبح se (إلا doux, faux, roux, vieux)", "😊"),
             ("-f → -ve : neuf → neuve, actif → active.", "f تصبح ve", "🆕"),
             ("-c → -che ou -que : blanc → blanche, public → publique, turc → turque. Sauf : grecque, sèche.", "c تصبح che أو que", "🤍"),
             ("-et → -ette (muette) ; -ot, -at → -ote, -ate (idiote). Sauf : complète, discrète, inquiète, secrète, sotte.", "et تصبح ette، وot, at تأخذ e فقط (مع استثناءات)", "🤫"),
             ("-el, -ul, -il → -elle, -ulle, -ille : gentille, nulle, cruelle. -al → -ale : générale.", "el, ul, il: نضاعف اللام", "💛"),
             ("Pluriel : les adjectifs en -s ou -x ne changent pas : un bijou précieux → des bijoux précieux.", "الصفات المنتهية بـ s أو x لا تتغير في الجمع", "💎")]
    pairs = [("heureux", "heureuse"), ("doux", "douce"), ("neuf", "neuve"), ("blanc", "blanche"), ("public", "publique"), ("sec", "sèche"),
             ("muet", "muette"), ("inquiet", "inquiète"), ("gentil", "gentille"), ("frais", "fraîche ; fraiche"), ("vieux", "vieille"), ("épais", "épaisse")]
    ex = [f"{m} → ___ = {f}" for m, f in pairs]
    ch = [("Une attitude (hideux)", ["hideuse", "hideuxe", "hideusse"], "hideuse"), ("Une (faux) réponse", ["fausse", "fauxe", "fause"], "fausse"),
          ("Une centrale (radioactif)", ["radioactive", "radioactifé", "radioactife"], "radioactive"), ("Une statue (grec)", ["grecque", "grèque", "greque"], "grecque"),
          ("Une phrase (complet)", ["complète", "complette", "complete"], "complète"), ("Une voix (fluet)", ["fluette", "fluète", "fluete"], "fluette"),
          ("Une rédaction (nul)", ["nulle", "nule", "nul"], "nulle"), ("Une plante (tropical)", ["tropicale", "tropicalle", "tropicaux"], "tropicale"),
          ("Des salons très (spacieux)", ["spacieux", "spacieuxs", "spacieuse"], "spacieux"), ("Ses cheveux sont (doux)", ["doux", "douxs", "dous"], "doux")]
    sent = ["Les nuages annoncent des pluies (orageux) ___. = orageuses", "Les filles (aventureux) ___ grimpent aux arbres. = aventureuses",
            "Une réunion (constructif) ___ = constructive", "La terre du désert est très (sec) ___. = sèche", "Istanbul est une grande ville (turc) ___. = turque",
            "Lara est une personne (franc) ___. = franche", "Cette affaire doit rester (secret) ___. = secrète", "Cette femme est (cruel) ___. = cruelle",
            "La langue (officiel) ___ de la France est le français. = officielle", "Je n'ai jamais entendu (pareil) ___ sottise. = pareille"]
    return lesson(lid, "Ch. 5-2", "Le féminin et le pluriel des adjectifs", "تأنيث الصفات وجمعها", "💛", [
        rules(lid, 1, cards), fill(lid, 2, ex, "Masculin → féminin", "من المذكر إلى المؤنث", "J'écris l'adjectif au féminin.", "اكتب الصفة بصيغة المؤنث."),
        choose(lid, 3, ch, "La bonne orthographe", "الإملاء الصحيح"),
        fill(lid, 4, sent, "J'accorde dans la phrase", "أطابق في الجملة", "J'accorde l'adjectif entre parenthèses.", "طابق الصفة بين القوسين.")])


def sujet_verbe():
    lid = "l4-gr11"
    cards = [("Le sujet fait l'action du verbe. On le trouve avec « Qui est-ce qui ? » ou « Qu'est-ce qui ? ». — L'abeille produit du miel.", "الفاعل يقوم بالفعل، ونجده بالسؤال Qui ? / Qu'est-ce qui ?", "🐝"),
             ("Le sujet se place souvent avant le verbe. — Le dromadaire vit dans le désert.", "يأتي الفاعل غالباً قبل الفعل", "🐪"),
             ("Le verbe dit ce que fait le sujet (action) ou comment il est (état). — Le koala dort. Le koala a un pelage gris.", "الفعل يعبّر عن حدث أو حالة", "🐨"),
             ("Une phrase sans verbe conjugué n'a pas de sujet : « Une belle histoire », « Quelle attitude exemplaire ! »", "العبارة بلا فعل مصرَّف ليس فيها فاعل", "🚫")]
    ch = [("___ casse ses lunettes.", ["Marie", "L'écureuil", "Le ciel"], "Marie"), ("La ___ tourne autour du Soleil.", ["Terre", "marmite", "phrase"], "Terre"),
          ("Le grand ___ contient des tomates.", ["sac", "rue", "garçon"], "sac"), ("Les ___ partent à la mer.", ["vacanciers", "écolier", "crayons"], "vacanciers"),
          ("Des ___ tirent le carrosse.", ["chevaux", "cheveux", "châles"], "chevaux")]
    sv = [("Le chat miaule.", True, "فيها فعل miaule وفاعل le chat"), ("Une belle histoire", False, "لا فعل فيها"), ("Le tonnerre gronde.", True, "الفاعل le tonnerre"),
          ("L'incendie de la forêt", False, "لا فعل فيها"), ("Observe et réfléchis.", False, "فعل أمر بلا فاعل ظاهر"), ("Ma fille est tombée.", True, "الفاعل ma fille"),
          ("Le tableau coûteux", False, "لا فعل فيها"), ("Ce crayon m'appartient.", True, "الفاعل ce crayon")]
    od = ["Sami entre dans la chambre de ses parents.", "Les morceaux de pain tombent par terre.", "À l'aéroport, les voyageurs attendent le départ.",
          "Au cirque, les éléphants marchent au rythme des tambours.", "Une pluie torrentielle tombe sur la montagne."]
    vb = [("Les chevaux galopent dans la prairie. → le verbe ?", ["galopent", "chevaux", "prairie"], "galopent"),
          ("Le chat ronronne sur son coussin. → le verbe ?", ["ronronne", "chat", "coussin"], "ronronne"),
          ("Mon frère court très vite. → le verbe ?", ["court", "frère", "vite"], "court"),
          ("Maman a préparé un bon chocolat chaud. → le verbe ?", ["a préparé", "chocolat", "chaud"], "a préparé"),
          ("Les spéléologues explorent les grottes. → le sujet ?", ["Les spéléologues", "explorent", "les grottes"], "Les spéléologues"),
          ("Le loup suit la chèvre jusqu'à l'étable. → le sujet ?", ["Le loup", "la chèvre", "l'étable"], "Le loup")]
    return lesson(lid, "Ch. 6-7", "Le sujet et le verbe", "الفاعل والفعل", "🎯", [
        rules(lid, 1, cards), choose(lid, 2, ch, "Quel sujet ?", "أي فاعل؟"), vf(lid, 3, sv, "Y a-t-il un sujet ?", "هل في الجملة فاعل؟"),
        order(lid, 4, od, "Le sujet à sa place", "الفاعل في مكانه"), choose(lid, 5, vb, "Je repère le verbe et le sujet", "أحدّد الفعل والفاعل")])


def accord_verbe():
    lid = "l4-gr12"
    cards = [("Le verbe s'accorde avec son sujet. Plusieurs sujets → pluriel. — Le chat, le lion et le tigre possèdent des griffes.", "الفعل يطابق فاعله، وعدة فاعلين ← جمع", "🐯"),
             ("Toi et moi = nous ; lui et moi = nous ; lui et toi = vous. — Lui et toi êtes frères.", "toi et moi = nous، lui et toi = vous", "🤝"),
             ("Qui remplace le nom placé avant lui (l'antécédent) : le verbe s'accorde avec ce nom. — Les coquillages qui se trouvent…", "qui يأخذ عدد الاسم الذي قبله", "🐚"),
             ("Avec être, le participe s'accorde avec le sujet. Avec avoir, il ne s'accorde pas. — Les feuilles sont tombées. Les frères Grimm ont écrit des contes.", "مع être يتطابق اسم المفعول، ومع avoir لا يتطابق", "🍂"),
             ("Avoir = posséder ou ressentir (avoir faim, peur, froid, 15 ans). Être = décrire. — Je suis fort en maths.", "avoir للملك والإحساس، وêtre للوصف", "💭")]
    rel = [("L'enfant et sa mère", "font une promenade."), ("Le directeur et moi", "applaudissons les meilleurs."),
           ("Les employés et toi", "fournissez un bon travail."), ("Ton frère et toi", "passez votre temps à jouer.")]
    ch = [("Mes parents et moi ___ nos achats.", ["fait", "faisons", "faites"], "faisons"), ("Ses frères et lui ___ leurs habits.", ["choisisse", "choisis", "choisissent"], "choisissent"),
          ("Ta sœur et toi ___ des châteaux de sable.", ["bâtit", "bâtissez", "bâtissons"], "bâtissez"), ("Le chasseur et moi ___ les fossés.", ["franchissons", "franchissez", "franchit"], "franchissons"),
          ("Les médecins et lui ___ les malades.", ["guéris", "guérissions", "guérissent"], "guérissent"), ("Sa cousine et elle ___ leurs amies.", ["invitons", "invitent", "invitez"], "invitent"),
          ("Les coquillages qui ___ sur le sable sont vides.", ["se trouvent", "se trouve", "nous trouvons"], "se trouvent")]
    ex = ["Céline et sa copine sont rentr___ à la maison. = ées", "Les poussins sont sort___ de l'œuf. = is", "Mon père est reven___ de voyage. = u",
          "Ma cousine est tomb___ du lit. = ée", "Mon frère et moi sommes rentr___ tard hier soir. = és", "Hoda a aid___ sa mère à la cuisine. = é",
          "Les élèves ont décor___ leur classe. = é"]
    rw = [("Les élèves visitent une grande société informatique.", "L'élève visite une grande société informatique."),
          ("Les oiseaux volent librement dans le ciel.", "L'oiseau vole librement dans le ciel."), ("Ils finissent leur travail à temps.", "Il finit son travail à temps."),
          ("Mes amis jouent au football chaque samedi.", "Mon ami joue au football chaque samedi.")]
    av = [("Flora ___ deux sœurs.", ["a", "est"], "a"), ("Flora ___ faim.", ["a", "est"], "a"), ("Flora ___ intelligente.", ["est", "a"], "est"),
          ("Le chat miaule quand il ___ faim.", ["a", "est"], "a"), ("Je ___ indien et je ___ fort en maths.", ["suis … suis", "ai … ai", "suis … ai"], "suis … suis")]
    return lesson(lid, "Ch. 7-1", "L'accord du verbe", "مطابقة الفعل", "🤝", [
        rules(lid, 1, cards), match(lid, 2, rel, "Qui fait quoi ?", "من يفعل ماذا؟"), choose(lid, 3, ch, "Le verbe bien accordé", "الفعل المطابق"),
        fill(lid, 4, ex, "Être ou avoir : j'accorde", "مع être أو avoir: أطابق", "J'écris la fin du participe passé.", "اكتب نهاية اسم المفعول."),
        rewrite(lid, 5, "Je mets la phrase au singulier.", "حوّل الجملة إلى المفرد.", rw, "Au singulier", "إلى المفرد"),
        choose(lid, 6, av, "Avoir ou être ?", "avoir أم être؟")])


def auxiliaires():
    lid = "l4-gr13"
    cards = [("Avoir et être servent aussi à former les temps composés : ce sont des auxiliaires. — L'actrice a enfilé son costume. L'actrice est entrée sur scène.", "avoir وêtre فعلان مساعدان في الأزمنة المركّبة", "🧰"),
             ("Avoir : la plupart des verbes, les verbes impersonnels (il a plu, il a neigé, il a fallu).", "avoir مع أغلب الأفعال والأفعال اللاشخصية", "🌧️"),
             ("Être : les pronominaux (je me suis promené), la voix passive, et les verbes de mouvement ou de changement d'état : aller, venir, partir, arriver, entrer, sortir, naître, mourir, devenir, rester, tomber…", "être مع الانعكاسية والمبني للمجهول وأفعال الحركة وتغيّر الحال", "🚪"),
             ("Monter, descendre, sortir, passer : avoir s'il y a un COD, être sinon. — J'ai sorti les poubelles. / Je suis sortie de ma chambre.", "بعض الأفعال تأخذ avoir مع مفعول به وêtre بدونه", "🗑️"),
             ("Infinitif : après une préposition (pour, de, à), après un autre verbe, ou comme sujet. — Il ne faut pas jouer en classe. Nager est agréable.", "المصدر بعد حرف جر أو بعد فعل آخر أو فاعلاً", "🏊"),
             ("Verbe pronominal : me, te, se, nous, vous, se + verbe. — Je me couche, ils se couchent.", "الفعل الانعكاسي يسبقه ضمير me, te, se…", "🛏️")]
    ex = ["Il ___ neigé tout l'après-midi. = a", "Mon amie ___ fini son travail. = a", "Mes grands-parents ___ venus à la maison. = sont",
          "Elle ___ sortie au jardin. = est", "L'enfant ___ caché sa peluche sous son oreiller. = a", "Catherine ___ venue me rendre visite. = est",
          "Maman s'___ assise sur le banc. = est", "Les bateaux ___ échoué sur le rivage. = ont", "Keith ___ allé voir la comédie musicale. = est",
          "Mon frère et moi ___ prêté nos bandes dessinées. = avons"]
    ch = [("Mon père ___ sorti les poubelles.", ["a", "est"], "a", None, "مع مفعول به (les poubelles): avoir"),
          ("Je ___ sortie de ma chambre.", ["suis", "ai"], "suis", None, "بلا مفعول به: être"),
          ("J'___ descendu l'escalier.", ["ai", "suis"], "ai", None, "مع مفعول به (l'escalier): avoir"),
          ("Je ___ passé te voir.", ["suis", "ai"], "suis", None, "حركة بلا مفعول به: être"),
          ("Les petites filles ___ monté une maison de bois.", ["ont", "sont"], "ont", None, "مع مفعول به (une maison): avoir")]
    rw = [("Ils repoussent leurs amis.", "Ils ont repoussé leurs amis."), ("Elles ne se préparent pas pour le marathon.", "Elles ne se sont pas préparées pour le marathon."),
          ("Nous nous rendons compte de la gravité des événements.", "Nous nous sommes rendu compte de la gravité des événements."),
          ("Les enfants découpent des papiers.", "Les enfants ont découpé des papiers.")]
    inf = [("Il préfère la lecture avant de dormir.", "Il préfère lire avant de dormir."), ("Il aime le chant.", "Il aime chanter."),
           ("Il apprend la peinture.", "Il apprend à peindre."), ("Elle aime la promenade.", "Elle aime se promener."),
           ("Elle aime la natation.", "Elle aime nager."), ("Nous préférons la marche.", "Nous préférons marcher.")]
    pr = ["Je ___ cache dans un coin et j'observe. = me", "Elles ___ précipitent pour voir passer le convoi. = se", "Tu ___ laves les mains avant de manger. = te",
          "Ils ___ disputent au jeu de billes. = se", "Nous ___ promenons ensemble dans les bois. = nous", "Vous ___ baignez le soir. = vous"]
    return lesson(lid, "Ch. 7-2", "Auxiliaires, infinitif et verbes pronominaux", "الأفعال المساعدة والمصدر والأفعال الانعكاسية", "🧰", [
        rules(lid, 1, cards), fill(lid, 2, ex, "Avoir ou être ?", "avoir أم être؟", "J'écris l'auxiliaire au présent.", "اكتب الفعل المساعد في المضارع."),
        choose(lid, 3, ch, "Avec ou sans COD ?", "مع مفعول به أم بدونه؟"),
        rewrite(lid, 4, "Je mets la phrase au passé composé.", "حوّل الجملة إلى الماضي المركّب.", rw),
        rewrite(lid, 5, "Je remplace le nom par un verbe à l'infinitif.", "استبدل الاسم بفعل في المصدر.", inf, "Le verbe à l'infinitif", "الفعل في المصدر"),
        fill(lid, 6, pr, "Me, te, se, nous, vous", "me, te, se, nous, vous", "J'écris le pronom qui convient.", "اكتب الضمير المناسب.")])


def complements():
    lid = "l4-gr14"
    cards = [("Le COD complète le verbe sans préposition. Question : verbe + qui ? / quoi ? — Émilie cueille des pâquerettes. (cueille quoi ?)", "المفعول به المباشر: بلا حرف جر، نسأل qui ? / quoi ?", "🌼"),
             ("Le COD peut être un nom, un nom propre, un infinitif, un pronom (le, la, l', les) ou une proposition. — Il adore nager. Il l'adore.", "قد يكون اسماً أو مصدراً أو ضميراً أو جملة", "🧩"),
             ("Le COI est relié au verbe par à, au, de… Question : à qui ? à quoi ? de qui ? de quoi ? — Marcelle parle à sa cousine.", "المفعول به غير المباشر: بحرف جر à / de", "🗣️"),
             ("Les compléments circonstanciels disent où, quand, comment, pourquoi, dans quel but, avec qui. On peut souvent les déplacer.", "الظروف: المكان والزمان والكيفية والسبب والغاية والمصاحبة", "🧭"),
             ("Après être, le mot n'est pas un COD : c'est un attribut du sujet. — Il est ingénieur.", "بعد être لا يوجد مفعول به بل خبر (صفة للفاعل)", "👷")]
    tri = [("Émilie cueille des pâquerettes.", "des pâquerettes", "COD"), ("Le chat mange ses croquettes.", "ses croquettes", "COD"),
           ("Marcelle parle à sa cousine.", "à sa cousine", "COI"), ("Robinson échappe à la noyade.", "à la noyade", "COI"),
           ("Il participe à une compétition.", "à une compétition", "COI"), ("Colette a perdu son sac au marché.", "son sac", "COD"),
           ("Tu quitteras la maison à 8 heures.", "à 8 heures", "CC de temps"), ("Tu déjeunes à la cantine.", "à la cantine", "CC de lieu"),
           ("Tu écriras ton devoir proprement.", "proprement", "CC de manière"), ("Je mets un manteau à cause du froid.", "à cause du froid", "CC de cause"),
           ("Tu appelles Sophie pour l'inviter à dîner.", "pour l'inviter à dîner", "CC de but"), ("Il sort avec ses amis.", "avec ses amis", "CC d'accompagnement"),
           ("Les oiseaux se posent sur les branches.", "sur les branches", "CC de lieu"), ("Il est parti en courant.", "en courant", "CC de manière")]
    pool = ["COD", "COI", "CC de temps", "CC de lieu", "CC de manière", "CC de cause", "CC de but", "CC d'accompagnement"]
    qs = [(f"{s} → « {g} » ?", _pick(lid, a, pool), a) for s, g, a in tri]
    rw = [("La bergère conduit les moutons au pré.", "La bergère les conduit au pré."), ("L'épicière reçoit la cliente.", "L'épicière la reçoit."),
          ("Le vendeur souhaite vendre l'appareil.", "Le vendeur souhaite le vendre. ; Le vendeur le souhaite."), ("Un joueur lance le ballon à Paul.", "Un joueur le lance à Paul."),
          ("Le peintre offre le tableau à sa fille. (pronom COD)", "Le peintre l'offre à sa fille.")]
    cc = ["Pauline court ___ malgré le froid. = dans la neige", "Les poissons nagent ___. = dans des eaux peu profondes",
          "Nous rendons nos livres ___. = à la bibliothèque", "En septembre, les parents inscrivent leurs enfants ___. = à l'école",
          "Gisèle cueille des champignons ___ voisine. = dans la forêt"]
    rel = [("Ce soir, nous sortons", "au café avec des amis."), ("Mes grands-parents vivent", "en Afrique."), ("Le loyer coûte", "cher dans la région parisienne."),
           ("Je bois", "de l'eau."), ("Céline prépare", "un gâteau à la cannelle.")]
    return lesson(lid, "Ch. 8", "Les compléments : COD, COI et CC", "المفعولات والظروف: COD وCOI وCC", "🧭", [
        rules(lid, 1, cards), match(lid, 2, rel, "Le verbe et son complément", "الفعل ومكمّله"), choose(lid, 3, qs, "Quelle fonction ?", "ما الوظيفة؟"),
        rewrite(lid, 4, "Je remplace le COD par le, la, l' ou les.", "استبدل المفعول به المباشر بـ le أو la أو l' أو les.", rw, "Le COD devient pronom", "المفعول به يصبح ضميراً"),
        fill(lid, 5, cc, "J'enrichis la phrase", "أُغني الجملة", "J'ajoute : dans la forêt, dans la neige, à l'école, dans des eaux peu profondes, à la bibliothèque.",
             "أضف الظرف المناسب من القائمة."),
        speed(lid, 6, [("cueille « des pâquerettes »", "", "COD"), ("mange « ses croquettes »", "", "COD"), ("parle « à sa cousine »", "", "COI"),
                       ("échappe « à la noyade »", "", "COI"), ("a perdu « son sac »", "", "COD"), ("obéit « à ses parents »", "", "COI"),
                       ("dort « dans le jardin »", "", "CC"), ("arrive « hier soir »", "", "CC"), ("marche « lentement »", "", "CC"), ("rêve « de vacances »", "", "COI")],
              "Défi chrono : COD, COI ou CC ?", "تحدّي السرعة: COD أم COI أم CC؟", 60, 8, pool=["COD", "COI", "CC", "sujet"], ask="ما الوظيفة؟",
              instr=("Le plus vite possible : COD, COI ou complément circonstanciel ?", "بأسرع ما يمكن: مفعول مباشر أم غير مباشر أم ظرف؟"))])


def _pick(lid, ans, pool, k=3):
    import random
    rng = random.Random(f"{lid}-{ans}")
    ch = [ans] + rng.sample([p for p in pool if p != ans], k - 1)
    rng.shuffle(ch)
    return ch


def pronoms():
    lid = "l4-gr15"
    cards = [("Il, elle, ils, elles remplacent un nom pour éviter la répétition. Masculin + féminin → ils. — Le coq et la poule… → Ils sont au poulailler.", "الضمائر تحل محل الاسم، ومذكر + مؤنث ← ils", "🐓"),
             ("C'est / ce sont : présenter. Il est / elle est : décrire. — C'est un architecte. Il est très compétent.", "c'est للتقديم، وil est للوصف", "🧑‍🏫"),
             ("Ceci annonce une idée nouvelle ou un objet devant soi ; cela rappelle une idée passée ; ça = cela (familier).", "ceci لما سيأتي، cela لما مضى، ça في الكلام اليومي", "👆"),
             ("Pronoms possessifs : le mien, la tienne, les siens, le nôtre, la vôtre, les leurs. — Je te passe mon adresse et tu me passeras la tienne.", "ضمائر الملكية تحل محل الاسم مع صفة الملكية", "🎒"),
             ("Pronoms indéfinis : on, tout, quelqu'un, quelque chose, personne, rien, chacun, certains, aucun. — Personne n'est arrivé.", "ضمائر مبهمة لما ليس محدداً", "❔")]
    sub = [("L'avion décolle à 16 heures.", "Il"), ("Le fermier ramasse des champignons.", "Il"), ("Les garçons étudient.", "Ils"),
           ("Mes sœurs viendront chez toi.", "Elles"), ("Pierre et Sélim jouent ensemble.", "Ils"), ("Le coq et la poule sont dans le poulailler.", "Ils"),
           ("La pâtissière prépare un gâteau.", "Elle")]
    rel = [("La leur", "Les leurs"), ("La mienne", "Les miennes"), ("La tienne", "Les tiennes"), ("La vôtre", "Les vôtres")]
    pos = ["Je lui ai prêté mon livre parce qu'il a oublié ___ (à lui) à la maison. = le sien", "Il leur a donné de nouvelles chemises parce que ___ (à eux) étaient déchirées. = les leurs",
           "J'ai pris ses mains dans ___ (à moi). = les miennes", "Je prends mes vacances en août, quand prenez-vous ___ (à vous) ? = les vôtres",
           "Mes voisines ont une belle voiture. J'ai acheté la même que ___ (à elles). = la leur", "Ce n'est pas mon tableau. C'est ___ (à lui). = le sien"]
    ch = [("___ est mon bureau.", ["Ceci", "Ça", "Il"], "Ceci"), ("Elle m'a fait remarquer ___ hier.", ["cela", "ceci", "ce"], "cela"),
          ("C'est une fille. ___ est adorable.", ["Elle", "C'", "Ce"], "Elle"), ("Qui apportera le dessert ? ___ Fabien.", ["C'est", "Il est", "Ce sont"], "C'est"),
          ("Qui sont ces personnes ? ___ ses frères.", ["Ce sont", "C'est", "Ils sont"], "Ce sont"), ("___ révèle son secret.", ["Quelqu'un", "Quelque chose", "Les uns"], "Quelqu'un"),
          ("Donne du travail à ___ d'eux.", ["chacun", "rien", "tout"], "chacun"), ("J'ai mal. J'ai besoin de ___ pour me soulager.", ["quelque chose", "rien", "tout"], "quelque chose"),
          ("Il resta là sans ___ dire.", ["rien", "personne", "chacun"], "rien"), ("___ récolte ce que l'on a semé.", ["On", "Tout", "Personne"], "On")]
    return lesson(lid, "Ch. 9", "Les pronoms", "الضمائر", "🔁", [
        rules(lid, 1, cards), choose(lid, 2, [(f"{s} → ?", ["Il", "Elle", "Ils", "Elles"], a) for s, a in sub], "Quel pronom sujet ?", "أي ضمير فاعل؟"),
        match(lid, 3, rel, "Singulier et pluriel", "المفرد والجمع"), fill(lid, 4, pos, "Le pronom possessif", "ضمير الملكية", "J'écris le pronom possessif qui convient.", "اكتب ضمير الملكية المناسب."),
        choose(lid, 5, ch, "Ceci, c'est, on, personne…", "ceci وc'est وon وpersonne…")])


def interrogative():
    lid = "l4-gr16"
    cards = [("Phrase déclarative : donne une information, se termine par un point, sujet avant le verbe. — Sans eau, les plantes se fanent.", "الجملة الخبرية: تعطي معلومة وتنتهي بنقطة", "📢"),
             ("Phrase interrogative : pose une question, se termine par ?, sujet après le verbe avec un trait d'union. — Veux-tu jouer ? Habite-t-elle à Monaco ?", "الاستفهام بقلب الفاعل والفعل مع شَرطة، وt بين حرفي علة", "❓"),
             ("Qui (sujet), quand (temps), où (lieu), comment (manière), pourquoi (cause), combien (nombre).", "أدوات الاستفهام: qui, quand, où, comment, pourquoi, combien", "🔎"),
             ("Sujet nom → on le redouble : Les dauphins ont-ils des oreilles ? — Est-ce que garde l'ordre : Est-ce que le ciel est bleu ?", "الاسم الفاعل يُكرَّر بضمير، وest-ce que تحفظ الترتيب", "🐬"),
             ("Interro-négative : Ne poussent-elles pas ? → on répond « Si » pour dire oui.", "الاستفهام المنفي يُجاب بـ si للإثبات", "🙃"),
             ("Temps composé : le pronom entre l'auxiliaire et le participe. — As-tu fini ? — Quel s'accorde : quel pays, quelle rue, quels livres, quelles tartes.", "في الأزمنة المركّبة: الضمير بين المساعد واسم المفعول، وquel يتطابق", "🌍")]
    good = [("Laquelle est correcte ?", ["Déjeunes-tu avec moi ?", "Déjeunes avec moi tu ?", "Avec tu déjeunes-moi ?"], "Déjeunes-tu avec moi ?"),
            ("Laquelle est correcte ?", ["Laisse-t-il des traces de pas ?", "Laisse des traces de pas il ?", "Il laisse de pas des traces ?"], "Laisse-t-il des traces de pas ?"),
            ("Laquelle est correcte ?", ["Puis-je dormir ?", "Dormir je peux ?", "Peux-je dormir ?"], "Puis-je dormir ?"),
            ("Laquelle est correcte ?", ["Monte-t-elle sur les chaises ?", "Monte-elle sur les chaises ?", "Sur les chaises elle monte ?"], "Monte-t-elle sur les chaises ?")]
    qw = ["Maman demande : « ___ a sali le tapis du salon ? » = Qui", "___ as-tu caché mon livre ? = Où ; Pourquoi ; Quand", "Le boucher demande : « ___ de kilos de viande veux-tu ? » = Combien",
          "___ les bébés pleurent-ils toujours ? = Pourquoi", "___ pleuvra-t-il ? = Quand ; Où", "___ habite Karina ? = Où", "___ vaut cette robe rouge ? = Combien",
          "___ préparations fera le professeur ? = Quelles", "De ___ tradition parlez-vous ? = quelle", "___ livre les élèves utilisent-ils ? = Quel",
          "___ est votre adresse ? = Quelle", "___ sont vos projets ? = Quels"]
    rw = [("Tu aimes les couleurs frappantes.", "Aimes-tu les couleurs frappantes ?"), ("Il fait très mauvais.", "Fait-il très mauvais ?"),
          ("Il plante des fleurs au printemps.", "Plante-t-il des fleurs au printemps ?"), ("Elle a les cheveux roux.", "A-t-elle les cheveux roux ?"),
          ("On a marché sur la Lune.", "A-t-on marché sur la Lune ?"), ("Il a réussi à nous rejoindre à temps.", "A-t-il réussi à nous rejoindre à temps ?")]
    ek = [("Prends-tu une salade ? (est-ce que)", "Est-ce que tu prends une salade ?"), ("Veux-tu sortir avec nous ce soir ? (est-ce que)", "Est-ce que tu veux sortir avec nous ce soir ?"),
          ("Les ours aiment-ils le miel ? (est-ce que)", "Est-ce que les ours aiment le miel ?"), ("Fait-il chaud ? (est-ce que)", "Est-ce qu'il fait chaud ?"),
          ("Les élèves sont-ils prêts ? (interro-négative)", "Les élèves ne sont-ils pas prêts ?"), ("Aimes-tu les pâtes dans la salade ? (interro-négative)", "N'aimes-tu pas les pâtes dans la salade ?")]
    od = ["Le ciel est-il bleu ce matin ?", "Joëlle mange-t-elle des pommes ?", "Où as-tu rangé tes sacs ?", "Quand les employés quittent-ils l'entreprise ?"]
    return lesson(lid, "Ch. 10-1", "La phrase déclarative et interrogative", "الجملة الخبرية والاستفهامية", "❓", [
        rules(lid, 1, cards), choose(lid, 2, good, "La question bien construite", "السؤال الصحيح"),
        fill(lid, 3, qw, "Le bon mot interrogatif", "أداة الاستفهام المناسبة", "J'écris qui, quand, où, comment, pourquoi, combien ou quel.", "اكتب أداة الاستفهام المناسبة."),
        rewrite(lid, 4, "Je transforme la phrase en question (inversion du sujet).", "حوّل الجملة إلى سؤال بقلب الفاعل.", rw, "Je pose la question", "أطرح السؤال"),
        rewrite(lid, 5, "Je transforme la question comme demandé (est-ce que / interro-négative).", "حوّل السؤال: بـ est-ce que أو إلى استفهام منفي.", ek, "Autres questions", "أسئلة أخرى"),
        order(lid, 6, od, "Je remets la question en ordre", "أرتّب السؤال")])


def negative():
    lid = "l4-gr17"
    cards = [("Phrase exclamative : une émotion forte, avec un point d'exclamation. — Quel beau paysage ! Qu'il fait beau !", "التعجب: انفعال قوي ينتهي بعلامة تعجب", "😮"),
             ("Interjections et onomatopées : Ah ! Oh ! Chut ! Ouf ! Aïe ! Youpi ! Miam ! Vlan ! Toc toc !", "كلمات التعجب وأصوات المحاكاة", "💥"),
             ("Négation : ne… pas, ne… plus, ne… jamais, ne… rien, ne… personne, ne… guère, ne… pas encore. — Je ne vois personne.", "النفي: ne قبل الفعل والكلمة الثانية بعده", "🚫"),
             ("Temps composé : ne + auxiliaire + pas + participe. — Je n'ai pas arrosé les plantes. Je ne les ai pas vus.", "في الأزمنة المركّبة: ne + المساعد + pas + اسم المفعول", "🌱"),
             ("Ne… ni… ni : Le jardinier n'arrose ni les plantes ni les fleurs. Elle ne porte ni bonnet ni gants.", "ne… ni… ni لنفي أمرين معاً", "🧤"),
             ("Phrase impérative : sans sujet, pour un ordre ou un conseil. Le pronom COD après le verbe : Prends-les ! Mais : Ne le loue pas.", "الأمر بلا فاعل، والضمير بعد الفعل مع شَرطة إلا في النفي", "📣")]
    ono = [("Youpi", "j'ai réussi mon examen !"), ("Euh…", "je n'ai pas compris !"), ("Ouille", "le café est brûlant !"), ("Ouf", "je l'ai échappé belle !"),
           ("Miam miam", "j'adore ton gâteau !"), ("Oh", "que c'est beau !")]
    ch = [("Il existe toujours des dinosaures. → ?", ["Il n'existe plus de dinosaures.", "Il ne plus existe de dinosaures.", "Il n'existe personne de dinosaures."], "Il n'existe plus de dinosaures."),
          ("J'ai déjà regardé la télévision. → ?", ["Je n'ai pas encore regardé la télévision.", "Je n'ai guère regardé la télévision.", "Je n'ai personne regardé la télévision."], "Je n'ai pas encore regardé la télévision."),
          ("Le cuisinier met peu de sel. → ?", ["Le cuisinier ne met guère de sel.", "Le cuisinier ne met plus de sel.", "Le cuisinier ne met pas de sel."], "Le cuisinier ne met guère de sel."),
          ("Elle s'énerve contre quelqu'un. → ?", ["Elle ne s'énerve contre personne.", "Elle ne s'énerve contre eux.", "Elle ne s'énerve contre guère."], "Elle ne s'énerve contre personne."),
          ("Il ___ à l'heure.", ["n'est pas rentré", "rentre pas", "ne pas rentré"], "n'est pas rentré"),
          ("Les ouvriers ___ les façades.", ["n'ont jamais nettoyé", "ne jamais ont nettoyé", "ont ne jamais nettoyé"], "n'ont jamais nettoyé"),
          ("Je n'ai reçu ___ courrier depuis mardi.", ["aucun", "personne", "nulle"], "aucun"), ("Elle n'a téléphoné à ___.", ["personne", "aucun", "nul"], "personne"),
          ("Les soldats n'ont ___ laissé derrière eux.", ["rien", "nul", "aucun"], "rien"), ("___ n'a pris sa place.", ["Personne", "Quelqu'un", "Tout"], "Personne")]
    rw = [("Il répond aux journalistes et aux chanteurs. (ne… ni… ni)", "Il ne répond ni aux journalistes ni aux chanteurs."),
          ("Les oiseaux se nourrissent de graines et d'insectes. (ne… ni… ni)", "Les oiseaux ne se nourrissent ni de graines ni d'insectes."),
          ("Les parents vont au cinéma et au restaurant. (ne… ni… ni)", "Les parents ne vont ni au cinéma ni au restaurant."),
          ("As-tu écouté cette musique ? (jamais)", "Non, je n'ai jamais écouté cette musique. ; Je n'ai jamais écouté cette musique."),
          ("Tu invites tes amis à dîner ce soir. (impératif)", "Invite tes amis à dîner ce soir."), ("Vous écrivez une lettre à vos parents. (impératif)", "Écrivez une lettre à vos parents."),
          ("Défends les ouvriers contre l'oppression. (pronom COD)", "Défends-les contre l'oppression."), ("Fermez la porte à clé avant de sortir. (pronom COD)", "Fermez-la à clé avant de sortir.")]
    od = ["Elle n'entend rien au salon.", "Les clients n'ont pas profité des soldes.", "Il ne jette plus de pierres.", "Je n'aime ni l'équitation ni la natation."]
    return lesson(lid, "Ch. 10-2", "Exclamation, négation et impératif", "التعجب والنفي والأمر", "🚫", [
        rules(lid, 1, cards), match(lid, 2, ono, "Les onomatopées", "أصوات المحاكاة"), choose(lid, 3, ch, "La bonne négation", "النفي الصحيح"),
        rewrite(lid, 4, "Je transforme la phrase comme demandé.", "حوّل الجملة كما هو مطلوب.", rw, "Je transforme", "أحوّل"),
        order(lid, 5, od, "La phrase négative en ordre", "أرتّب الجملة المنفية")])


def prep_adverbes():
    lid = "l4-gr18"
    cards = [("Prépositions (à, de, en, avec, par, dans, sur, chez, vers, pour…) : elles marquent le lieu, le temps, le moyen, l'accompagnement, le but. — Il travaille à Djeddah, en Arabie saoudite.", "حروف الجر تدل على المكان والزمان والوسيلة والمصاحبة والغاية", "📍"),
             ("L'adverbe est invariable ; il précise le sens. Lieu : ici, là-bas, dehors. Temps : souvent, bientôt, autrefois. Manière : vite, lentement.", "الظرف لا يتغير، ويدل على المكان والزمان والكيفية", "⏱️"),
             ("Adverbe en -ment : féminin de l'adjectif + ment. — lent → lente → lentement. Sauf : gentiment, bien, mal, mieux.", "الظرف بـ ment: مؤنث الصفة + ment", "🐢"),
             ("Adjectif en é, i, u : masculin + ment. — vrai → vraiment, poli → poliment, absolu → absolument.", "الصفات المنتهية بـ é, i, u: المذكر + ment", "🙂"),
             ("Certains font -ément : énormément, profondément, précisément, intensément, aveuglément, conformément.", "بعضها ينتهي بـ ément", "🌊")]
    ex = ["Nous nous réveillerons ___ 8 h pour faire les courses. = à", "Carlos se réveille tôt pour aller ___ l'école. = à",
          "Je vais ___ mon frère ___ cirque. = avec | au", "Cécile et Viviane vont chaque jour ___ club ___ pied. = au | à", "Bertrand est français. Il est ___ Paris. = de"]
    adv = [("lent", "lentement"), ("doux", "doucement"), ("vif", "vivement"), ("gentil", "gentiment"), ("bon", "bien"), ("mauvais", "mal"),
           ("vrai", "vraiment"), ("poli", "poliment"), ("absolu", "absolument"), ("assidu", "assidûment ; assidument"), ("énorme", "énormément"),
           ("précis", "précisément"), ("profond", "profondément"), ("hardi", "hardiment")]
    ch = [("Effronté → ?", ["Effrontément", "Effrontement", "Effrontementment"], "Effrontément"), ("Aisé → ?", ["Aisément", "Aisement", "Aiséement"], "Aisément"),
          ("Les élèves sont ___ dans la cour. (temps)", ["toujours", "dedans", "vite"], "toujours"), ("Ma mère va ___ pour prendre l'air. (lieu)", ["dehors", "bientôt", "lentement"], "dehors"),
          ("___, les brouettes étaient en bois.", ["Autrefois", "Bientôt", "Ailleurs"], "Autrefois"), ("Ma sœur dort ___ dans son lit douillet.", ["profondément", "obstinément", "sincèrement"], "profondément"),
          ("Les poussins suivent ___ leur mère.", ["aveuglément", "énormément", "sincèrement"], "aveuglément")]
    rel = [("Il choisit", "soigneusement ses habits."), ("Le cuisinier coupe", "minutieusement le persil."), ("Elle parle", "longuement au téléphone."),
           ("Il le rencontre", "secrètement dans la cour."), ("Elle s'habille", "lentement pour le dîner.")]
    return lesson(lid, "Ch. 11-12", "Les prépositions et les adverbes", "حروف الجر والظروف", "🐢", [
        rules(lid, 1, cards), fill(lid, 2, ex, "À, au, avec ou de ?", "à أم au أم avec أم de؟", "J'écris la préposition qui convient.", "اكتب حرف الجر المناسب."),
        fill(lid, 3, [f"{a} → ___ = {b}" for a, b in adv], "Je fabrique l'adverbe", "أصوغ الظرف", "J'écris l'adverbe formé à partir de l'adjectif.", "اكتب الظرف المشتق من الصفة."),
        choose(lid, 4, ch, "Le bon adverbe", "الظرف المناسب"), match(lid, 5, rel, "Comment ?", "كيف؟")])


def homonymes():
    lid = "l4-gr19"
    cards = [("et = et puis (aussi) — est = verbe être (était). — Cette tarte est bonne et grande.", "et حرف عطف (و)، وest فعل être (يمكن قول était)", "➕"),
             ("a = verbe avoir (possède) — à = préposition. — La souris a une fine oreille ; on la trouve à la campagne.", "a فعل avoir (يملك)، وà حرف جر", "🐭"),
             ("on = il / elle (sujet vague) — ont = verbe avoir (possèdent). — On ne voit bien qu'avec le cœur. Les renards ont du flair.", "on ضمير (يمكن قول il)، وont فعل avoir", "🦊"),
             ("son = possessif (un, une) — sont = verbe être (pluriel de est). — Chacun son chemin. Les dents sont pointues.", "son للملكية، وsont فعل être للجمع", "🦷"),
             ("ou = ou bien — où = le lieu. — Paris ou Nice ? Où vas-tu ?", "ou بمعنى أو، وoù للمكان", "🗺️"),
             ("ces = démonstratif (montrer) — ses = possessif (à lui / à elle). — Ces perroquets… Ses ailes sont puissantes.", "ces للإشارة، وses للملكية", "🦜"),
             ("qu'elle = qu'il — quelle + nom féminin. — un trou qu'elle referme ; Quelle belle vue !", "qu'elle يمكن قول qu'il، وquelle قبل اسم مؤنث", "🐢"),
             ("quand = le moment — qu'en = que + en. — Quand revient-il ? Il ne revient qu'en mars.", "quand للزمن، وqu'en = que + en", "📆")]
    items = [("La différence ___ due à l'âge.", "est"), ("J'ai mangé du pain ___ du fromage.", "et"), ("La cigale ___ la fourmi sont deux personnages.", "et"),
             ("Il ___ utilisé les ciseaux.", "a"), ("Je suis prêt ___ tout.", "à"), ("Tu dois lire de la page 20 ___ la page 30.", "à"),
             ("Les poules ___ peur du loup.", "ont"), ("Ce soir, ___ attend quelqu'un.", "on"), ("Le chat va chez ___ voisin.", "son"),
             ("Josée et ses amis ___ au parc.", "sont"), ("Est-ce un aigle ___ un faucon ?", "ou"), ("C'est une ville ___ l'on trouve des étrangers.", "où"),
             ("Il a ôté ___ souliers. (les siens)", "ses"), ("___ dattes saoudiennes sont délicieuses. (celles que je montre)", "Ces"), ("___ ville préfères-tu ?", "Quelle"),
             ("Il propose ___ prenne congé vendredi.", "qu'elle"), ("___ le chat n'est pas là, les souris dansent.", "Quand"), ("Il n'est gentil ___ apparence.", "qu'en")]
    PAIR = {"est": "et", "et": "est", "a": "à", "à": "a", "ont": "on", "on": "ont", "son": "sont", "sont": "son", "ou": "où", "où": "ou",
            "ses": "ces", "Ces": "Ses", "Quelle": "Qu'elle", "qu'elle": "quelle", "Quand": "Qu'en", "qu'en": "quand"}
    ch = [(s, sorted([a, PAIR[a]]), a) for s, a in items]
    hu = [("Faites attention, sinon *ont* aura des erreurs.", "on", "يمكن قول il aura: on"), ("Les élèves *on* attendu longtemps.", "ont", "فعل avoir: ont"),
          ("Il fait ses adieux à *ces* amis.", "ses", "أصدقاؤه هو: ses"), ("L'oiseau a toutes *ces* plumes mouillées.", "ses", "ريشه هو: ses"),
          ("Les fables *on* une morale à la fin.", "ont", "فعل avoir: ont"), ("Tu aimes *ses* énormes rochers.", "ces", "نشير إلى الصخور: ces")]
    sp = speed(lid, 5, [(s, s, a) for s, a in items], "Défi chrono : les homonymes", "تحدّي السرعة: المتشابهات", 75, 12,
               pool=sorted(set(PAIR) | set(PAIR.values())), ask="أي كلمة؟", instr=("Le plus vite possible : le bon homonyme.", "بأسرع ما يمكن: اختر الكلمة الصحيحة."))
    for it in sp["data"]["items"]:   # the twin is always one of the choices
        twin = PAIR[it["answer"]]
        if twin not in it["choices"]:
            it["choices"][next(k for k, c in enumerate(it["choices"]) if c != it["answer"])] = twin
        spare = [w for w in sorted(set(PAIR) | set(PAIR.values())) if w.lower() not in {c.lower() for c in it["choices"]}]
        seen = {it["answer"].lower(), twin.lower()}
        for k, c in enumerate(it["choices"]):
            if c in (it["answer"], twin):
                continue
            if c.lower() in seen:          # e.g. "ses" next to "Ses": two look-alike buttons
                it["choices"][k] = c = spare.pop(0)
            seen.add(c.lower())
    return lesson(lid, "Ch. 13", "Les homonymes", "الكلمات المتشابهة لفظاً", "👯", [
        rules(lid, 1, cards), choose(lid, 2, ch[:9], "Le bon homonyme (1)", "الكلمة الصحيحة (1)"), choose(lid, 3, ch[9:], "Le bon homonyme (2)", "الكلمة الصحيحة (2)"),
        hunt(lid, 4, hu, "Chasse aux homonymes", "اكتشف الخطأ", instr="Je trouve l'homonyme faux et je le corrige.", instr_ar="المس الكلمة الخاطئة ثم صحّحها."),
        sp])


def build():
    return [noms(), articles(), contractes(), partitifs(), demonstratifs(), possessifs(), pluriel(), feminin_noms(), adj_accord(), adj_feminin(), bilan_gn(),
            sujet_verbe(), accord_verbe(), auxiliaires(), complements(), pronoms(), interrogative(), negative(), prep_adverbes(), homonymes(), phrases(), bilan_phrase()]


def bilan_gn():
    lid = "l4-gr90"
    ch = [("___ hiver, nous irons en Suisse.", ["Cet", "Ce", "Cette"], "Cet"), ("Je n'ai pas ___ argent.", ["d'", "de l'", "du"], "d'"),
          ("Les élèves rangent ___ affaires.", ["leurs", "leur", "ses"], "leurs"), ("Il va ___ cinéma avec ___ amis.", ["au … ses", "à le … ses", "aux … ses"], "au … ses"),
          ("Des ___ précieux", ["bijoux", "bijous", "bijoues"], "bijoux"), ("Des ___ de Venise", ["carnavals", "carnavaux", "carnaval"], "carnavals"),
          ("Une voix ___", ["douce", "douse", "doucee"], "douce"), ("Des rideaux ___", ["orange", "oranges", "orangées"], "orange"),
          ("Une ___ remarquable", ["championne", "champione", "championnne"], "championne"), ("Un oncle et une tante très ___", ["gentils", "gentilles", "gentil"], "gentils"),
          ("Il y a ___ beaux tapis en Belgique.", ["de", "des", "les"], "de"), ("___ Beyrouth est une belle ville.", ["(rien)", "La", "Le"], "(rien)")]
    hu = [("Ces *cheval* courent dans la prairie.", "chevaux", "-al ← -aux"), ("Elle porte une jupe et un chemisier *blanches*.", "blancs", "مذكر واحد يكفي ← blancs"),
          ("J'ai acheté *des* beaux souliers.", "de", "الصفة قبل الاسم: de"), ("Ce sont les *travails* de l'été.", "travaux", "travail ← travaux"),
          ("*Ce* arbre est très vieux.", "Cet", "قبل حرف علة: cet"), ("Il ne boit pas *du* café.", "de", "في النفي: de")]
    mix = [("un genou", "un genou", "-x"), ("un trou", "un trou", "-s"), ("un journal", "un journal", "-aux"), ("un festival", "un festival", "-s"),
           ("un vitrail", "un vitrail", "-aux"), ("un rail", "un rail", "-s"), ("un nez", "un nez", "ne change pas"), ("un feu", "un feu", "-x"),
           ("un pneu", "un pneu", "-s"), ("un tuyau", "un tuyau", "-x"), ("une voix", "une voix", "ne change pas"), ("un bal", "un bal", "-s")]
    return lesson(lid, "Bilan A", "Bilan : le nom et ses amis", "مراجعة: الاسم وما يرافقه", "🏁", [
        choose(lid, 1, ch, "Le grand quiz", "المسابقة الكبرى"), hunt(lid, 2, hu, "Chasse aux erreurs", "اكتشف الخطأ"),
        speed(lid, 3, mix, "Défi final : le pluriel", "التحدّي النهائي: الجمع", 60, 10, pool=["-s", "-x", "-aux", "ne change pas"], ask="كيف يُجمع؟",
              instr=("Le plus vite possible : comment ce nom fait-il son pluriel ?", "بأسرع ما يمكن: كيف يُجمع هذا الاسم؟"))], kind="bilan")


def bilan_phrase():
    lid = "l4-gr91"
    ch = [("Lui et toi ___ frères.", ["êtes", "sont", "sommes"], "êtes"), ("Les feuilles sont ___ de l'arbre.", ["tombées", "tombé", "tombés"], "tombées"),
          ("Les frères Grimm ont ___ des contes.", ["écrit", "écrits", "écrite"], "écrit"), ("Marcelle parle à sa cousine. « à sa cousine » est…", ["COI", "COD", "CC de lieu"], "COI"),
          ("___ heure est-il ?", ["Quelle", "Qu'elle", "Quel"], "Quelle"), ("Les renards ___ un excellent flair.", ["ont", "on", "sont"], "ont"),
          ("Il ne revient ___ mars.", ["qu'en", "quand", "quant"], "qu'en"), ("Tes clés ? Prends-___ !", ["les", "leur", "lui"], "les"),
          ("Les plantes ne poussent-elles pas en hiver ? — ___, mais lentement.", ["Si", "Oui", "Non"], "Si"), ("Il marche ___ (lent).", ["lentement", "lentment", "lent"], "lentement"),
          ("Je n'ai vu ___ dans la rue.", ["personne", "quelqu'un", "aucun"], "personne"), ("Habite-___ à Monaco ?", ["t-elle", "elle", "t'elle"], "t-elle")]
    rw = [("Tu aimes les couleurs vives. (question)", "Aimes-tu les couleurs vives ?"), ("Elle porte un bonnet et des gants. (ne… ni… ni)", "Elle ne porte ni bonnet ni gants."),
          ("J'ai arrosé les plantes. (ne… pas)", "Je n'ai pas arrosé les plantes."), ("Le peintre offre le tableau à sa fille. (pronom COD)", "Le peintre l'offre à sa fille.")]
    return lesson(lid, "Bilan B", "Bilan : le verbe et la phrase", "مراجعة: الفعل والجملة", "🏁", [
        choose(lid, 1, ch, "Le grand quiz", "المسابقة الكبرى"),
        rewrite(lid, 2, "Je transforme la phrase (question, négation, pronom).", "حوّل الجملة: سؤال أو نفي أو ضمير.", rw, "Transformations", "تحويلات")], kind="bilan")


def phrases():
    lid = "l4-gr20"
    cards = [("Phrase verbale = Groupe Sujet + Groupe Verbal. — Les hirondelles | reviennent au printemps.", "الجملة الفعلية: مجموعة الفاعل + مجموعة الفعل", "🐦"),
             ("Phrase non verbale : sans verbe conjugué — titres, annonces, devises, publicités. — Sens interdit. Un pour tous, tous pour un !", "جملة بلا فعل مصرَّف: عناوين وإعلانات وشعارات", "🪧"),
             ("On fabrique souvent un nom à partir du verbe : découvrir → la découverte, interdire → l'interdiction, arrêter → l'arrêt.", "نشتق اسماً من الفعل لصياغة العنوان", "📰"),
             ("Phrase simple : un seul verbe conjugué. Phrase complexe : deux verbes conjugués ou plus.", "الجملة البسيطة فيها فعل مصرَّف واحد، والمركّبة فيها أكثر", "🔢"),
             ("Coordination : mais (opposition), ou (choix), et (ajout), donc (conséquence), or (transition), ni (négation), car (cause).", "أدوات العطف: mais, ou, et, donc, or, ni, car", "🔗")]
    nom = [("découvrir", "la découverte"), ("interdire", "l'interdiction"), ("arrêter", "l'arrêt"), ("choisir", "le choix"), ("courir", "la course"),
           ("mentir", "le mensonge"), ("réussir", "la réussite"), ("nager", "la natation")]
    sc = [("Tous les spectateurs applaudissent les tigres du cirque.", True, "فعل مصرَّف واحد: applaudissent"),
          ("Mon père lit le journal et ma mère prépare le café.", False, "فعلان: lit وprépare"),
          ("Les supporters attendent les matchs à la télévision.", True, "فعل واحد: attendent"),
          ("Le lion dort pendant que la lionne chasse.", False, "فعلان: dort وchasse"),
          ("En été, beaucoup de gens vont à la plage.", True, "فعل واحد: vont"),
          ("La souris se met à courir et le chat la suit.", False, "فعلان: se met وsuit")]
    co = [("Il est gentil ___ souriant.", ["et", "ou", "car"], "et"), ("Nous ne sommes pas partis, ___ nous avions des devoirs.", ["car", "et", "donc"], "car"),
          ("Voulez-vous du café ___ du thé ?", ["ou", "donc", "ni"], "ou"), ("Je n'ai rien à faire, ___ je peux vous accompagner.", ["donc", "ni", "or"], "donc"),
          ("Ce film est intéressant ___ trop long.", ["mais", "or", "car"], "mais"), ("Il va pleuvoir, ___ je prends mon parapluie.", ["donc", "mais", "ou"], "donc"),
          ("J'ai envie de venir, ___ j'ai beaucoup de devoirs.", ["mais", "donc", "car"], "mais")]
    rw = [("Corinne ne joue pas avec ses amies. Elle a la grippe.", "Corinne ne joue pas avec ses amies car elle a la grippe. ; Corinne ne joue pas avec ses amies, car elle a la grippe."),
          ("Ma mère a arraché les herbes. Elle a planté des fleurs.", "Ma mère a arraché les herbes et elle a planté des fleurs. ; Ma mère a arraché les herbes et a planté des fleurs."),
          ("Nous allons rentrer. Il fait froid.", "Nous allons rentrer car il fait froid. ; Nous allons rentrer, car il fait froid."),
          ("On a trouvé de l'eau sur Mars.", "Découverte d'eau sur Mars ; Découverte de l'eau sur Mars ; Trouvaille d'eau sur Mars")]
    od = ["Mardi soir, nous recevons des invités.", "Ma mère leur a préparé des plats divers.", "Le plat principal sera du couscous au poulet."]
    return lesson(lid, "Ch. 14-15", "Les groupes, la phrase simple et la phrase complexe", "المجموعات والجملة البسيطة والمركّبة", "🧱", [
        rules(lid, 1, cards), match(lid, 2, nom, "Du verbe au nom", "من الفعل إلى الاسم"), vf(lid, 3, sc, "Phrase simple ?", "جملة بسيطة؟"),
        choose(lid, 4, co, "Le bon mot de liaison", "أداة العطف المناسبة"),
        rewrite(lid, 5, "Je relie les deux phrases avec une conjonction (ou je fais un titre).", "اربط الجملتين بأداة عطف (أو اصنع عنواناً).", rw, "Je relie", "أربط"),
        order(lid, 6, od, "Je remets la phrase en ordre", "أرتّب الجملة")])
