"""
Run with:  python seed.py
Creates initial exam types, subjects, sample exams with questions, and the superadmin.
"""
import sys
import os
sys.path.insert(0, os.path.dirname(__file__))

from app.database import SessionLocal, engine, Base
from app import models
from app.security import hash_password

Base.metadata.create_all(bind=engine)
db = SessionLocal()


def seed():
    # ── Exam types ─────────────────────────────────────────────────────────────
    if db.query(models.ExamType).count() == 0:
        en = models.ExamType(
            code="EN",
            name="Evaluarea Națională",
            description="Examen național pentru absolvenții clasei a VIII-a",
            grade_level=8,
        )
        bac = models.ExamType(
            code="BAC",
            name="Bacalaureat",
            description="Examen național pentru absolvenții clasei a XII-a",
            grade_level=12,
        )
        db.add_all([en, bac])
        db.flush()
        print("✓ Exam types seeded")
    else:
        en = db.query(models.ExamType).filter_by(code="EN").first()
        bac = db.query(models.ExamType).filter_by(code="BAC").first()

    # ── Subjects ───────────────────────────────────────────────────────────────
    if db.query(models.Subject).count() == 0:
        subjects = [
            models.Subject(name="Limba și Literatura Română", code="EN-RO", exam_type_id=en.id, is_mandatory=True),
            models.Subject(name="Matematică", code="EN-MA", exam_type_id=en.id, is_mandatory=True),
            models.Subject(name="Limba și Literatura Română", code="BAC-RO", exam_type_id=bac.id, is_mandatory=True),
            models.Subject(name="Matematică (Profil Real)", code="BAC-MA-REAL", exam_type_id=bac.id, profile="real"),
            models.Subject(name="Matematică (Profil Uman)", code="BAC-MA-UMAN", exam_type_id=bac.id, profile="uman"),
            models.Subject(name="Istorie", code="BAC-IS", exam_type_id=bac.id),
            models.Subject(name="Geografie", code="BAC-GEO", exam_type_id=bac.id),
            models.Subject(name="Biologie", code="BAC-BIO", exam_type_id=bac.id, profile="real"),
            models.Subject(name="Fizică", code="BAC-FIZ", exam_type_id=bac.id, profile="real"),
            models.Subject(name="Chimie", code="BAC-CHI", exam_type_id=bac.id, profile="real"),
        ]
        db.add_all(subjects)
        db.flush()
        print("✓ Subjects seeded")

    subj_en_ro = db.query(models.Subject).filter_by(code="EN-RO").first()
    subj_en_ma = db.query(models.Subject).filter_by(code="EN-MA").first()
    subj_bac_ro = db.query(models.Subject).filter_by(code="BAC-RO").first()
    subj_bac_ma = db.query(models.Subject).filter_by(code="BAC-MA-REAL").first()

    # ── Admin user ─────────────────────────────────────────────────────────────
    if db.query(models.Administrator).count() == 0:
        admin = models.Administrator(
            email="admin@simulariexamen.ro",
            password_hash=hash_password("Admin123!"),
            first_name="Super",
            last_name="Admin",
            role="superadmin",
        )
        db.add(admin)
        db.flush()
        print("✓ Admin seeded: admin@simulariexamen.ro / Admin123!")
    else:
        admin = db.query(models.Administrator).first()

    # ── Sample Exams ───────────────────────────────────────────────────────────
    if db.query(models.Exam).count() == 0:
        _create_en_ro_exam(db, subj_en_ro, en.id, admin.id)
        _create_en_ma_exam(db, subj_en_ma, en.id, admin.id)
        _create_bac_ro_exam(db, subj_bac_ro, bac.id, admin.id)
        _create_bac_ma_exam(db, subj_bac_ma, bac.id, admin.id)
        print("✓ Sample exams seeded")

    db.commit()
    print("\n✅ Seed complete!")


def _q(text, q_type, points, order, options=None):
    """Helper to build question + options dicts."""
    return {"text": text, "type": q_type, "points": points, "order": order, "options": options or []}


def _opt(label, text, correct):
    return {"label": label, "text": text, "correct": correct}


def _create_exam(db, title, subject_id, exam_type_id, admin_id, year, duration, total_points, instructions, questions_data):
    exam = models.Exam(
        title=title,
        subject_id=subject_id,
        exam_type_id=exam_type_id,
        year=year,
        duration_minutes=duration,
        total_points=total_points,
        instructions=instructions,
        created_by=admin_id,
        is_published=True,
    )
    db.add(exam)
    db.flush()

    for i, qd in enumerate(questions_data, 1):
        q = models.Question(
            exam_id=exam.id,
            question_number=i,
            question_type=qd["type"],
            question_text=qd["text"],
            points=qd["points"],
            order_index=qd["order"],
        )
        db.add(q)
        db.flush()
        for opt in qd.get("options", []):
            db.add(models.QuestionOption(
                question_id=q.id,
                option_label=opt["label"],
                option_text=opt["text"],
                is_correct=opt["correct"],
            ))


def _create_en_ro_exam(db, subject, exam_type_id, admin_id):
    instructions = (
        "Citiți cu atenție textul următor și răspundeți la întrebări. "
        "Fiecare întrebare are o singură variantă corectă de răspuns. "
        "Timp de lucru: 2 ore. Punctaj maxim: 100 puncte (90 puncte + 10 din oficiu)."
    )
    questions = [
        _q("Care este figura de stil din versul: «Lacul codrilor albastru / Nuferi galbeni îl încarcă»?",
           "multiple_choice", 10, 1, [
               _opt("A", "Personificare", False),
               _opt("B", "Epitet cromatic", True),
               _opt("C", "Metaforă", False),
               _opt("D", "Comparație", False),
           ]),
        _q("Sinonimul contextual al cuvântului «trudă» în expresia «trudă necontenită» este:",
           "multiple_choice", 10, 2, [
               _opt("A", "odihnă", False),
               _opt("B", "efort", True),
               _opt("C", "bucurie", False),
               _opt("D", "speranță", False),
           ]),
        _q("Textul «Ion» de Liviu Rebreanu aparține genului:",
           "multiple_choice", 10, 3, [
               _opt("A", "Liric", False),
               _opt("B", "Dramatic", False),
               _opt("C", "Epic", True),
               _opt("D", "Didactic", False),
           ]),
        _q("Verbul «a citi» la modul conjunctiv, timpul prezent, persoana I plural este:",
           "multiple_choice", 10, 4, [
               _opt("A", "citisem", False),
               _opt("B", "să citim", True),
               _opt("C", "citind", False),
               _opt("D", "citit", False),
           ]),
        _q("Care dintre următoarele propoziții conține o propoziție subiectivă?",
           "multiple_choice", 10, 5, [
               _opt("A", "El merge la școală.", False),
               _opt("B", "Este important să studiezi.", True),
               _opt("C", "Cartea este interesantă.", False),
               _opt("D", "Mă gândesc la vacanță.", False),
           ]),
        _q("Tema poeziei «Luceafărul» de Mihai Eminescu este:",
           "multiple_choice", 10, 6, [
               _opt("A", "Iubirea neîmplinită și condiția geniului", True),
               _opt("B", "Vitejia ostașilor", False),
               _opt("C", "Frumusețea naturii", False),
               _opt("D", "Dorința de aventură", False),
           ]),
        _q("Identificați propoziția în care «de» este prepoziție (nu conjuncție):",
           "multiple_choice", 10, 7, [
               _opt("A", "Nu știu de a venit.", False),
               _opt("B", "Cartea de pe masă este a mea.", True),
               _opt("C", "Mă întreb de s-a terminat.", False),
               _opt("D", "Îl anunț de vine.", False),
           ]),
        _q("Cuvântul «neașteptat» este format prin procedeul:",
           "multiple_choice", 10, 8, [
               _opt("A", "Compunere", False),
               _opt("B", "Conversiune", False),
               _opt("C", "Derivare cu prefix", True),
               _opt("D", "Abreviere", False),
           ]),
        _q("Propoziția «Studentul care a câștigat premiul este colegul meu» conține o propoziție:",
           "multiple_choice", 10, 9, [
               _opt("A", "Predicativă", False),
               _opt("B", "Relativă atributivă", True),
               _opt("C", "Completivă directă", False),
               _opt("D", "Circumstanțială de loc", False),
           ]),
        _q("Scrieți câteva rânduri despre un personaj literar care v-a impresionat și motivați alegerea.",
           "open_ended", 10, 10, []),
    ]
    _create_exam(db, "Simulare EN – Limba și Literatura Română 2024", subject.id,
                 exam_type_id, admin_id, 2024, 120, 100, instructions, questions)


def _create_en_ma_exam(db, subject, exam_type_id, admin_id):
    instructions = (
        "Rezolvați toate cerințele. Scrieți rezolvarea completă pentru fiecare exercițiu. "
        "Se acordă 10 puncte din oficiu. Timp de lucru: 2 ore."
    )
    questions = [
        _q("Calculați: 2⁴ + 3² − 5 = ?", "multiple_choice", 10, 1, [
            _opt("A", "20", False),
            _opt("B", "22", True),
            _opt("C", "18", False),
            _opt("D", "24", False),
        ]),
        _q("Dacă x − 7 = 15, atunci x este egal cu:", "multiple_choice", 10, 2, [
            _opt("A", "8", False),
            _opt("B", "21", False),
            _opt("C", "22", True),
            _opt("D", "105", False),
        ]),
        _q("Care este cel mai mare număr de două cifre divizibil cu 9?", "multiple_choice", 10, 3, [
            _opt("A", "90", False),
            _opt("B", "99", True),
            _opt("C", "91", False),
            _opt("D", "81", False),
        ]),
        _q("Aria unui dreptunghi cu lungimea de 12 cm și lățimea de 5 cm este:", "multiple_choice", 10, 4, [
            _opt("A", "34 cm²", False),
            _opt("B", "60 cm²", True),
            _opt("C", "17 cm²", False),
            _opt("D", "70 cm²", False),
        ]),
        _q("Suma unghiurilor unui triunghi este:", "multiple_choice", 10, 5, [
            _opt("A", "90°", False),
            _opt("B", "270°", False),
            _opt("C", "360°", False),
            _opt("D", "180°", True),
        ]),
        _q("Care este ecuația dreptei care trece prin originea axelor și are panta 3?", "multiple_choice", 10, 6, [
            _opt("A", "y = x + 3", False),
            _opt("B", "y = 3x", True),
            _opt("C", "y = 3", False),
            _opt("D", "x = 3", False),
        ]),
        _q("Dacă un triunghi dreptunghic are catetele de 3 cm și 4 cm, ipotenuza este:", "multiple_choice", 10, 7, [
            _opt("A", "7 cm", False),
            _opt("B", "6 cm", False),
            _opt("C", "5 cm", True),
            _opt("D", "25 cm", False),
        ]),
        _q("Câte numere prime sunt mai mici decât 20?", "multiple_choice", 10, 8, [
            _opt("A", "6", False),
            _opt("B", "7", False),
            _opt("C", "8", True),
            _opt("D", "9", False),
        ]),
        _q("Simplificați fracția 36/48:", "multiple_choice", 10, 9, [
            _opt("A", "3/4", True),
            _opt("B", "4/5", False),
            _opt("C", "2/3", False),
            _opt("D", "6/7", False),
        ]),
        _q("Rezolvați ecuația: 2x + 4 = 14", "open_ended", 10, 10, []),
    ]
    _create_exam(db, "Simulare EN – Matematică 2024", subject.id,
                 exam_type_id, admin_id, 2024, 120, 100, instructions, questions)


def _create_bac_ro_exam(db, subject, exam_type_id, admin_id):
    instructions = (
        "Subiectul I conține un text narativ/liric și cerințe de înțelegere și interpretare. "
        "Subiectul al II-lea testează cunoștințe de limbă română. "
        "Subiectul al III-lea constă în redactarea unui eseu. "
        "Timp de lucru: 3 ore. Se acordă 10 puncte din oficiu."
    )
    questions = [
        _q("Genul literar al romanului «Moromeții» de Marin Preda este:", "multiple_choice", 10, 1, [
            _opt("A", "Liric", False),
            _opt("B", "Dramatic", False),
            _opt("C", "Epic", True),
            _opt("D", "Didactic", False),
        ]),
        _q("Figurile de stil din versul «Și luna, singuratică, veghează-n înălțimi» sunt:", "multiple_choice", 10, 2, [
            _opt("A", "Comparație și metaforă", False),
            _opt("B", "Personificare și epitet", True),
            _opt("C", "Hiperbola și antiteză", False),
            _opt("D", "Aliterație și asonanță", False),
        ]),
        _q("Curentul literar căruia îi aparține opera lui Mihai Eminescu este:", "multiple_choice", 10, 3, [
            _opt("A", "Clasicismul", False),
            _opt("B", "Realismul", False),
            _opt("C", "Romantismul", True),
            _opt("D", "Modernismul", False),
        ]),
        _q("Care este valoarea morfologică a cuvântului subliniat: «Mersul pe jos este sănătos»?",
           "multiple_choice", 10, 4, [
            _opt("A", "Verb la participiu", False),
            _opt("B", "Substantiv provenit din verb la supin", True),
            _opt("C", "Adjectiv", False),
            _opt("D", "Adverb", False),
        ]),
        _q("Propoziția completivă directă răspunde la întrebările:", "multiple_choice", 10, 5, [
            _opt("A", "Cine? Ce?", False),
            _opt("B", "Pe cine? Ce?", True),
            _opt("C", "Cui? Căruia?", False),
            _opt("D", "Unde? Când?", False),
        ]),
        _q("Identificați tipul de relație sintactică în grupul nominal «o carte interesantă»:",
           "multiple_choice", 10, 6, [
            _opt("A", "Predicație", False),
            _opt("B", "Coordonare", False),
            _opt("C", "Subordonare (acord)", True),
            _opt("D", "Juxtapunere", False),
        ]),
        _q("Textul argumentativ trebuie să conțină obligatoriu:", "multiple_choice", 10, 7, [
            _opt("A", "Descrieri detaliate ale personajelor", False),
            _opt("B", "Teză, argumente și concluzie", True),
            _opt("C", "Dialoguri și monologuri", False),
            _opt("D", "Rime și ritmuri", False),
        ]),
        _q("Opera literară «O scrisoare pierdută» de I.L. Caragiale aparține genului:",
           "multiple_choice", 10, 8, [
            _opt("A", "Liric", False),
            _opt("B", "Epic", False),
            _opt("C", "Dramatic", True),
            _opt("D", "Memorialistic", False),
        ]),
        _q("Cuvântul «neputință» conține morfemele:", "multiple_choice", 10, 9, [
            _opt("A", "ne- (prefix) + putință (radical)", False),
            _opt("B", "ne- (prefix) + put- (radical) + -ință (sufix)", True),
            _opt("C", "ne- (prefix) + -putință (sufix)", False),
            _opt("D", "neputin- (radical) + -ță (desinență)", False),
        ]),
        _q("Redactați un eseu de minimum 400 de cuvinte în care să prezentați tema și viziunea despre lume dintr-un roman studiat.",
           "open_ended", 10, 10, []),
    ]
    _create_exam(db, "Simulare BAC – Limba și Literatura Română 2024", subject.id,
                 exam_type_id, admin_id, 2024, 180, 100, instructions, questions)


def _create_bac_ma_exam(db, subject, exam_type_id, admin_id):
    instructions = (
        "Toate subiectele sunt obligatorii. Se acordă 10 puncte din oficiu. "
        "Timp de lucru: 3 ore. Nu se utilizează materiale auxiliare."
    )
    questions = [
        _q("Mulțimea soluțiilor ecuației x² − 5x + 6 = 0 este:", "multiple_choice", 10, 1, [
            _opt("A", "{1, 6}", False),
            _opt("B", "{2, 3}", True),
            _opt("C", "{-2, -3}", False),
            _opt("D", "{5, -1}", False),
        ]),
        _q("Derivata funcției f(x) = 3x² − 2x + 1 este:", "multiple_choice", 10, 2, [
            _opt("A", "f′(x) = 6x + 2", False),
            _opt("B", "f′(x) = 6x − 2", True),
            _opt("C", "f′(x) = 3x − 2", False),
            _opt("D", "f′(x) = 6x", False),
        ]),
        _q("Limita lim(x→∞) (2x + 1) / (x − 3) este egală cu:", "multiple_choice", 10, 3, [
            _opt("A", "0", False),
            _opt("B", "1", False),
            _opt("C", "2", True),
            _opt("D", "∞", False),
        ]),
        _q("Integrala ∫(0 la 2) 2x dx este egală cu:", "multiple_choice", 10, 4, [
            _opt("A", "2", False),
            _opt("B", "4", True),
            _opt("C", "8", False),
            _opt("D", "1", False),
        ]),
        _q("Numărul combinărilor de 5 elemente luate câte 2 este:", "multiple_choice", 10, 5, [
            _opt("A", "10", True),
            _opt("B", "20", False),
            _opt("C", "5", False),
            _opt("D", "120", False),
        ]),
        _q("Dacă matricea A = [[1, 2], [3, 4]], determinantul det(A) este:", "multiple_choice", 10, 6, [
            _opt("A", "10", False),
            _opt("B", "-2", True),
            _opt("C", "2", False),
            _opt("D", "-10", False),
        ]),
        _q("Logaritmul log₂(32) este egal cu:", "multiple_choice", 10, 7, [
            _opt("A", "4", False),
            _opt("B", "5", True),
            _opt("C", "6", False),
            _opt("D", "16", False),
        ]),
        _q("Suma primilor n termeni ai unui progres aritmetice cu primul termen a₁ și rația r este dată de:",
           "multiple_choice", 10, 8, [
            _opt("A", "Sₙ = n · a₁", False),
            _opt("B", "Sₙ = n(a₁ + aₙ) / 2", True),
            _opt("C", "Sₙ = a₁ · rⁿ", False),
            _opt("D", "Sₙ = n · r", False),
        ]),
        _q("Ecuația cercului cu centrul în origine și raza 5 este:", "multiple_choice", 10, 9, [
            _opt("A", "x + y = 5", False),
            _opt("B", "x² + y² = 25", True),
            _opt("C", "x² + y² = 5", False),
            _opt("D", "(x-5)² + (y-5)² = 0", False),
        ]),
        _q("Rezolvați sistemul de ecuații: { x + y = 7; x − y = 3 }. Arătați calculele complete.",
           "open_ended", 10, 10, []),
    ]
    _create_exam(db, "Simulare BAC – Matematică (Profil Real) 2024", subject.id,
                 exam_type_id, admin_id, 2024, 180, 100, instructions, questions)


if __name__ == "__main__":
    seed()
