# -*- coding: utf-8 -*-
"""Levels and badges (server side, also sent to the client for display)."""

LEVELS = [  # (xp needed, French name, Arabic name, emoji) - spread over ~6000 points in the whole curriculum
    (0, "Petit chaton", "قُطيط صغير", "🐱"), (100, "Chat curieux", "قط فضولي", "🧐"), (250, "Chat malin", "قط ذكي", "😺"),
    (500, "Chat lecteur", "قط قارئ", "📖"), (850, "Chat écrivain", "قط كاتب", "✏️"), (1300, "Chat chanteur", "قط مغنٍّ", "🎵"),
    (1850, "Chat explorateur", "قط مستكشف", "🧭"), (2500, "Chat savant", "قط عالِم", "🎓"), (3200, "Chat champion", "قط بطل", "🏅"),
    (4000, "Chat magicien", "قط ساحر", "🪄"), (4900, "Chat super-héros", "القط الخارق", "🦸"), (5800, "Chat Mistou", "القط ميستو", "👑"),
]


# ranks for ages 10-12: a journey of missions instead of the kitten story
JUNIOR = [
    (0, "Débutant", "مبتدئ", "🎒"), (150, "Apprenti", "متدرّب", "📘"), (400, "Explorateur", "مستكشف", "🧭"),
    (750, "Voyageur", "رحّالة", "🗺️"), (1200, "Aventurier", "مغامر", "🏕️"), (1750, "Navigateur", "ملّاح", "⛵"),
    (2400, "Stratège", "مخطِّط", "♟️"), (3150, "Expert", "خبير", "🎯"), (4000, "Champion", "بطل", "🏆"),
    (5000, "Maître", "أستاذ", "🎓"), (6200, "Légende", "أسطورة", "👑"),
]
RANKS = {"kids": LEVELS, "junior": JUNIOR, "teen": JUNIOR}


def level_of(xp, band="kids"):
    table = RANKS.get(band, LEVELS)
    lvl = 1
    for i, (need, *_rest) in enumerate(table):
        if xp >= need:
            lvl = i + 1
    cur = table[lvl - 1]
    nxt = table[lvl][0] if lvl < len(table) else None
    return dict(level=lvl, name=cur[1], name_ar=cur[2], emoji=cur[3], xp=xp, next_xp=nxt, cur_xp=cur[0],
                pct=100 if nxt is None else round((xp - cur[0]) * 100 / (nxt - cur[0])))


BADGES = [
    dict(id="first", emoji="🌟", fr="Premier pas", ar="أول خطوة", desc_ar="أكملت أول نشاط", desc_fr="Tu as fini ta première activité"),
    dict(id="ten", emoji="🔟", fr="Dix activités", ar="عشرة أنشطة", desc_ar="أكملت 10 أنشطة", desc_fr="Tu as fini 10 activités"),
    dict(id="fifty", emoji="🎯", fr="Cinquante activités", ar="خمسون نشاطاً", desc_ar="أكملت 50 نشاطاً", desc_fr="Tu as fini 50 activités"),
    dict(id="hundred", emoji="💯", fr="Cent activités", ar="مئة نشاط", desc_ar="أكملت 100 نشاط", desc_fr="Tu as fini 100 activités"),
    dict(id="perfect", emoji="💎", fr="Sans faute", ar="بدون أخطاء", desc_ar="نشاط كامل بلا خطأ", desc_fr="Une activité sans aucune faute"),
    dict(id="perfect10", emoji="👑", fr="Dix sans faute", ar="عشرة بلا أخطاء", desc_ar="10 أنشطة كاملة بلا خطأ", desc_fr="10 activités sans faute"),
    dict(id="stars30", emoji="⭐", fr="Trente étoiles", ar="ثلاثون نجمة", desc_ar="جمعت 30 نجمة", desc_fr="Tu as gagné 30 étoiles"),
    dict(id="stars100", emoji="🌠", fr="Cent étoiles", ar="مئة نجمة", desc_ar="جمعت 100 نجمة", desc_fr="Tu as gagné 100 étoiles"),
    dict(id="streak3", emoji="🔥", fr="Trois jours", ar="ثلاثة أيام متتالية", desc_ar="تعلّمت 3 أيام متتالية", desc_fr="3 jours de suite"),
    dict(id="streak7", emoji="🚀", fr="Une semaine", ar="أسبوع كامل", desc_ar="تعلّمت 7 أيام متتالية", desc_fr="7 jours de suite"),
    dict(id="lesson1", emoji="🎓", fr="Première leçon", ar="أول درس", desc_ar="أكملت درساً كاملاً", desc_fr="Tu as fini une leçon entière"),
    dict(id="abc", emoji="🔤", fr="A-B-C", ar="A-B-C", desc_ar="أكملت الحروف A إلى F", desc_fr="Tu as fini les lettres A à F", level=1),
    dict(id="alphabet", emoji="🏆", fr="Tout l'alphabet", ar="الأبجدية كاملة", desc_ar="أكملت كل حروف الوحدة 1", desc_fr="Tu as fini toutes les lettres de l'unité 1", level=1),
    dict(id="bonjour", emoji="👋", fr="Bonjour !", ar="التحيات", desc_ar="أكملت درس التحيات", desc_fr="Tu as fini la leçon des salutations", level=1),
    dict(id="maison", emoji="🏠", fr="Ma maison", ar="بيتي", desc_ar="أكملت درس المنزل", desc_fr="Tu as fini la leçon de la maison", level=1),
    dict(id="grammaire", emoji="📐", fr="Grammairien", ar="عالم القواعد", desc_ar="أكملت درس القواعد", desc_fr="Tu as fini la leçon de grammaire", level=1),
    dict(id="unit2", emoji="🎉", fr="Unité 2", ar="الوحدة 2", desc_ar="أكملت الوحدة 2 كاملة", desc_fr="Tu as fini toute l'unité 2", level=1),
    dict(id="singer", emoji="🎤", fr="Chanteur", ar="مغنٍّ", desc_ar="غنّيت أغنية كاملة", desc_fr="Tu as chanté une chanson entière", level=1),
    dict(id="extra", emoji="🧩", fr="Explorateur", ar="مستكشف", desc_ar="أكملت درساً إضافياً", desc_fr="Tu as fini une leçon en plus", level=1),
    dict(id="xp500", emoji="🥇", fr="500 points", ar="500 نقطة", desc_ar="جمعت 500 نقطة", desc_fr="Tu as gagné 500 points"),
    dict(id="xp1500", emoji="🏵️", fr="1500 points", ar="1500 نقطة", desc_ar="جمعت 1500 نقطة", desc_fr="Tu as gagné 1500 points"),
    # level 4 (age 11)
    dict(id="l4_ae", emoji="🧱", fr="Maître d'avoir et d'être", ar="سيد avoir وêtre", desc_ar="أكملت كل دروس avoir وêtre", desc_fr="Tu as fini avoir et être à tous les temps", level=4),
    dict(id="l4_g1", emoji="🔵", fr="As du 1er groupe", ar="بطل المجموعة الأولى", desc_ar="أكملت أفعال المجموعة الأولى", desc_fr="Tu as fini les verbes du 1er groupe", level=4),
    dict(id="l4_g2", emoji="🌿", fr="As du 2e groupe", ar="بطل المجموعة الثانية", desc_ar="أكملت أفعال المجموعة الثانية", desc_fr="Tu as fini les verbes du 2e groupe", level=4),
    dict(id="l4_av", emoji="🚀", fr="Aller-retour", ar="ذهاب وإياب", desc_ar="أكملت aller وvenir", desc_fr="Tu as fini aller et venir", level=4),
    dict(id="l4_g3", emoji="🧩", fr="Dompteur du 3e groupe", ar="مروّض المجموعة الثالثة", desc_ar="أكملت أفعال المجموعة الثالثة", desc_fr="Tu as fini les verbes du 3e groupe", level=4),
    dict(id="l4_conj", emoji="⚙️", fr="Mission Conjugaison", ar="مهمة التصريف", desc_ar="أنجزت مهمة التصريف كاملة", desc_fr="Tu as accompli toute la mission Conjugaison", level=4),
    dict(id="l4_gram", emoji="🧠", fr="Mission Grammaire", ar="مهمة القواعد", desc_ar="أنجزت مهمة القواعد كاملة", desc_fr="Tu as accompli toute la mission Grammaire", level=4),
    dict(id="l4_dial", emoji="💬", fr="Mission Dialogues", ar="مهمة الحوارات", desc_ar="أنجزت مهمة الحوارات كاملة", desc_fr="Tu as accompli toute la mission Dialogues", level=4),
    dict(id="l4_bilan", emoji="🏁", fr="Premier bilan", ar="أول مراجعة", desc_ar="أنهيت أول درس مراجعة", desc_fr="Tu as réussi ton premier bilan", level=4),
    dict(id="l4_speed", emoji="⚡", fr="Éclair", ar="البرق", desc_ar="حققت الهدف في تحدّي سرعة بلا خطأ", desc_fr="Un défi chrono parfait", level=4),
]


def lesson_done(progress, lesson):
    acts = lesson["activities"]
    return acts and all(progress.get(a["id"], {}).get("completed") for a in acts)


def badges_for(level):
    """The badges a kid of this course level can earn: the general ones plus that level's own."""
    return [b for b in BADGES if b.get("level") in (None, level)]


L4_GROUPS = {"l4_ae": range(1, 7), "l4_g1": range(7, 12), "l4_g2": range(12, 17), "l4_av": range(17, 22), "l4_g3": range(22, 30)}


def check_badges(st, progress, lessons_by_id, units, level=1):
    """Return the ids of all badges the kid qualifies for (the caller awards the new ones)."""
    want = set()
    if st["done"] >= 1: want.add("first")
    if st["done"] >= 10: want.add("ten")
    if st["done"] >= 50: want.add("fifty")
    if st["done"] >= 100: want.add("hundred")
    if st["perfect"] >= 1: want.add("perfect")
    if st["perfect"] >= 10: want.add("perfect10")
    if st["stars"] >= 30: want.add("stars30")
    if st["stars"] >= 100: want.add("stars100")
    if st["streak"] >= 3: want.add("streak3")
    if st["streak"] >= 7: want.add("streak7")
    if st["xp"] >= 500: want.add("xp500")
    if st["xp"] >= 1500: want.add("xp1500")
    done = {lid for lid, l in lessons_by_id.items() if lesson_done(progress, l)}
    if done: want.add("lesson1")
    if level == 4:
        for b, rng in L4_GROUPS.items():
            if all(f"l4-cj{n:02d}" in done for n in rng): want.add(b)
        for u, b in (("l4-u1", "l4_conj"), ("l4-u2", "l4_gram"), ("l4-u3", "l4_dial")):
            ls = next((x["lessons"] for x in units if x["id"] == u), None)
            if ls and all(l["id"] in done for l in ls): want.add(b)
        if any(lessons_by_id[l]["kind"] == "bilan" for l in done if l.startswith("l4-")): want.add("l4_bilan")
        speed = {a["id"] for l in lessons_by_id.values() if l["id"].startswith("l4-") for a in l["activities"] if a["type"] == "speed_round"}
        if any(progress.get(a, {}).get("best_pct") == 100 for a in speed): want.add("l4_speed")
        return want
    if {"u1-ab", "u1-cd", "u1-ef"} <= done: want.add("abc")
    u1 = [l["id"] for l in units[0]["lessons"] if not l["extra"]]
    if all(l in done for l in u1): want.add("alphabet")
    if "u2-salutations" in done: want.add("bonjour")
    if "u2-maison" in done: want.add("maison")
    if "u2-grammaire" in done: want.add("grammaire")
    u2 = [l["id"] for l in units[1]["lessons"] if not l["extra"]]
    if all(l in done for l in u2): want.add("unit2")
    if any(lessons_by_id[l]["kind"] == "song" for l in done): want.add("singer")
    if any(lessons_by_id[l]["extra"] and lessons_by_id[l]["kind"] != "song" for l in done): want.add("extra")
    return want
