"""Sesi 17 — Final Project Presentation & Demo | Kode Pendamping Lengkap
SMAS St. John · Ekskul CSSE (Python)

Cara pakai:
  1. Simpan file ini, buka di VS Code
  2. Tekan Run ▶ (atau ketik di terminal: python kode.py)
  3. Baca output di terminal — lalu baca komentar di dalamnya:
     setiap BAGIAN sesuai urutan slide deck Sesi 17
  4. Ini "app panggung mini": jalan tanpa perlu mengetik apa pun.
     Jalankan = 1x gladi bersih sebelum mendemokan Final Project-mu.

File ini mengikuti alur deck:
  BAGIAN 1 = daftar fitur siap demo          (slide 06)
  BAGIAN 2 = data contoh 2 entri             (slide 07)
  BAGIAN 3 = kandidat 1: cari_data()         (slide 08)
  BAGIAN 4 = kandidat 2: tambah_data()       (slide 08)
  BAGIAN 5 = kandidat 3: statistik()         (slide 08)
  BAGIAN 6 = skenario demo 2 menit (gladi)   (slide 07 & 12)
  BAGIAN 7 = jebakan demo day + Plan B       (slide 11 & 14)
"""

# ============================================================
# BAGIAN 1 — daftar fitur siap demo
# ============================================================
# Aturan slide 06: sebut fitur DULU, jalankan BELAKANGAN.
# Audiens butuh peta dulu — demo tugasnya menjalankan peta itu berurutan.

def tampilkan_fitur():
    """Cetak daftar fitur menu — ini bagian 'Fitur' dari presentasi."""
    print("=== FITUR APLIKASI ===")
    print("1. Lihat     - tampilkan semua data")
    print("2. Tambah    - input data baru, langsung aman")
    print("3. Cari      - temukan berdasarkan nama (sebagian pun ketemu)")
    print("4. Hapus     - buang data dengan konfirmasi")
    print("5. Statistik - jumlah, tertinggi, terendah, rata-rata")
    print()

tampilkan_fitur()
# Output:
# === FITUR APLIKASI ===
# 1. Lihat     - tampilkan semua data
# 2. Tambah    - input data baru, langsung aman
# 3. Cari      - temukan berdasarkan nama (sebagian pun ketemu)
# 4. Hapus     - buang data dengan konfirmasi
# 5. Statistik - jumlah, tertinggi, terendah, rata-rata

# ============================================================
# BAGIAN 2 — data contoh: 2 entri, siap panggung
# ============================================================
# Satu record = satu dict. Itu jawaban Q1 di slide 09:
# "kenapa list[dict], bukan dua list terpisah?"
# -> satu record masuk/keluar sebagai SATU kesatuan utuh.

data = [
    {"nama": "Budi", "nilai": 85},
    {"nama": "Sari", "nilai": 90},
]

def tampilkan_data():
    """Cetak seluruh isi data — fitur 'Lihat'."""
    print("=== DATA TERKINI ===")
    for item in data:
        print(f"- {item['nama']}: nilai {item['nilai']}")
    print()

tampilkan_data()
# Output:
# === DATA TERKINI ===
# - Budi: nilai 85
# - Sari: nilai 90

# ============================================================
# BAGIAN 3 — KANDIDAT 1: cari_data()  (slide 08)
# ============================================================
# Kenapa layak dibanggakan? 3 poin untuk Q&A:
#   1. .lower() di dua sisi -> "budi" tetap ketemu "Budi" (case-insensitive)
#   2. operator in -> pencarian sebagian: "bud" juga ketemu Budi
#   3. return list (bisa kosong) -> kosong = jujur "tidak ketemu",
#      program menolak dengan sopan, bukan crash

def cari_data(kata):
    """Cari record berdasar nama — case-insensitive & boleh sebagian."""
    hasil = []
    for item in data:
        if kata.lower() in item["nama"].lower():
            hasil.append(item)
    return hasil

print("Cari 'bud' :", cari_data("bud"))    # [{'nama': 'Budi', 'nilai': 85}]
print("Cari 'zaki':", cari_data("zaki"))   # []  (kosong = tidak ketemu — jujur!)
print()

# ============================================================
# BAGIAN 4 — KANDIDAT 2: tambah_data()  (slide 08)
# ============================================================
# Kenapa layak dibanggakan? 3 poin untuk Q&A:
#   1. append 1 dict = 1 record utuh masuk sekaligus
#   2. di Final Project aslimu, ini langsung disusul simpan_file()
#      -> data aman meski listrik mati (jawaban Q3: save tiap perubahan)
#   3. versi interaktifnya pakai while True + try-except
#      -> user yang nakal tidak bisa bikin crash (jawaban Q2)

def tambah_data(nama, nilai):
    """Tambah 1 record baru (versi demo tanpa input — aman dipanggungkan)."""
    data.append({"nama": nama, "nilai": nilai})
    print(f"Data {nama} ditambahkan.")    # di Final Project: + simpan_file()

# Versi interaktif — pamerkan kalau ditanya "kalau user nakal?".
# JANGAN di-run di panggung tanpa gladi: dia berhenti menunggu kamu ketik!
# def tambah_data_interaktif():
#     nama = input("Nama: ")
#     while True:
#         try:
#             nilai = int(input("Nilai (0-100): "))
#             break                          # input sah -> keluar dari loop
#         except ValueError:
#             print("Harus angka! Contoh: 85")   # tolak dengan sopan
#     data.append({"nama": nama, "nilai": nilai})
#     print(f"Data {nama} ditambahkan.")

# ============================================================
# BAGIAN 5 — KANDIDAT 3: statistik()  (slide 08)
# ============================================================
# Kenapa layak dibanggakan? 3 poin untuk Q&A:
#   1. list comprehension merapikan pengambilan kolom nilai
#   2. sum / max / min = tiga agregasi sekaligus (bekal Sesi 11: List)
#   3. data kosong dicek duluan -> program tidak pernah crash

def statistik():
    """Cetak ringkasan angka dari data."""
    if len(data) == 0:
        print("Belum ada data untuk dihitung.")
        return
    nilai = [item["nilai"] for item in data]
    rata = sum(nilai) / len(nilai)
    print("=== STATISTIK ===")
    print(f"Jumlah data    : {len(nilai)}")
    print(f"Nilai tertinggi: {max(nilai)}")
    print(f"Nilai terendah : {min(nilai)}")
    print(f"Rata-rata      : {rata:.1f}")
    print()

# ============================================================
# BAGIAN 6 — SKENARIO DEMO 2 MENIT (gladi bersih — slide 07 & 12)
# ============================================================
# Urutan yang terbukti tidak bikin panik:
#   tambah -> lihat -> cari (yang ADA) -> cari (yang TIDAK ADA)
#   -> statistik -> keluar rapi
# Jalankan file ini = 1x gladi bersih. Ulangi sampai otomatis!

print("### SKENARIO DEMO 2 MENIT ###")
tambah_data("Rina", 78)                    # Data Rina ditambahkan.
tampilkan_data()                           # Budi, Sari, Rina
print("Cari 'bud' :", cari_data("bud"))    # ketemu Budi
print("Cari 'zaki':", cari_data("zaki"))   # [] -> "tidak ketemu" dengan sopan
statistik()                                # 3 data, max 90, min 78, rata 84.3

# Langkah pamungkas (slide 07): di Final Project aslimu, tutup program,
# jalankan LAGI -> data masih ada. Itu bukti file — momen "oooh" audiens.
# (Di app nyata: load() di awal program + save() tiap tambah/hapus.)
print("Demo selesai — program keluar rapi.")
print()

# ============================================================
# BAGIAN 7 — jebakan demo day + Plan B (slide 11 & 14)
# ============================================================
# JEBAKAN UTAMA — jangan di-run di panggung tanpa gladi:
# nilai = int(input("Nilai: "))
#   -> kalau user ketik huruf ("delapan"), ValueError CRASH di depan kelas!
# Solusinya dua lapis: try-except (BAGIAN 4) + Plan B di bawah.

# ATURAN 3 MENIT: jangan biarkan 3 menit habis untuk 1 bug.
# Kalau program error saat demo:
#   1. Tarik napas — error itu alarm, bukan aib.
#   2. Baca pesan errornya dengan tenang (audiens ikut paham).
#   3. 1 menit tidak selesai? Lompat ke Plan B, lanjut cerita.

# PLAN B — siapkan SEBELUM naik (checklist tech check, slide 11):
#   [ ] video/screenshot fitur jalan — rekam di rumah, simpan di folder
#   [ ] backup copy program di flashdisk / email / cloud
#   [ ] font terminal diperbesar (Ctrl + +) agar terbaca dari belakang
#   [ ] uji jalan penuh: dari awal sampai Keluar tanpa crash

# Kalimat penyelamat saat macet:
#   "Kemarin fitur ini jalan — mari lihat rekamannya
#    sementara saya cek errornya."
# Dan saat Q&A blank: "Belum kami coba, tapi rencananya seperti ini..."
# Jujur itu dinilai — mengarang tidak.

# ============================================================
# PENUTUP — dari Hello World ke aplikasimu (slide 16-18)
# ============================================================
print()
print("Hello World")                                   # 17 pertemuan lalu: baris pertamamu
print("Hari ini: aplikasimu sendiri — jalan utuh, data aman.")
print("Pertanyaannya bukan 'sudah selesai?'")
print("Tapi: 'selanjutnya saya bangun apa?'")
print("Sampai jumpa!")
