#!/usr/bin/env python3
"""5. Sınıf Unit 1 "My Day" — kapsamlı vocabulary testi üreticisi.

Kaynaklar:
  - Unit1_My_Day/03_vocabulary.py  (Daily routines 28, Times 15, Body 20)
  - 5_Sinif_Vocabulary_Listeleri.docx Unit 1 (Times, Body 25, Verbs 49, Extra 26)

Her kelime TAM BİR kez soru olur (kapsam garantisi). Seçenekler aynı gruptan
gelir; aynı Türkçe karşılığa sahip iki kelime aynı soruda seçenek olamaz.
Doğru cevaplar A/B/C/D arasında dengeli dağıtılır (seed=7).
"""
import json
import random
from pathlib import Path

OUT = Path(__file__).parent / "ws-grade5-unit1-vocabulary.spec.json"
SEED = 7

# ── Kaynak listelerin birleşimi (çakışanlar tekleştirildi) ──────────────
ROUTINES = [
    ("wake up", "uyanmak"), ("get up", "yataktan kalkmak"),
    ("have breakfast", "kahvaltı yapmak"), ("have lunch", "öğle yemeği yemek"),
    ("have dinner", "akşam yemeği yemek"), ("brush teeth", "diş fırçalamak"),
    ("wash face", "yüz yıkamak"), ("wash hands", "el yıkamak"),
    ("get dressed", "giyinmek"), ("go to school", "okula gitmek"),
    ("go to bed", "yatağa gitmek"), ("come home", "eve gelmek"),
    ("do homework", "ödev yapmak"), ("watch TV", "TV izlemek"),
    ("take a shower", "duş almak"), ("take a bath", "banyo yapmak"),
    ("read a book", "kitap okumak"), ("listen to music", "müzik dinlemek"),
    ("play with friends", "arkadaşlarla oynamak"), ("go to sleep", "uyumaya gitmek"),
    ("have a rest", "dinlenmek"), ("feed the pet", "evcil hayvanı beslemek"),
    ("tidy the room", "odayı toplamak"), ("comb hair", "saç taramak"),
    ("leave home", "evden çıkmak"), ("start school", "okulun başlaması"),
    ("finish school", "okulun bitmesi"), ("do exercise", "egzersiz yapmak"),
]

TIMES = [
    ("o'clock", "saat (tam)"), ("half past", "buçuk"), ("quarter past", "çeyrek geçe"),
    ("quarter to", "çeyrek kala"), ("a.m.", "öğleden önce"), ("p.m.", "öğleden sonra"),
    ("noon / midday", "öğle"), ("midnight", "gece yarısı"), ("morning", "sabah"),
    ("afternoon", "öğleden sonra (günün bölümü)"), ("evening", "akşam"),
    ("night", "gece"), ("early", "erken"), ("late", "geç"), ("exactly", "tam"),
    ("half", "yarım"), ("quarter", "çeyrek"), ("past", "geçe"), ("to", "kala"),
]

BODY = [
    ("head", "kafa / baş"), ("eyes", "gözler"), ("nose", "burun"), ("mouth", "ağız"),
    ("ear", "kulak"), ("hair", "saç"), ("face", "yüz"), ("tooth / teeth", "diş / dişler"),
    ("arm", "kol"), ("shoulder", "omuz"), ("leg", "bacak"), ("finger", "parmak (el)"),
    ("hand", "el"), ("toe", "ayak parmağı"), ("foot / feet", "ayak / ayaklar"),
    ("knee", "diz"), ("elbow", "dirsek"), ("back", "sırt"), ("neck", "boyun"),
    ("brain", "beyin"), ("bone", "kemik"), ("muscles", "kaslar"), ("skin", "deri"),
    ("tongue", "dil (organ)"), ("blood", "kan"), ("stomach", "karın / mide"),
]

VERBS = [
    ("play", "oynamak"), ("speak", "konuşmak"), ("jump", "zıplamak"), ("fly", "uçmak"),
    ("swim", "yüzmek"), ("climb", "tırmanmak"), ("talk", "sohbet etmek"),
    ("read", "okumak"), ("write", "yazmak"), ("eat", "yemek"), ("drink", "içmek"),
    ("go", "gitmek"), ("come", "gelmek"), ("watch", "izlemek"), ("wash", "yıkamak"),
    ("clean", "temizlemek"), ("buy", "satın almak"), ("sleep", "uyumak"),
    ("do", "yapmak"), ("have", "sahip olmak"), ("make", "üretmek / yapmak"),
    ("sit", "oturmak"), ("laugh", "gülmek"), ("drive", "araç sürmek"),
    ("brush", "fırçalamak"), ("wear", "giymek"), ("put on", "üstüne giymek"),
    ("listen", "dinlemek"), ("wait", "beklemek"), ("look", "bakmak"),
    ("carry", "taşımak"), ("work", "çalışmak"), ("walk", "yürümek"), ("run", "koşmak"),
    ("dance", "dans etmek"), ("sing", "şarkı söylemek"), ("open", "açmak"),
    ("close", "kapatmak"), ("stand up", "ayağa kalkmak"), ("sit down", "oturmak (emir)"),
    ("give", "vermek"), ("take", "almak"), ("colour", "boyamak"), ("draw", "çizmek"),
    ("come in", "içeri girmek"), ("match", "eşleştirmek"), ("ride", "binmek"),
    ("sneeze", "aksırmak"),
]

EXTRA = [
    ("ready", "hazır"), ("kind", "nazik"), ("best", "en iyi"), ("same", "aynı"),
    ("together", "birlikte"), ("story", "hikâye"), ("noise", "gürültü"),
    ("quiet", "sessiz"), ("outside", "dışarı"), ("inside", "içeride"),
    ("coat", "palto"), ("bag", "çanta"), ("book", "kitap"), ("desk", "sıra"),
    ("lesson", "ders"), ("class", "sınıf"), ("school", "okul"), ("home", "ev"),
    ("house", "ev (bina)"), ("room", "oda"), ("table", "masa"), ("bed", "yatak"),
    ("door", "kapı"), ("window", "pencere"), ("bus", "otobüs"),
]

SECTIONS = [
    ("Part A — Daily Routines (Günlük Rutinler)", ROUTINES),
    ("Part B — Times (Zaman)", TIMES),
    ("Part C — Body Parts (Vücut Bölümleri)", BODY),
    ("Part D — Verbs (Fiiller)", VERBS),
    ("Part E — Extra Vocabulary (Ek Kelimeler)", EXTRA),
]

LETTERS = ["A", "B", "C", "D"]


def main():
    rng = random.Random(SEED)

    # tüm kelimeler (kapsam kontrolü için)
    all_pairs = [p for _, lst in SECTIONS for p in lst]
    engs = [e for e, _ in all_pairs]
    assert len(engs) == len(set(engs)), f"tekrar eden kelime: {[x for x in engs if engs.count(x)>1]}"
    n_total = len(all_pairs)

    # doğru cevap harflerini tam dengeli dağıt
    q, r = divmod(n_total, 4)
    targets = LETTERS * q + LETTERS[:r]
    rng.shuffle(targets)
    t_it = iter(targets)

    blocks = []
    for title, words in SECTIONS:
        blocks.append({"type": "section", "text": title})
        blocks.append({"type": "instructions",
                       "text": "Choose the correct Turkish meaning."})
        for eng, tr in words:
            # distractor: aynı gruptan, aynı Türkçe karşılığa sahip olmayan, birbirinden farklı
            pool = [(e, t) for e, t in words
                    if e != eng and t != tr and t != "" ]
            rng.shuffle(pool)
            chosen, used = [], {tr}
            for e, t in pool:
                if t not in used:
                    chosen.append((e, t))
                    used.add(t)
                if len(chosen) == 3:
                    break
            assert len(chosen) == 3, f"{eng} için 3 çeldirici bulunamadı"

            letter = next(t_it)
            idx = LETTERS.index(letter)
            opts = [None] * 4
            opts[idx] = tr
            rest = [t for _, t in chosen]
            rng.shuffle(rest)
            for j in range(4):
                if opts[j] is None:
                    opts[j] = rest.pop()
            assert len(set(opts)) == 4, f"{eng} seçenekleri tekrarlı: {opts}"

            longest = max(len(o) for o in opts)
            blocks.append({
                "type": "mcq",
                "question": eng,
                "options": opts,
                "layout": "stack" if longest > 24 else "grid2",
                "answer": letter,
            })
        if title != SECTIONS[-1][0]:
            blocks.append({"type": "page_break"})

    spec = {
        "title": "Unit 1 — Vocabulary Test",
        "subtitle": ("Grade 5 — Unit 1 \"My Day\" | All Unit Words | "
                     f"{n_total} Questions | Daily Routines · Times · Body Parts · Verbs · Extra"),
        "meta": {
            "font": "Calibri", "base_size": 11, "paper": "A4", "orientation": "portrait",
            "margins": {"top": 1.4, "bottom": 1.4, "left": 1.9, "right": 1.9},
            "name_fields": True, "score_field": True,
            "header_left": "Serdarli Primary School", "header_right": "English — Grade 5",
            "footer_text": "Unit 1 'My Day' — Vocabulary Test",
            "answer_key": "separate", "lang": "en",
            "accent": "1A559E", "callout_fill": "FDF3E3",
            "example_fill": "F0F6EF", "header_fill": "E4EBF6",
        },
        "blocks": blocks,
    }
    OUT.write_text(json.dumps(spec, ensure_ascii=False, indent=1), encoding="utf-8")
    print(f"yazildi: {OUT}")
    print(f"toplam soru: {n_total}")
    for title, words in SECTIONS:
        print(f"  {title}: {len(words)}")


if __name__ == "__main__":
    main()
