# -*- coding: utf-8 -*-
"""Unit 2 – Marie et le chat Mistou (book pages 119–233): salutations, se présenter, poser des questions, la maison, grammaire, révision."""
import random
from . import words as WD


def act(aid, typ, title, title_ar, instr, instr_ar, points, data):
    return dict(id=aid, type=typ, title=title, title_ar=title_ar, instr=instr, instr_ar=instr_ar, points=points, data=data)


def cards(keys):
    out = []
    for k in keys:
        c = WD.card(k)
        c["kind"] = "word"
        c["tts"] = c["text"]
        out.append(c)
    return out


def fl(aid, keys, title="J'écoute et je retiens les mots", title_ar="أستمع وأحفظ الكلمات"):
    return act(aid, "flashcards", title, title_ar, "J'écoute chaque mot et je le répète.", "استمع إلى كل كلمة وكرّرها.", 10, dict(cards=cards(keys)))


def dialogue(aid, lines, title="J'observe et j'écoute", title_ar="أشاهد وأستمع", note=None):
    return act(aid, "dialogue", title, title_ar, "J'écoute le dialogue, puis je répète chaque phrase.", "استمع إلى الحوار ثم كرّر كل جملة.", 10,
               dict(lines=[dict(who=w, fr=f, ar=a) for w, f, a in lines], note=note))


def phon(aid, sounds):
    return act(aid, "phonics", "Phonétique : j'écoute et j'apprends les sons", "الأصوات: أستمع وأتعلّم",
               "Je touche chaque syllabe et chaque mot pour l'écouter.", "المس كل مقطع وكل كلمة لتسمعها.", 15,
               dict(sounds=[dict(sound=s, rule=r, ar=a, syllables=sy.split(), words=w.split()) for s, r, a, sy, w in sounds]))


def mcq(aid, title, title_ar, questions, points=15, instr="Je coche la bonne réponse.", instr_ar="اختر الإجابة الصحيحة."):
    qs = []
    for q in questions:
        d = dict(q=q[0], choices=q[1], answer=q[2])
        if len(q) > 3:
            d.update(q[3])
        qs.append(d)
    return act(aid, "mcq", title, title_ar, instr, instr_ar, points, dict(questions=qs))


def order(aid, items, title="Je mets les mots en ordre", title_ar="أرتّب الكلمات", points=15):
    rng = random.Random(aid)
    out = []
    for s in items:
        ws = s.split(" ")
        sh = ws[:]
        while len(ws) > 1 and sh == ws:
            rng.shuffle(sh)
        out.append(dict(words=sh, answer=s))
    return act(aid, "word_order", title, title_ar, "Je touche les mots dans le bon ordre pour former la phrase.",
               "المس الكلمات بالترتيب الصحيح لتكوّن الجملة.", points, dict(items=out))


def dictee(aid, sentences, points=15):
    rng = random.Random(aid)
    items = []
    for s in sentences:
        others = [o for o in sentences if o != s]
        ch = [s] + rng.sample(others, min(2, len(others)))
        rng.shuffle(ch)
        items.append(dict(tts=s, answer=s, choices=ch))
    return act(aid, "listen_choose", "Dictée : j'écoute et je trouve la phrase", "إملاء: أستمع وأجد الجملة",
               "J'écoute la phrase et je la retrouve.", "استمع إلى الجملة ثم اخترها من القائمة.", points, dict(items=items))


def fill_word(aid, title, title_ar, bank, items, points=15, instr="Je complète avec le bon mot.", instr_ar="اختر الكلمة المناسبة لكل فراغ."):
    return act(aid, "fill_word", title, title_ar, instr, instr_ar, points,
               dict(bank=bank, items=[dict(text=t, answer=a, **(x[0] if x else {})) for t, a, *x in items]))


def fill_letters(aid, items, title="Je complète avec les lettres manquantes", title_ar="أُكمل الحروف الناقصة", points=15):
    """items: (word, article, blank letters string, choices string, picture key or None)"""
    out = []
    for word, art, letters, choices, key in items:
        idx, wanted = [], list(letters)
        for i, ch in enumerate(word):
            if wanted and ch.lower() == wanted[0].lower():
                idx.append(i)
                wanted.pop(0)
        d = dict(word=word, art=art, blanks=idx, choices=list(choices), ar=WD.W[key]["ar"] if key else "", **(WD.pic(key) if key else dict(emoji="", img=None)))
        out.append(d)
    return act(aid, "fill_letter", title, title_ar, "Je choisis la bonne lettre pour chaque trou.", "اختر الحرف الصحيح لكل فراغ.", points,
               dict(choices=None, items=out))


def pick(aid, title, title_ar, items, instr, instr_ar, points=15):
    """items: list of (text, correct) or (key, correct) using vocabulary pictures."""
    out = []
    for it, ok in items:
        if it in WD.W:
            out.append(dict(WD.card(it), correct=ok))
        else:
            out.append(dict(text=it, emoji="", img=None, correct=ok))
    return act(aid, "sound_pick", title, title_ar, instr, instr_ar, points, dict(letter="", count=sum(1 for _, ok in items if ok), items=out))


def match(aid, pairs, title="Je relie", title_ar="أصل", points=15):
    """pairs: vocabulary keys (word <-> picture) or (left, right) text tuples."""
    out = []
    for p in pairs:
        if isinstance(p, tuple):
            out.append(dict(text=p[0], rtext=p[1], emoji="", img=None))
        else:
            out.append(WD.card(p))
    return act(aid, "match", title, title_ar, "Je touche un élément à gauche, puis son partenaire à droite.", "المس عنصراً على اليسار ثم شريكه على اليمين.", points, dict(pairs=out))


def tf(aid, items, points=15):
    return act(aid, "true_false", "Vrai ou faux ?", "صح أم خطأ؟", "Je coche Vrai ou Faux.", "اختر: صح أم خطأ.", points,
               dict(items=[dict(text=t, answer=a, ar=ar) for t, a, ar in items]))


def reading(aid, title, title_ar, paragraphs, emoji="📖", points=10, instr="J'écoute et je lis.", instr_ar="استمع واقرأ معي."):
    return act(aid, "reading", title, title_ar, instr, instr_ar, points, dict(paragraphs=[dict(fr=f, ar=a) for f, a in paragraphs], emoji=emoji))


def speak(aid, title, title_ar, items, points=15):
    return act(aid, "speak", title, title_ar, "Je dis la phrase à voix haute.", "قل الجملة بصوت عالٍ (المس الميكروفون).", points,
               dict(items=[dict(prompt=p, ar=a, expected=e) for p, a, e in items]))


def lesson(lid, code, title, title_ar, icon, acts, kind="chapter", extra=False):
    return dict(id=lid, code=code, title=title, title_ar=title_ar, icon=icon, kind=kind, extra=extra, chapter=0, activities=acts)


# ---------------------------------------------------------------- Histoire : Marie et le chat Mistou (p.120-122)
STORY = [
    ("Il était une fois une petite fille appelée Marie. Marie parle le français et aussi la langue des chats.",
     "كان يا ما كان، بنت صغيرة اسمها ماري. ماري تتكلم الفرنسية وأيضاً لغة القطط."),
    ("Chaque matin, Marie se réveille à six heures. Elle coiffe ses longs cheveux, se brosse les dents, se lave le visage à l'eau fraiche.",
     "كل صباح تستيقظ ماري في السادسة. تمشّط شعرها الطويل، وتنظّف أسنانها، وتغسل وجهها بالماء البارد."),
    ("Au petit-déjeuner, Marie mange des céréales avec du lait et croque un fruit. À sept heures, Marie attend le bus qui la conduit à l'école.",
     "في الفطور تأكل ماري حبوباً مع الحليب وتقضم فاكهة. في السابعة تنتظر ماري الحافلة التي توصلها إلى المدرسة."),
    ("La maitresse de Marie est gentille. Elle s'appelle Madame Simone. Madame Simone est un peu magicienne. Elle devine les pensées des enfants.",
     "معلّمة ماري لطيفة. اسمها مدام سيمون. مدام سيمون ساحرة قليلاً: إنها تخمّن أفكار الأطفال."),
    ("Le meilleur ami de Marie s'appelle Mistou. Mistou est un petit chat joueur qui vit dans le jardin de Madame Rose, la voisine.",
     "أعزّ صديق لماري اسمه ميستو. ميستو قط صغير لعوب يعيش في حديقة مدام روز، الجارة."),
    ("Mistou aime bien jouer avec Marie. Il observe la rue, les gens, les voitures. Mistou est un grand curieux.",
     "ميستو يحب اللعب مع ماري. يراقب الشارع والناس والسيارات. ميستو فضولي جداً."),
    ("Mistou rêve d'aller à l'école. Au moment de partir, Mistou saute dans le cartable de Marie et se fait tout petit.",
     "ميستو يحلم بالذهاب إلى المدرسة. وعند الخروج يقفز ميستو في حقيبة ماري ويصبح صغيراً جداً."),
]


def story_lesson():
    lid = "u2-story"
    return lesson(lid, "Histoire", "Marie et le chat Mistou", "ماري والقط ميستو", "🐱", [
        reading(lid + "-read", "Je lis l'histoire", "أقرأ القصة", STORY, "🐱", 15),
        mcq(lid + "-quiz", "J'ai compris l'histoire", "فهمت القصة", [
            ("Comment s'appelle la petite fille ?", ["Marie", "Simone", "Rose"], "Marie", dict(ar="ما اسم البنت الصغيرة؟")),
            ("Comment s'appelle le chat ?", ["Bruno", "Mistou", "Rose"], "Mistou", dict(ar="ما اسم القط؟")),
            ("À quelle heure Marie se réveille-t-elle ?", ["à six heures", "à sept heures", "à deux heures"], "à six heures", dict(ar="في أي ساعة تستيقظ ماري؟")),
            ("Comment s'appelle la maitresse ?", ["Madame Rose", "Madame Simone", "Madame Émilie"], "Madame Simone", dict(ar="ما اسم المعلّمة؟")),
            ("Où vit Mistou ?", ["dans le jardin de Madame Rose", "à l'école", "dans le bus"], "dans le jardin de Madame Rose", dict(ar="أين يعيش ميستو؟")),
            ("Mistou est…", ["un grand curieux", "un chien", "une maitresse"], "un grand curieux", dict(ar="ميستو هو…")),
        ], 15),
        match(lid + "-match", ["marie", "mistou", "maitresse", "ecole", "bus", "chat"]),
    ])


# ---------------------------------------------------------------- Chapitre 1 : Les salutations (p.123-146)
GREET = ["bonjour", "salut", "bonne_journee", "au_revoir", "bonne_rentree", "bon_appetit", "bonsoir", "bonne_nuit", "bon_voyage", "bon_travail"]
PHON1 = [
    ("[on]", "Le O et le N mis ensemble se prononcent [on].", "حرفا O و N معاً يُنطقان «ون» (صوت أنفي)", "bon don fon jon lon mon non pon ron son ton von", "bon mon non pont rond son ton"),
    ("[ou]", "Le O et le U mis ensemble se prononcent [ou].", "حرفا O و U معاً يُنطقان «و» كما في «نور»", "bou cou dou fou jou lou mou nou pou rou sou", "bout cou doux fou joue loup nous tout vous"),
    ("[ô] au", "Le A et le U mis ensemble se prononcent [ô].", "حرفا A و U معاً يُنطقان «و» مفخّمة (ô)", "bau cau dau lau jau pau rau tau", "chaud jaune pauvre"),
    ("[oi]", "Le O et le I mis ensemble se prononcent [wa].", "حرفا O و I معاً يُنطقان «وا»", "boi coi doi foi joi loi moi noi poi roi soi toi", "bois fois joie loi moi noir roi toi voix"),
    ("[an] en", "Le E et le N mis ensemble se prononcent [an].", "حرفا E و N معاً يُنطقان «ان» (صوت أنفي)", "ben den fen gen len men pen ren sen ten ven", "dent gens lent rend sent vend"),
    ("[è] ai", "Le A et le I mis ensemble se prononcent [è].", "حرفا A و I معاً يُنطقان «إي» مفتوحة (è)", "bai cai dai fai lai mai nai rai sai tai vai", "fait laid maitresse paix sait vais"),
]
SITUATIONS = [("Marie va dormir.", "Bonne nuit, Marie !"), ("Annie déjeune chez Marie.", "Bon appétit, Annie !"),
              ("Marie monte dans le bus.", "Bonne journée, Marie !"), ("Papa part en voyage.", "Bon voyage, Papa !"),
              ("Bruno fait ses devoirs.", "Bon travail, Bruno !"), ("Mistou se réveille.", "Bonjour, Mistou !")]


def salutations_acts_1(lid):
    return [
        dialogue(lid + "-observe", [
            ("Marie", "Bonne journée Marie ! — Au revoir, Maman !", "يوماً سعيداً يا ماري! — إلى اللقاء يا ماما!"),
            ("Marie", "Bonjour Madame Simone ! Salut Bruno !", "صباح الخير يا مدام سيمون! أهلاً يا برونو!"),
            ("La maitresse", "Bonne rentrée les enfants !", "عودة مدرسية سعيدة يا أولاد!"),
            ("Bruno", "Salut Marie ! Bonjour Maitresse !", "أهلاً يا ماري! صباح الخير يا معلّمتي!"),
            ("Maman", "Bon appétit !", "بالهناء والشفاء!"),
            ("Marie", "Bonsoir Papa !", "مساء الخير يا بابا!"),
            ("Maman", "Bonne nuit Marie !", "تصبحين على خير يا ماري!"),
        ], note="ميستو يريد أن يعرف: لماذا لا نقول «Salut» لمدام سيمون؟ لأن «Salut» تُقال بين الأصدقاء فقط، أما «Bonjour» فهي أكثر تهذيباً."),
        fl(lid + "-vocab", GREET + ["madame", "maitresse", "mistou", "marie"]),
        phon(lid + "-phon", PHON1),
        pick(lid + "-bizarre", "Je barre les souhaits bizarres", "أشطب التمنيات الغريبة",
             [("Bon chocolat !", True), ("Bonne école !", True), ("Bon appétit !", False), ("Bon travail !", False), ("Bon voyage !", False),
              ("Bonne soirée !", False), ("Au revoir !", False), ("Bonne journée !", False), ("Bon séjour !", False), ("Bonne lune !", True),
              ("Bonne voiture !", True), ("Bonne nuit !", False)],
             "Je touche les souhaits qui n'existent pas.", "المس التمنيات الغريبة التي لا نقولها."),
        fill_letters(lid + "-fill", [("jour", "Le", "ou", "oua", "jour"), ("soir", "Le", "oi", "oia", "soir"), ("nuit", "La", "ut", "uta", "nuit"),
                                     ("Marie", "", "ai", "aie", "marie"), ("maitresse", "La", "aie", "aieo", "maitresse"), ("Mistou", "", "iou", "ioua", "mistou"),
                                     ("Au revoir", "", "Aoi", "Aoiu", "au_revoir"), ("Bon appétit", "", "Bé", "Béa", "bon_appetit")]),
        match(lid + "-relie", SITUATIONS, "Je relie la situation et le souhait", "أصل الموقف بالتحية"),
        mcq(lid + "-corrige", "Je corrige les erreurs", "أصحّح الأخطاء", [
            ("Bonjourne !", ["Bonjour !", "Bonne journée !", "Bonsoir !"], "Bonjour !", dict(ar="ما الكتابة الصحيحة؟")),
            ("Bonne jour !", ["Bonne journée !", "Bon jour !", "Bonne nuit !"], "Bonne journée !"),
            ("Bonuit !", ["Bonne nuit !", "Bon nuit !", "Bonsoir !"], "Bonne nuit !"),
            ("Bonne soir !", ["Bonsoir !", "Bon soir !", "Bonne soirée !"], "Bonsoir !"),
            ("Aurévoir !", ["Au revoir !", "Au revoire !", "Aurevoir !"], "Au revoir !"),
            ("Bonappétit !", ["Bon appétit !", "Bonne appétit !", "Bon apétit !"], "Bon appétit !"),
        ], 15, "Je choisis la bonne orthographe.", "اختر الكتابة الصحيحة."),
    ]


def salutations_acts_2(lid):
    return [
        mcq(lid + "-souhaite", "Que souhaite-t-on ?", "ماذا نتمنى؟", [
            ("Le jour de la rentrée :", ["Bonne rentrée !", "Bonne nuit !", "Bon appétit !"], "Bonne rentrée !", dict(ar="في يوم العودة إلى المدرسة")),
            ("Le matin :", ["Bonjour !", "Bonsoir !", "Bonne nuit !"], "Bonjour !", dict(ar="في الصباح")),
            ("À quelqu'un qui mange :", ["Bon appétit !", "Bon voyage !", "Bon travail !"], "Bon appétit !", dict(ar="لشخص يأكل")),
            ("À quelqu'un qui travaille :", ["Bon travail !", "Bonne nuit !", "Salut !"], "Bon travail !", dict(ar="لشخص يعمل")),
            ("Le soir :", ["Bonsoir !", "Bonjour !", "Bonne rentrée !"], "Bonsoir !", dict(ar="في المساء")),
            ("La nuit, avant de dormir :", ["Bonne nuit !", "Bonne journée !", "Au revoir !"], "Bonne nuit !", dict(ar="في الليل قبل النوم")),
            ("Marie monte dans le bus. Marie dit à Maman :", ["Au revoir, Maman !", "Bon appétit, Maman !", "Bonne nuit, Maman !"], "Au revoir, Maman !", dict(ar="ماري تركب الحافلة وتقول لماما:")),
            ("Papa part en voyage. Marie dit :", ["Bon voyage, Papa !", "Bon travail, Papa !", "Bonne rentrée, Papa !"], "Bon voyage, Papa !", dict(ar="بابا يسافر، ماري تقول:")),
        ]),
        order(lid + "-order", ["Marie dit au revoir à Maman.", "Bruno dit salut à Marie.", "La maitresse dit bonne rentrée aux enfants."]),
        dictee(lid + "-dictee", ["Marie monte dans le bus avec Mistou.", "Bonjour Madame Simone !", "Salut Bruno !", "Mistou saute dans son cartable.",
                                 "Marie déjeune à la maison.", "Bonne rentrée, les enfants !", "C'est le premier jour d'école.", "C'est la nuit."]),
        fill_word(lid + "-croises", "Mots croisés : je trouve le mot", "الكلمات المتقاطعة: أجد الكلمة",
                  ["Salut", "Bonsoir", "Au revoir", "Bon appétit", "Bonne rentrée", "Bonne nuit", "Maitresse"],
                  [("Salutation du jour à un ami : ___", "Salut", dict(ar="تحية النهار لصديق")), ("Salutation du soir : ___", "Bonsoir", dict(ar="تحية المساء")),
                   ("Salutation lorsqu'on part : ___", "Au revoir", dict(ar="تحية عند المغادرة")), ("Souhait lorsqu'on mange : ___", "Bon appétit", dict(ar="تمنٍّ عند الأكل")),
                   ("Souhait au premier jour d'école : ___", "Bonne rentrée", dict(ar="تمنٍّ في أول يوم مدرسة")), ("Salutation avant de dormir : ___", "Bonne nuit", dict(ar="تحية قبل النوم")),
                   ("Dame qui enseigne : ___", "Maitresse", dict(ar="السيدة التي تُعلّم"))]),
        act(lid + "-memory", "memory", "Mémory des salutations", "ذاكرة التحيات", "Je retrouve les paires.", "ابحث عن كل تحية وصورتها.", 15,
            dict(pairs=[WD.card(k) for k in GREET[:8]])),
        speak(lid + "-speak", "Je salue", "أُلقي التحية", [("Bonjour Madame !", "صباح الخير يا سيدتي!", "bonjour madame"), ("Salut Bruno !", "أهلاً يا برونو!", "salut bruno"),
                                                      ("Bon appétit !", "بالهناء والشفاء!", "bon appétit"), ("Bonne nuit Marie !", "تصبحين على خير يا ماري!", "bonne nuit marie")]),
        reading(lid + "-comptine", "La comptine : Bon appétit !", "أنشودة: بالهناء!", [("Mon petit ventre, réjouis-toi !", "يا بطني الصغير، افرح!"),
                 ("Ce que je mange, ce que je mange…", "ما آكله، ما آكله…"), ("Mon petit ventre, réjouis-toi !", "يا بطني الصغير، افرح!"),
                 ("Ce que je mange, c'est pour toi !", "ما آكله هو لك!"), ("Bon appétit ! Merci !", "بالهناء! شكراً!")], "🎶"),
    ]


def salutations_lesson():
    lid = "u2-salutations"
    return lesson(lid, "Chapitre 1", "Les salutations", "التحيات", "👋", salutations_acts_1(lid) + salutations_acts_2(lid))


def crocodiles_lesson():
    lid = "u2-song1"
    return lesson(lid, "Chanson", "Je chante : Ah les crocodiles", "أغنية: آه التماسيح", "🐊", [
        reading(lid + "-sing", "Ah les crocodiles", "التماسيح", [
            ("Un crocodile s'en allant à la guerre / Disait adieu à ses petits-enfants", "تمساح ذاهب إلى الحرب / يودّع أحفاده الصغار"),
            ("Trainant la queue, la queue dans la poussière / Il s'en allait combattre les éléphants", "يجرّ ذيله في التراب / ذاهب ليحارب الفيلة"),
            ("Ah les crocrocro, les crocrocro, les crocodiles / Sur les bords du Nil ils sont partis, n'en parlons plus", "آه التماسيح، التماسيح / على ضفاف النيل رحلوا، فلا نتكلم عنهم"),
            ("Ah les crocrocro, les crocrocro, les crocodiles / Sur les bords du Nil ils sont partis, tout est fini !", "آه التماسيح / على ضفاف النيل رحلوا، وانتهى كل شيء!"),
        ], "🎶", 10, "J'écoute et je chante.", "استمع وغنِّ معنا.")], "song", True)


# ---------------------------------------------------------------- Chapitre 2 : Comment s'appelle-t-il / elle ? (p.147-163)
PHON2 = [
    ("[è] e+ll/ss", "Le E suivi de 2 lettres identiques se prononce [è].", "حرف E قبل حرفين متماثلين يُنطق «إي» مفتوحة", "elle belle pelle selle telle", "elle belle terre verre jette"),
    ("[e] eu", "Le E et le U mis ensemble se prononcent [e] comme peur.", "حرفا E و U معاً يُنطقان «ُ» كما في peur", "beu deu feu leu meu neu peu reu veu", "beurre fleur heure odeur peur"),
    ("[iy] ill", "Le I suivi de 2 L se prononce [iy].", "حرف I قبل LL يُنطق «يّ»", "bille fille quille", "bille fille quille"),
    ("[s] ç", "Le Ç (avec une cédille) se prononce [s].", "حرف Ç (بالذيل) يُنطق «س»", "ça ço çu çon çoi", "ça garçon reçu reçoit"),
    ("[ch]", "Le C et le H mis ensemble se prononcent [ch].", "حرفا C و H معاً يُنطقان «ش»", "cha che chi cho chu chy", "chat chose"),
    ("[eu]", "Le E et le U se prononcent [eu] et le X final ne se prononce pas.", "حرفا E و U يُنطقان «ُ» والـ X الأخيرة لا تُنطق", "beu ceu deu jeu meu neu peu", "ceux curieux deux feu heureux veux"),
]


def prenoms_lesson():
    lid = "u2-prenoms"
    return lesson(lid, "Chapitre 2", "Comment s'appelle-t-il ? Comment s'appelle-t-elle ?", "ما اسمه؟ ما اسمها؟", "🙋", [
        dialogue(lid + "-observe", [
            ("Marie", "Elle s'appelle Marie. C'est une fille.", "اسمها ماري. إنها بنت."),
            ("Mistou", "Il s'appelle Mistou. C'est un chat.", "اسمه ميستو. إنه قط."),
            ("Bruno", "Il s'appelle Bruno. C'est un garçon.", "اسمه برونو. إنه ولد."),
            ("Annie", "Bonjour Marie ! Ma maitresse s'appelle Madame Émilie. Et ta maitresse, comment s'appelle-t-elle ?", "صباح الخير يا ماري! معلّمتي اسمها مدام إميلي. ومعلّمتك، ما اسمها؟"),
            ("Marie", "Elle s'appelle Madame Simone. Elle est très gentille mais elle a peur des souris.", "اسمها مدام سيمون. إنها لطيفة جداً لكنها تخاف من الفئران."),
            ("Annie", "Et ton chat, comment s'appelle-t-il ?", "وقطّك، ما اسمه؟"),
            ("Marie", "Il s'appelle Mistou. Il est très curieux !", "اسمه ميستو. إنه فضولي جداً!"),
        ], note="ميستو يريد أن يعرف: لماذا نقول «comment s'appelle-t-il» وليس «comment s'appelle il»؟ نضيف حرف t بين appelle و il حتى يكون النطق جميلاً."),
        fl(lid + "-vocab", ["fille", "garcon", "souris", "chat", "gentil", "gentille", "curieux", "maitresse", "bruno", "annie"]),
        act(lid + "-phrases", "flashcards", "Je retiens les phrases", "أحفظ الجمل", "J'écoute et je répète.", "استمع وكرّر.", 10, dict(cards=[
            dict(kind="word", text="Comment s'appelle-t-il ?", ar="ما اسمه؟", emoji="👦❓", img=None, tts="Comment s'appelle-t-il ?"),
            dict(kind="word", text="Il s'appelle Bruno.", ar="اسمه برونو.", emoji="👦", img=None, tts="Il s'appelle Bruno."),
            dict(kind="word", text="Comment s'appelle-t-elle ?", ar="ما اسمها؟", emoji="👧❓", img=None, tts="Comment s'appelle-t-elle ?"),
            dict(kind="word", text="Elle s'appelle Marie.", ar="اسمها ماري.", emoji="👧", img=None, tts="Elle s'appelle Marie."),
            dict(kind="word", text="Comment t'appelles-tu ?", ar="ما اسمك؟", emoji="🫵❓", img=None, tts="Comment t'appelles-tu ?"),
            dict(kind="word", text="Je m'appelle Yaseen.", ar="اسمي ياسين.", emoji="🧒", img=None, tts="Je m'appelle Yaseen."),
            dict(kind="word", text="C'est un chat.", ar="هذا قط.", emoji="🐱", img=None, tts="C'est un chat."),
            dict(kind="word", text="Elle a peur des souris.", ar="هي تخاف من الفئران.", emoji="😱🐭", img=None, tts="Elle a peur des souris."),
        ])),
        phon(lid + "-phon", PHON2),
        match(lid + "-relie", ["maitresse", "chat", "fille", "souris", "garcon"]),
        fill_letters(lid + "-fill", [("appelle", "Elle s'", "ell", "elar", None), ("Simone", "Madame", "im", "ima", None), ("Mistou", "", "ou", "oua", "mistou"),
                                     ("chat", "C'est un", "ch", "chs", "chat"), ("Comment", "", "mm", "mn", None), ("Émilie", "Madame", "li", "lia", None)]),
        mcq(lid + "-coche", "Je coche la bonne réponse", "أختار الإجابة الصحيحة", [
            ("Comment s'appelle le chat de Marie ?", ["Il s'appelle Mistou.", "Il s'appelle Bruno.", "Elle s'appelle Marie."], "Il s'appelle Mistou.", dict(ar="ما اسم قط ماري؟")),
            ("Comment s'appelle la maitresse de Marie ?", ["Elle s'appelle Madame Simone.", "Elle s'appelle Madame Émilie.", "Il s'appelle Madame Simone."], "Elle s'appelle Madame Simone.", dict(ar="ما اسم معلّمة ماري؟")),
            ("Comment s'appelle la maitresse d'Annie ?", ["Elle s'appelle Madame Émilie.", "Elle s'appelle Madame Simone.", "Il s'appelle Bruno."], "Elle s'appelle Madame Émilie.", dict(ar="ما اسم معلّمة آني؟")),
            ("De quoi Madame Simone a-t-elle peur ?", ["Madame Simone a peur des souris.", "Madame Simone a peur des chats.", "Madame Simone a peur de Marie."], "Madame Simone a peur des souris.", dict(ar="ممّ تخاف مدام سيمون؟")),
            ("Que dit Marie à propos de Mistou ?", ["Elle dit que Mistou est curieux.", "Elle dit que Mistou est petit.", "Elle dit que Mistou est une maitresse."], "Elle dit que Mistou est curieux.", dict(ar="ماذا تقول ماري عن ميستو؟")),
            ("Bruno, c'est…", ["un garçon", "une fille", "un chat"], "un garçon", dict(ar="برونو هو…")),
        ]),
        order(lid + "-order", ["Comment s'appelle-t-il ?", "Il s'appelle Bruno.", "Comment s'appelle-t-elle ?", "Elle s'appelle Madame Simone."]),
        dictee(lid + "-dictee", ["La maitresse de Marie s'appelle Simone.", "Il s'appelle Mistou.", "Le chat est curieux.", "Je m'appelle Marie.",
                                 "Annie est gentille.", "C'est un gentil chat.", "Madame Simone a peur des souris."]),
        speak(lid + "-speak", "Je me présente", "أُعرّف بنفسي", [("Je m'appelle Yaseen.", "اسمي ياسين.", "je m'appelle"), ("Comment t'appelles-tu ?", "ما اسمك؟", "comment t'appelles-tu"),
                                                             ("Il s'appelle Mistou.", "اسمه ميستو.", "il s'appelle mistou"), ("Elle s'appelle Marie.", "اسمها ماري.", "elle s'appelle marie")]),
        reading(lid + "-comptine", "La comptine : Mademoiselle Ritournelle", "أنشودة: الآنسة ريتورنيل", [
            ("Comment s'appelle-t-elle ? / Mademoiselle Ritournelle", "ما اسمها؟ / الآنسة ريتورنيل"), ("Et que donc prépare-t-elle ? / Elle cuit un bœuf à la ficelle", "وماذا تُحضّر؟ / تطبخ لحماً بالخيط"),
            ("Et pour qui le fait-elle ? / Pour tous ceux qui la trouvent belle", "ولمن تفعل ذلك؟ / لكل من يجدها جميلة")], "🎶"),
    ])


# ---------------------------------------------------------------- Chapitre 3 : Je pose des questions (p.164-181)
PHON3 = [
    ("[in] ien", "Les lettres E, N après un I se prononcent [in].", "حرفا E و N بعد I يُنطقان «ان» أنفية خفيفة", "bien lien mien rien sien tien", "bien lien mien sien tien vient"),
    ("[ô] eau", "Les lettres E, A, U mises ensemble se prononcent [ô].", "حروف E A U معاً تُنطق «و» (ô)", "eau beau deau leau meau neau peau seau teau veau", "eau beau cadeau gâteau peau seau veau"),
    ("[an]", "Le A et le N mis ensemble se prononcent [an].", "حرفا A و N معاً يُنطقان «ان» أنفية", "ban can dan fan gan lan man pan ran san tan van", "banc chant dans grand pantalon rang"),
    ("[è] ê", "Le Ê (accent circonflexe) se prononce [è].", "حرف Ê (بالقبعة) يُنطق «إي» مفتوحة", "bê fê lê mê pê sê tê vê", "bête fête tête"),
    ("[é] er", "Le E et le R à la fin d'un mot se prononcent [é].", "حرفا E و R في آخر الكلمة يُنطقان «إيه» (é)", "ber der jer ler mer ner per rer ver", "appeler fêter jouer manger toucher"),
    ("[z] s", "Le S entre 2 voyelles se prononce [z].", "حرف S بين حرفين متحركين يُنطق «ز»", "ase èse ise ose use", "dose pose rose use cuisine"),
]
QWORDS = [dict(kind="word", text="Où ?", ar="أين؟ (مكان)", emoji="📍", img=None, tts="Où ?"), dict(kind="word", text="Que ? / Qu'est-ce que ?", ar="ماذا؟ (شيء أو فعل)", emoji="❓", img=None, tts="Que ? Qu'est-ce que ?"),
          dict(kind="word", text="Qui ?", ar="من؟ (شخص)", emoji="🧑", img=None, tts="Qui ?"), dict(kind="word", text="Comment ?", ar="كيف؟ (طريقة أو صفة)", emoji="🤔", img=None, tts="Comment ?"),
          dict(kind="word", text="Qu'est-ce que c'est ?", ar="ما هذا؟", emoji="👉", img=None, tts="Qu'est-ce que c'est ?"), dict(kind="word", text="C'est un gâteau.", ar="هذه كعكة.", emoji="🎂", img=None, tts="C'est un gâteau.")]
BOARD_KEYS = ["chat", "gateau", "cadeau", "cuisine", "bus", "livre", "fille", "garcon", "souris", "maitresse", "ecole", "banane", "cle", "piano", "moto", "porte", "robe", "sac", "tomate", "lune"]


def questions_acts_1(lid):
    return [
        dialogue(lid + "-observe", [
            ("Marie", "Papa, où est Mistou ?", "بابا، أين ميستو؟"), ("Papa", "Il est dans la cuisine avec Maman.", "إنه في المطبخ مع ماما."),
            ("Marie", "Que fait Maman dans la cuisine ?", "ماذا تفعل ماما في المطبخ؟"), ("Papa", "Elle prépare ton gâteau d'anniversaire.", "إنها تُحضّر كعكة عيد ميلادك."),
            ("Marie", "Comment est mon gâteau ?", "كيف هي كعكتي؟"), ("Papa", "Ton gâteau est très grand.", "كعكتك كبيرة جداً."),
            ("Marie", "Et ça, qu'est-ce que c'est ?", "وهذا، ما هو؟"), ("Papa", "C'est ton cadeau d'anniversaire.", "إنها هدية عيد ميلادك."),
            ("Marie", "Qui vient à mon anniversaire ?", "من يأتي إلى عيد ميلادي؟"), ("Papa", "Tous tes amis viennent fêter ton anniversaire, Marie.", "كل أصدقائك يأتون للاحتفال بعيد ميلادك يا ماري."),
        ], note="ميستو يريد أن يعرف: «Qui» تسأل عن شخص، «Que / Qu'est-ce que» عن شيء أو فعل، «Où» عن مكان، «Comment» عن الطريقة أو الصفة."),
        act(lid + "-qwords", "flashcards", "Les mots pour poser des questions", "كلمات الاستفهام", "J'écoute et je répète.", "استمع وكرّر.", 10, dict(cards=QWORDS)),
        fl(lid + "-vocab", ["gateau", "cadeau", "cuisine", "amis", "grand", "feter", "preparer", "papa", "maman"]),
        phon(lid + "-phon", PHON3),
        match(lid + "-relie", ["anniversaire", "amis", "grand", "cuisine", "gateau"]),
        fill_letters(lid + "-fill", [("gâteau", "Un", "âeau", "âeauo", "gateau"), ("anniversaire", "Un", "nnai", "nnaio", "anniversaire"), ("cuisine", "Une", "ui", "uio", "cuisine"),
                                     ("cadeau", "Un", "eau", "eauo", "cadeau"), ("Fêter", "", "ê", "êéa", None), ("amis", "Les", "mi", "mia", "amis")]),
    ]


def questions_acts_2(lid):
    rng = random.Random(lid)
    squares = []
    for k in BOARD_KEYS:
        ch = [WD.label(k)] + [WD.label(x) for x in rng.sample([x for x in BOARD_KEYS if x != k], 2)]
        rng.shuffle(ch)
        squares.append(dict(WD.card(k), choices=ch, answer=WD.label(k)))
    cest = []
    for k in ["chat", "gateau", "cadeau", "souris", "fille", "cuisine"]:
        ch = [WD.label(k)] + [WD.label(x) for x in rng.sample([x for x in BOARD_KEYS if x != k], 2)]
        rng.shuffle(ch)
        cest.append(("Qu'est-ce que c'est ?", ch, WD.label(k), dict(emoji=WD.W[k]["emoji"], img=WD.pic(k)["img"], ar="انظر إلى الصورة واختر الجملة")))
    return [
        mcq(lid + "-cest", "Qu'est-ce que c'est ?", "ما هذا؟", cest, 15, "Je regarde l'image et je réponds : C'est un … / une …", "انظر إلى الصورة واختر الإجابة."),
        mcq(lid + "-coche", "J'ai compris le dialogue", "فهمت الحوار", [
            ("Qui parle avec Marie ?", ["Le papa de Marie", "Bruno", "La maman de Marie"], "Le papa de Marie", dict(ar="من يتكلم مع ماري؟")),
            ("Où est Mistou ?", ["Il est dans la cuisine.", "Il est dans le bus.", "Il est à l'école."], "Il est dans la cuisine.", dict(ar="أين ميستو؟")),
            ("Où est la maman de Marie ?", ["Elle est dans la cuisine.", "Elle est dans la rue.", "Elle est dans un taxi."], "Elle est dans la cuisine.", dict(ar="أين ماما؟")),
            ("Que fait la maman de Marie ?", ["Elle prépare un gâteau.", "Elle monte dans le bus.", "Elle joue avec Mistou."], "Elle prépare un gâteau.", dict(ar="ماذا تفعل ماما؟")),
            ("Comment est le gâteau d'anniversaire ?", ["Il est très grand.", "Il est petit.", "Il est curieux."], "Il est très grand.", dict(ar="كيف هي الكعكة؟")),
            ("Et ça, qu'est-ce que c'est ? Son père répond :", ["C'est ton cadeau d'anniversaire", "C'est Mistou", "C'est ton ami Bruno"], "C'est ton cadeau d'anniversaire", dict(ar="ماذا يجيب بابا؟")),
            ("Qui vient à l'anniversaire de Marie ?", ["Les amis de Marie", "Madame Simone", "Les élèves de Madame Émilie"], "Les amis de Marie", dict(ar="من يأتي إلى عيد الميلاد؟")),
        ]),
        fill_word(lid + "-question", "Je pose la question", "أطرح السؤال", ["Qui", "Que", "Qu'est-ce que", "Où", "Comment"], [
            ("___ est Mistou ? — Mistou est dans le bus.", "Où", dict(ar="الإجابة عن مكان")), ("___ fait Papa ? — Papa lit un livre.", "Que", dict(ar="الإجابة عن فعل")),
            ("___ prépare un gâteau ? — C'est Maman.", "Qui", dict(ar="الإجابة عن شخص")), ("___ c'est ? — C'est le cadeau de Marie.", "Qu'est-ce que", dict(ar="الإجابة عن شيء")),
            ("___ est le cadeau de Marie ? — Il est très grand.", "Comment", dict(ar="الإجابة عن صفة"))], 20, "Je choisis le bon mot interrogatif.", "اختر كلمة الاستفهام المناسبة."),
        dictee(lid + "-dictee", ["Madame Émilie prépare un gâteau pour ses élèves.", "Les amis de Marie viennent fêter son anniversaire.", "Papa répond aux questions de Marie.",
                                 "Mistou est dans la cuisine avec Maman.", "Il y a un cadeau d'anniversaire pour Marie."]),
        act(lid + "-board", "board_game", "Jeu de l'échelle : je dis ce que c'est", "لعبة السلّم: أقول ما هذا", "Je lance le dé, j'avance et je réponds : Qu'est-ce que c'est ?",
            "ارمِ الزهر، تقدّم على اللوحة، وأجب: ما هذا؟", 25, dict(squares=squares)),
        reading(lid + "-comptine", "La comptine : Loup, loup", "أنشودة: الذئب", [("Loup, loup, où es-tu ? / Je suis dans le bois", "ذئب، ذئب، أين أنت؟ / أنا في الغابة"),
                 ("Loup, loup, que fais-tu ? / Je mange et je bois", "ذئب، ذئب، ماذا تفعل؟ / آكل وأشرب"), ("Loup, loup, que manges-tu ? / Une galette des rois… Hahahaha", "ذئب، ذئب، ماذا تأكل؟ / كعكة الملوك… هاهاها")], "🐺"),
    ]


def questions_lesson():
    lid = "u2-questions"
    return lesson(lid, "Chapitre 3", "Je pose des questions", "أطرح الأسئلة", "❓", questions_acts_1(lid) + questions_acts_2(lid))


def michel_lesson():
    lid = "u2-song3"
    return lesson(lid, "Chanson", "Je chante : C'est la mère Michel", "أغنية: الأم ميشيل", "🎤", [
        reading(lid + "-sing", "C'est la mère Michel", "الأم ميشيل", [
            ("C'est la mère Michel qui a perdu son chat, / Qui crie par la fenêtre à qui le lui rendra.", "الأم ميشيل فقدت قطّها / وتصرخ من النافذة: من يعيده لها؟"),
            ("C'est le père Lustucru qui lui a répondu : / Allez, la mère Michel, vot' chat n'est pas perdu !", "الأب لوستوكرو أجابها: / هيا يا أم ميشيل، قطك ليس ضائعاً!"),
            ("Sur l'air du tralalala (bis), / Sur l'air du tradéridera, / Et tralala.", "على لحن ترالالا / ترالالا")], "🎶", 10, "J'écoute et je chante.", "استمع وغنِّ معنا.")], "song", True)


# ---------------------------------------------------------------- Chapitre 4 : La maison (p.182-209)
ROOMS = ["salon", "cuisine", "salle_a_manger", "chambre", "salle_de_bain"]
ROOM_INTRO = [
    ("Au salon, il y a un canapé avec des coussins, un fauteuil, une table et un téléviseur.", "في الصالون يوجد كنبة بوسائد، وكرسي بذراعين، وطاولة، وتلفاز."),
    ("Dans la salle à manger, il y a une grande table et beaucoup de chaises. Il y a aussi un buffet.", "في غرفة الطعام طاولة كبيرة وكراسي كثيرة. ويوجد أيضاً بوفيه."),
    ("À la cuisine, il y a un évier, un four, un lave-vaisselle, un lave-linge, un réfrigérateur et des placards.", "في المطبخ حوض، وفرن، وغسالة أطباق، وغسالة ملابس، وثلاجة، ودواليب."),
    ("Dans la chambre, il y a deux lits, une table de nuit, une lampe, un bureau et une armoire.", "في غرفة النوم سريران، ومنضدة سرير، ومصباح، ومكتب، وخزانة ملابس."),
    ("Dans la salle de bain, il y a une baignoire avec une douche, un lavabo, un W.-C. Au-dessus du lavabo, il y a une armoire avec un miroir.", "في الحمّام حوض استحمام بدُش، وحوض غسيل، ومرحاض. وفوق حوض الغسيل خزانة بمرآة."),
]
PHON4 = [
    ("[ey] euil", "Les lettres E, U, I, L mises ensemble se prononcent [ey].", "حروف E U I L معاً تُنطق «ُي» (euil)", "beuil deuil feuil meuil reuil seuil", "écureuil fauteuil feuille seuil"),
    ("[in]", "Le I et le N mis ensemble se prononcent [in].", "حرفا I و N معاً يُنطقان «ان» أنفية خفيفة", "bin din fin kin lin min pin rin sin tin", "fin lin linge pin"),
    ("[è] et", "Le E et le T à la fin d'un mot se prononcent [è].", "حرفا E و T في آخر الكلمة يُنطقان «إي» مفتوحة", "bet det fet jet met ret set tet vet", "buffet cabinet paquet secret violet"),
    ("[an] am", "Le A et le M devant B ou P se prononcent [an].", "حرفا A و M قبل B أو P يُنطقان «ان» أنفية", "bam dam fam jam mam nam pam ram sam tam", "chambre lampe jambe rampe"),
    ("[in] ain", "Les lettres A, I, N mises ensemble se prononcent [in].", "حروف A I N معاً تُنطق «ان» أنفية خفيفة", "bain dain fain lain main nain pain rain sain", "bain main nain pain sain"),
    ("[ni] gn", "Le G suivi d'un N se prononce [ni].", "حرفا G و N معاً يُنطقان «ني»", "gna gno gni gnu", "araignée baignoire magnifique"),
]


def house_keys():
    return [k for r in ROOMS for k in [x[0] for x in WD.HOUSE[r]]]


def maison_acts_1(lid):
    rng = random.Random(lid)
    hk = house_keys()
    fill = [("buffet", "Un", "uet", "ueta", "buffet"), ("chambre", "Une", "amb", "ambo", "chambre"), ("baignoire", "Une", "aign", "aigno", "baignoire"),
            ("canapé", "Un", "ana", "anao", "canape"), ("placard", "Un", "aad", "aado", "placard"), ("douche", "Une", "ouc", "ouca", "douche"),
            ("lampe", "Une", "amp", "ampo", "lampe"), ("réfrigérateur", "Un", "éigeur", "éigeuro", "refrigerateur"), ("lave-linge", "Un", "ing", "inga", "lave_linge"),
            ("bureau", "Un", "eau", "eauo", "bureau"), ("miroir", "Un", "oir", "oira", "miroir"), ("four", "Un", "our", "oura", "four"),
            ("téléviseur", "Un", "iseur", "iseuro", "televiseur"), ("évier", "Un", "ier", "iera", "evier"), ("armoire", "Une", "oire", "oirea", "armoire"),
            ("lit", "Un", "it", "ita", "lits"), ("fauteuil", "Un", "euil", "euila", "fauteuil")]
    return [
        reading(lid + "-observe", "J'observe et j'écoute : la maison", "أشاهد وأستمع: البيت", ROOM_INTRO, "🏠", 10),
        fl(lid + "-rooms", ROOMS, "Les pièces de la maison", "غرف البيت"),
        fl(lid + "-salon", [x[0] for x in WD.HOUSE["salon"]] + [x[0] for x in WD.HOUSE["salle_a_manger"]], "Au salon et dans la salle à manger", "في الصالون وغرفة الطعام"),
        fl(lid + "-cuisine", [x[0] for x in WD.HOUSE["cuisine"]], "À la cuisine", "في المطبخ"),
        fl(lid + "-chambre", [x[0] for x in WD.HOUSE["chambre"]] + [x[0] for x in WD.HOUSE["salle_de_bain"]], "Dans la chambre et la salle de bain", "في غرفة النوم والحمّام"),
        phon(lid + "-phon", PHON4),
        match(lid + "-relie1", ["douche", "refrigerateur", "lampe", "evier", "four"]),
        match(lid + "-relie2", ["lave_linge", "baignoire", "lave_vaisselle", "miroir", "televiseur"]),
        fill_letters(lid + "-fill", rng.sample(fill, 10)),
        act(lid + "-sort", "sort", "Je range les meubles dans les pièces", "أرتّب الأثاث في الغرف", "Je mets chaque objet dans sa pièce.", "ضع كل شيء في غرفته الصحيحة.", 25,
            dict(bins=[dict(id=r, label=WD.label(r), ar=WD.W[r]["ar"], emoji=WD.W[r]["emoji"]) for r in ROOMS],
                 items=[dict(WD.card(k), bin=WD.W[k]["room"]) for k in rng.sample(hk, 12)])),
    ]


def maison_acts_2(lid):
    return [
        pick(lid + "-intrus1", "Je barre l'intrus : le salon", "أشطب الدخيل: الصالون", [("canape", False), ("evier", True), ("fauteuil", False), ("televiseur", False)],
             "Un objet n'est pas dans le salon : je le touche.", "شيء واحد ليس في الصالون: المسه."),
        pick(lid + "-intrus2", "Je barre l'intrus : la cuisine", "أشطب الدخيل: المطبخ", [("lits", True), ("refrigerateur", False), ("four", False), ("placard", False)],
             "Un objet n'est pas dans la cuisine : je le touche.", "شيء واحد ليس في المطبخ: المسه."),
        pick(lid + "-intrus3", "Je barre l'intrus : la chambre", "أشطب الدخيل: غرفة النوم", [("baignoire", True), ("lits", False), ("lampe", False), ("bureau", False)],
             "Un objet n'est pas dans la chambre : je le touche.", "شيء واحد ليس في غرفة النوم: المسه."),
        pick(lid + "-intrus4", "Je barre l'intrus : la salle de bain", "أشطب الدخيل: الحمّام", [("douche", False), ("bureau", True), ("baignoire", False), ("miroir", False)],
             "Un objet n'est pas dans la salle de bain : je le touche.", "شيء واحد ليس في الحمّام: المسه."),
        mcq(lid + "-mauvaise", "Je coche la mauvaise réponse", "أختار الإجابة الخاطئة", [
            ("Dans le salon, il y a…", ["un canapé", "un téléviseur", "des chaises"], "des chaises", dict(ar="أي شيء ليس في الصالون؟")),
            ("Dans la salle à manger, il y a…", ["une grande table", "un canapé", "un buffet"], "un canapé", dict(ar="أي شيء ليس في غرفة الطعام؟")),
            ("L'évier se trouve dans…", ["la cuisine", "le salon", "la salle de bain"], "le salon", dict(ar="أين لا يوجد الحوض؟ (اختر الخطأ)")),
            ("Dans la salle de bain, il y a…", ["un lavabo", "un buffet", "un miroir"], "un buffet", dict(ar="أي شيء ليس في الحمّام؟")),
        ], 15, "Attention : je touche la réponse FAUSSE.", "انتبه: المس الإجابة الخاطئة!"),
        fill_word(lid + "-trouve", "Où se trouve… ?", "أين يوجد…؟", ["le salon", "la cuisine", "la salle à manger", "la chambre", "la salle de bain"], [
            ("L'évier se trouve dans ___.", "la cuisine"), ("La table de nuit se trouve dans ___.", "la chambre"), ("La baignoire se trouve dans ___.", "la salle de bain"),
            ("Le buffet se trouve dans ___.", "la salle à manger"), ("Le canapé se trouve dans ___.", "le salon")]),
        fill_word(lid + "-complete", "Je complète les phrases", "أُكمل الجمل", ["Au", "un", "canapé", "cuisine", "placards", "lits"], [
            ("___ salon, il y a un fauteuil et un canapé.", "Au", dict(ar="في الصالون…")), ("À la ___, il y a un four et des placards.", "cuisine"),
            ("Dans la chambre, il y a deux ___.", "lits"), ("Au salon, il y a un fauteuil et un ___.", "canapé")]),
        tf(lid + "-vf", [("Dans la salle de bain, il y a deux lits.", False, "في الحمّام سريران"), ("Dans l'armoire, il y a la cuisine.", False, "في الخزانة يوجد المطبخ"),
                         ("Dans la salle à manger, il y a un buffet.", True, "في غرفة الطعام بوفيه"), ("Dans la chambre, il y a un four.", False, "في غرفة النوم فرن"),
                         ("Au salon, il y a une table de nuit.", False, "في الصالون منضدة سرير"), ("À la cuisine, il y a un évier.", True, "في المطبخ حوض")]),
        dictee(lid + "-dictee", ["Dans la maison de Marie, il y a un chat qui s'appelle Mistou.", "Au salon, il y a un canapé et un fauteuil.",
                                 "Marie se lave dans la baignoire de la salle de bain.", "Mistou dort sur le lit de Marie.", "La maman de Marie prépare un gâteau dans la cuisine."]),
        act(lid + "-memory", "memory", "Mémory de la maison", "ذاكرة البيت", "Je retrouve les paires.", "ابحث عن كل شيء وكلمته.", 15,
            dict(pairs=[WD.card(k) for k in ["canape", "four", "lits", "baignoire", "lampe", "miroir"]])),
        speak(lid + "-speak", "Qu'y a-t-il dans ta maison ?", "ماذا يوجد في بيتك؟", [("Dans ma cuisine, il y a un four.", "في مطبخي يوجد فرن.", "il y a un four"),
                                                                        ("Dans mon salon, il y a un canapé.", "في صالوني توجد كنبة.", "il y a un canapé"),
                                                                        ("Dans ma chambre, il y a un lit.", "في غرفتي يوجد سرير.", "il y a un lit")]),
        reading(lid + "-comptine", "La comptine : Ma maison", "أنشودة: بيتي", [("Je fais le tour de ma maison", "أدور حول بيتي (نمرّر الإصبع حول وجه الطفل)"),
                 ("Je ferme les volets", "أغلق النوافذ (نلمس الجفنين)"), ("Je descends l'escalier", "أنزل السلّم (نمرّر الإصبع على الأنف)"),
                 ("Je ferme la porte", "أغلق الباب (نلمس الفم)"), ("Et je tourne la clé", "وأُدير المفتاح (نضغط الأنف برفق)")], "🏠"),
        act(lid + "-draw", "draw", "Je dessine le mobilier de mon salon", "أرسم أثاث صالوني", "Je dessine un canapé, un fauteuil, une table, un téléviseur.", "ارسم كنبة وكرسياً وطاولة وتلفازاً.", 10, dict(prompt="Mon salon")),
    ]


def maison_lesson():
    lid = "u2-maison"
    return lesson(lid, "Chapitre 4", "La maison", "البيت", "🏠", maison_acts_1(lid) + maison_acts_2(lid))


# ---------------------------------------------------------------- Chapitre 5 : Grammaire (p.210-222)
MASC = ["papa", "chat", "garcon", "jour", "soir", "appetit", "gateau", "anniversaire", "cadeau", "salon", "lit", "placard", "canape", "fauteuil", "televiseur", "buffet", "bureau", "miroir", "four", "evier", "refrigerateur"]
FEM = ["maman", "maitresse", "fille", "journee", "soiree", "nuit", "rentree", "cuisine", "amie", "salle_a_manger", "salle_de_bain", "chambre", "armoire", "table_salon", "chaise", "television", "douche", "baignoire", "lampe", "souris", "maison", "famille"]


def gender_cards():
    out = [dict(kind="word", text="Masculin : Un – Le – L'", ar="مذكّر: نستخدم Un أو Le", emoji="👦", img=None, tts="Masculin : un, le"),
           dict(kind="word", text="Féminin : Une – La – L'", ar="مؤنث: نستخدم Une أو La", emoji="👧", img=None, tts="Féminin : une, la")]
    for k in ["chat", "gateau", "salon", "lit"]:
        c = WD.card(k); c.update(kind="word", tts=c["text"], ar=c["ar"] + " — مذكّر (un)"); out.append(c)
    for k in ["maitresse", "fille", "chambre", "lampe"]:
        c = WD.card(k); c.update(kind="word", tts=c["text"], ar=c["ar"] + " — مؤنث (une)"); out.append(c)
    return out


def grammaire_lesson():
    lid = "u2-grammaire"
    rng = random.Random(lid)
    sort_keys = ["souris", "chat", "salon", "chambre", "canape", "table_salon", "chaise", "armoire", "evier", "fille", "garcon", "lampe"]
    lela = [("maitresse", "La"), ("chat", "Le"), ("maison", "La"), ("papa", "Le"), ("maman", "La"), ("placard", "Le"), ("four", "Le"), ("lit", "Le"), ("bureau", "Le"), ("salle_de_bain", "La")]
    bon = [("Un bon ___ lit", "bon", "سرير جيد"), ("Une gentil___ maman", "gentille", "ماما لطيفة"), ("Une bon___ cuisine", "bonne", "مطبخ جيد"), ("Un bon ___ garçon", "bon", "ولد طيب"),
           ("Une gentil___ fille", "gentille", "بنت لطيفة"), ("Une bon___ douche", "bonne", "دُش جيد"), ("Un gentil ___ monsieur", "gentil", "سيد لطيف"), ("Un bon ___ lave-vaisselle", "bon", "غسالة جيدة"),
           ("Une gentil___ maitresse", "gentille", "معلّمة لطيفة"), ("Un bon ___ bureau", "bon", "مكتب جيد")]
    return lesson(lid, "Chapitre 5", "Grammaire", "القواعد", "📐", [
        act(lid + "-genre", "flashcards", "Le genre des noms : masculin ou féminin", "جنس الأسماء: مذكّر أم مؤنث", "J'écoute et je retiens.", "استمع وتذكّر: Un للمذكّر وUne للمؤنث.", 10, dict(cards=gender_cards())),
        act(lid + "-sort", "sort", "Un ou Une ? Je range les mots", "Un أم Une؟ أصنّف الكلمات", "Je mets chaque mot dans la bonne boite.", "ضع كل كلمة في الصندوق الصحيح.", 20,
            dict(bins=[dict(id="m", label="Un – Le", ar="مذكّر", emoji="👦"), dict(id="f", label="Une – La", ar="مؤنث", emoji="👧")],
                 items=[dict(WD.card(k, False), bin="m" if k in MASC else "f") for k in sort_keys])),
        fill_word(lid + "-lela", "Je complète avec Le ou La", "أُكمل بـ Le أو La", ["Le", "La"], [(f"___ {WD.W[k]['fr']}", a, dict(ar=WD.W[k]["ar"])) for k, a in lela], 20),
        mcq(lid + "-corrige", "Je corrige seulement les erreurs", "أصحّح الأخطاء فقط", [
            ("Un journée", ["Une journée", "Un journée", "Le journée"], "Une journée", dict(ar="ما الصحيح؟")), ("La nuit", ["La nuit", "Le nuit", "Un nuit"], "La nuit"),
            ("Une lavabo", ["Un lavabo", "Une lavabo", "La lavabo"], "Un lavabo"), ("L'armoire", ["L'armoire", "Le armoire", "Un armoire"], "L'armoire"),
            ("La réfrigérateur", ["Le réfrigérateur", "La réfrigérateur", "Une réfrigérateur"], "Le réfrigérateur"), ("Une lave-vaisselle", ["Un lave-vaisselle", "Une lave-vaisselle", "La lave-vaisselle"], "Un lave-vaisselle"),
            ("Un chaise", ["Une chaise", "Un chaise", "Le chaise"], "Une chaise"), ("La fauteuil", ["Le fauteuil", "La fauteuil", "Une fauteuil"], "Le fauteuil"),
        ], 20, "Je choisis la forme correcte.", "اختر الصيغة الصحيحة (بعضها صحيح أصلاً)."),
        act(lid + "-accord", "flashcards", "Bon / bonne – gentil / gentille", "bon / bonne – gentil / gentille", "J'écoute et je retiens.", "مع المؤنث نضيف -ne أو -le.", 10, dict(cards=[
            dict(kind="word", text="bon appétit · bon voyage · bon travail", ar="مذكّر: bon", emoji="👦", img=None, tts="bon appétit, bon voyage, bon travail"),
            dict(kind="word", text="bonne journée · bonne nuit · bonne rentrée", ar="مؤنث: bonne", emoji="👧", img=None, tts="bonne journée, bonne nuit, bonne rentrée"),
            dict(kind="word", text="gentil garçon · gentil chat · gentil papa", ar="مذكّر: gentil", emoji="😊", img=None, tts="gentil garçon, gentil chat, gentil papa"),
            dict(kind="word", text="gentille fille · gentille souris · gentille maman", ar="مؤنث: gentille", emoji="😊", img=None, tts="gentille fille, gentille souris, gentille maman")])),
        fill_word(lid + "-bon", "J'accorde bon et gentil", "أُطابق bon و gentil", ["bon", "bonne", "gentil", "gentille"], [(t, a, dict(ar=ar)) for t, a, ar in bon], 20),
        act(lid + "-pronoms", "flashcards", "Les pronoms : je – tu – il – elle", "الضمائر: أنا – أنت – هو – هي", "J'écoute et je répète.", "استمع وكرّر.", 10, dict(cards=[
            dict(kind="word", text="Moi, je m'appelle…", ar="أنا، اسمي…", emoji="🙋", img=None, tts="Moi, je m'appelle Yaseen."),
            dict(kind="word", text="Toi, tu t'appelles…", ar="أنت، اسمك…", emoji="🫵", img=None, tts="Toi, tu t'appelles Marie."),
            dict(kind="word", text="Lui, il s'appelle…", ar="هو، اسمه…", emoji="👦", img=None, tts="Lui, il s'appelle Bruno."),
            dict(kind="word", text="Elle, elle s'appelle…", ar="هي، اسمها…", emoji="👧", img=None, tts="Elle, elle s'appelle Annie.")])),
        match(lid + "-relie", [("Je", "m'appelle"), ("Tu", "t'appelles"), ("Il", "s'appelle"), ("Elle", "s'appelle Marie")], "Je relie le pronom et le verbe", "أصل الضمير بالفعل"),
        order(lid + "-questions", ["Comment s'appelle-t-il ?", "Comment t'appelles-tu ?", "Comment s'appelle-t-elle ?"], "Je mets en ordre pour poser des questions", "أرتّب الكلمات لأطرح سؤالاً"),
        order(lid + "-phrases", ["Bonjour, je m'appelle Mistou.", "La maman de Marie prépare un gâteau dans la cuisine.", "Le canapé se trouve dans le salon."],
              "Je forme des phrases : majuscule et point final", "أكوّن جملاً: حرف كبير في البداية ونقطة في النهاية", 20),
        fill_word(lid + "-interro", "Je complète avec Qui – Que – Où – Comment", "أُكمل بكلمة الاستفهام", ["Qui", "Que", "Où", "Comment"], [
            ("___ se trouve le canapé ? — Il se trouve dans le salon.", "Où"), ("___ a son anniversaire ? — C'est Marie.", "Qui"), ("___ fait la maman de Marie ? — Elle prépare un gâteau.", "Que"),
            ("___ s'appelle l'ami de Marie ? — Il s'appelle Bruno.", "Comment"), ("___ est Mistou ? — Il est dans la cuisine.", "Où"), ("___ fait Marie ? — Elle fête son anniversaire.", "Que"),
            ("___ vient à la fête ? — Les amis de Marie.", "Qui"), ("___ est le gâteau ? — Il est très bon.", "Comment")], 20),
        speak(lid + "-speak", "Je me présente avec une phrase complète", "أُعرّف بنفسي بجملة كاملة", [("Bonjour, je m'appelle Yaseen.", "صباح الخير، اسمي ياسين.", "je m'appelle"),
                                                                                       ("Je suis un garçon.", "أنا ولد.", "je suis un garçon"), ("Mon chat s'appelle Mistou.", "قطي اسمه ميستو.", "s'appelle mistou")]),
    ])


# ---------------------------------------------------------------- Chapitre 6 : Révision de l'unité 2 (p.223-233)
def revision_lesson():
    lid = "u2-revision"
    rng = random.Random(lid)
    un_une = rng.sample(MASC, 8) + rng.sample(FEM, 8)
    rng.shuffle(un_une)
    label_keys = ["refrigerateur", "placard", "four", "lave_vaisselle", "chaises", "bureau", "armoire", "lampe", "lavabo_sdb", "baignoire", "wc", "miroir", "douche", "lits"]
    labels = []
    for k in label_keys:
        ch = [WD.label(k)] + [WD.label(x) for x in rng.sample([x for x in label_keys if x != k], 2)]
        rng.shuffle(ch)
        labels.append(("Qu'est-ce que c'est ?", ch, WD.label(k), dict(emoji=WD.W[k]["emoji"], img=WD.pic(k)["img"], ar="ما هذا؟")))
    return lesson(lid, "Chapitre 6", "Révision de l'unité 2", "مراجعة الوحدة 2", "🎯", [
        reading(lid + "-read", "Je décris le dessin et je lis les phrases", "أصف الرسم وأقرأ الجمل", [
            ("Papa Éléphant est dans le salon avec maman Mistou et papa Mistou.", "بابا الفيل في الصالون مع ماما ميستو وبابا ميستو."),
            ("Papa Éléphant est sur le canapé avec maman Mistou. Papa Mistou est dans le fauteuil.", "بابا الفيل على الكنبة مع ماما ميستو. بابا ميستو في الكرسي ذي الذراعين."),
            ("Dans la cuisine, Maman Éléphant prépare le repas et un délicieux gâteau au chocolat.", "في المطبخ تُحضّر ماما الفيل الغداء وكعكة شوكولاتة لذيذة."),
            ("Bonjour. Je m'appelle Mistou. Je suis un chat. Et toi, comment t'appelles-tu ?", "صباح الخير. اسمي ميستو. أنا قط. وأنت، ما اسمك؟"),
            ("Bonjour Mistou. Moi, je m'appelle Bruno. Je suis un garçon et je suis l'ami de Marie.", "صباح الخير يا ميستو. أنا اسمي برونو. أنا ولد وأنا صديق ماري."),
            ("La maman de Marie prépare un bon gâteau d'anniversaire dans la cuisine.", "ماما ماري تُحضّر كعكة عيد ميلاد لذيذة في المطبخ."),
            ("Marie regarde la télévision dans le fauteuil du salon.", "ماري تشاهد التلفزيون في كرسي الصالون.")], "🐘", 15),
        fill_word(lid + "-souhaits", "Je complète avec le bon souhait", "أُكمل بالتحية المناسبة", ["Bonjour", "Salut", "Bonne rentrée", "Bonne nuit", "Bonsoir", "Bon travail", "Bon appétit", "Bon voyage"], [
            ("Annie rencontre Bruno dans la cour. « ___ Bruno ! »", "Salut", dict(ar="آني تقابل برونو في الفناء")), ("Marie se réveille. « ___ Marie ! » dit Mistou.", "Bonjour", dict(ar="ماري تستيقظ")),
            ("C'est le jour de la rentrée. « ___ ! » dit Madame Simone à ses élèves.", "Bonne rentrée", dict(ar="يوم العودة إلى المدرسة")), ("Papa part en voyage. « ___ Papa ! » dit Marie.", "Bon voyage", dict(ar="بابا يسافر")),
            ("Le soleil se couche. « ___ Mistou ! » dit Marie.", "Bonsoir", dict(ar="الشمس تغرب")), ("Marie déjeune chez Annie. « ___ ! » dit la maman d'Annie.", "Bon appétit", dict(ar="ماري تتغدى عند آني")),
            ("Bruno fait ses leçons. « ___ Bruno ! » dit Annie.", "Bon travail", dict(ar="برونو يذاكر")), ("Marie a sommeil, il est tard. « ___ Marie ! » dit Maman.", "Bonne nuit", dict(ar="ماري نعسانة والوقت متأخر"))], 20),
        mcq(lid + "-questions", "Je réponds aux questions", "أجيب عن الأسئلة", [
            ("Que fait maman Éléphant ?", ["Elle prépare le repas et un gâteau.", "Elle regarde la télévision.", "Elle dort."], "Elle prépare le repas et un gâteau.", dict(ar="ماذا تفعل ماما الفيل؟")),
            ("Où est papa Mistou ?", ["Il est dans le fauteuil.", "Il est dans la cuisine.", "Il est dans la chambre."], "Il est dans le fauteuil.", dict(ar="أين بابا ميستو؟")),
            ("Où sont papa Éléphant et maman Mistou ?", ["Ils sont sur le canapé.", "Ils sont dans la salle de bain.", "Ils sont à l'école."], "Ils sont sur le canapé.", dict(ar="أين بابا الفيل وماما ميستو؟")),
            ("Qui est Bruno ?", ["C'est l'ami de Marie.", "C'est un chat.", "C'est la maitresse."], "C'est l'ami de Marie.", dict(ar="من هو برونو؟")),
        ]),
        mcq(lid + "-unune", "Un ou Une ? (rapide !)", "Un أم Une؟ (بسرعة!)", [(WD.W[k]["fr"], ["Un", "Une"], "Un" if k in MASC else "Une", dict(ar=WD.W[k]["ar"], emoji=WD.W[k]["emoji"])) for k in un_une], 20,
            "Je choisis Un ou Une.", "اختر Un أو Une لكل كلمة."),
        mcq(lid + "-legende", "Je légende les dessins", "أسمّي الرسوم", labels, 20, "Je regarde l'image et je choisis le mot.", "انظر إلى الصورة واختر الكلمة."),
        order(lid + "-phrases", ["Comment s'appelle ton chat ?", "Le canapé est dans le salon.", "Dans la maison, il y a cinq pièces.", "Qui prépare le gâteau ?", "C'est le cadeau de Marie."],
              "Je construis des phrases", "أكوّن جملاً", 20),
        act(lid + "-memory", "memory", "Grand Mémory", "الذاكرة الكبيرة", "Je retrouve les paires.", "ابحث عن الأزواج.", 20,
            dict(pairs=[WD.card(k) for k in ["chat", "gateau", "cadeau", "maitresse", "canape", "baignoire", "lampe", "salon"]])),
    ])


def build():
    lessons = [story_lesson(), salutations_lesson(), crocodiles_lesson(), prenoms_lesson(), questions_lesson(), michel_lesson(), maison_lesson(), grammaire_lesson(), revision_lesson()]
    return dict(id="u2", title="Unité 2 : Marie et le chat Mistou", title_ar="الوحدة 2: ماري والقط ميستو", color="#ab47bc", icon="🐱",
                desc_ar="التحيات، التعريف بالنفس، طرح الأسئلة، غرف البيت والقواعد الأساسية.", desc_fr="Saluer, se présenter, poser des questions, la maison et la grammaire.", lessons=lessons)
