"""Sesi 15 — Introduction to AI-Assisted Coding | Kode Pendamping Lengkap
SMAS St. John · Ekskul CSSE (Python)

Kelas OFFLINE — file ini berjalan 100% tanpa internet.
"Hasil AI" ditampilkan sebagai teks simulasi: anggap ini layar hasil
AI-nya. Keterampilan yang dilatih tetap sama persis saat kamu nanti
online: menulis prompt, membaca hasil, memverifikasi.

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 15

File ini mengikuti alur deck (siklus: prompt -> hasil AI (teks) ->
verifikasi -> perbaiki bug):
  BAGIAN 1 = demo: prompt KBT -> hasil AI      (slide 05-06)
  BAGIAN 2 = verifikasi 1: jalankan & cocokkan  (slide 07)
  BAGIAN 3 = verifikasi 2: uji kasus tepi       (slide 08)
  BAGIAN 4 = tugas 2: prompt KBT versi kamu     (slide 09)
  BAGIAN 5 = challenge: perbaiki bug kode AI    (slide 11-12)
  BAGIAN 6 = simulator: siklus lengkap offline  (slide 04-13)
"""

# ============================================================
# BAGIAN 1 — demo: prompt KBT -> hasil AI (teks simulasi)
# ============================================================
# PROMPT (KBT) yang diketik ke AI:
#   [Konteks] Aku siswa SMA yang sedang belajar Python dasar
#             (baru sampai function).
#   [Bahasa]  Jawab dengan kode Python, singkat, pakai komentar.
#   [Tujuan]  Buat fungsi luas_persegi_panjang(panjang, lebar) yang
#             mengembalikan hasil kali keduanya, lalu contoh
#             pemanggilannya.
#
# HASIL AI (disimulasikan sebagai teks — kelas offline):

def luas_persegi_panjang(panjang, lebar):
    # fungsi mengembalikan luas = panjang * lebar
    return panjang * lebar

hasil_ai = luas_persegi_panjang(4, 5)
print("Hasil contoh:", hasil_ai)          # Hasil contoh: 20

# Cek kebiasaan verifikasi: klaim di komentar vs output nyata.
print("Verifikasi:", hasil_ai == 20)      # Verifikasi: True

# Coba juga 7 x 3 — tebak dulu sebelum Run!
print("Coba 7 x 3:", luas_persegi_panjang(7, 3))   # 21

# ============================================================
# BAGIAN 2 — verifikasi 1: jalankan & cocokkan (slide 07)
# ============================================================
# Verifikasi 3 langkah: jalankan -> cek error -> cek logika.
# Langkah 1-2 sudah lewat (jalan, tanpa error). Sekarang logika:

def status_nilai(nilai):
    # Hasil AI untuk prompt KBT (versi pertama, BELUM divalidasi)
    if nilai >= 75:
        return "Lulus"
    else:
        return "Remedial"

print(status_nilai(82))   # Lulus
print(status_nilai(40))   # Remedial
print(status_nilai(75))   # Lulus  <- kasus tepi: pas 75 masuk Lulus

# Perhatikan: kode ini JALAN tanpa error. Tapi "jalan" != "benar"!
# AI tidak tahu aturanmu (0-100) karena kamu tidak minta di prompt.

# JEBAKAN (jangan di-run) — input bukan angka:
# print(status_nilai("delapan puluh"))
# TypeError! perbandingan teks dengan angka tidak bisa.
# Solusi: validasi try-except — akan dipakai di Final Project (Sesi 16).

# ============================================================
# BAGIAN 3 — verifikasi 2: uji kasus tepi (slide 08)
# ============================================================
# Bos yang curiga menguji TIGA jenis input:
#   1. nilai normal   (82, 40)
#   2. nilai pas batas (75, 0, 100)
#   3. nilai aneh     (-10, 150)

uji = [82, 40, 75, -10, 150]
for n in uji:
    print(f"status_nilai({n}) => {status_nilai(n)}")
# status_nilai(82)  => Lulus
# status_nilai(40)  => Remedial
# status_nilai(75)  => Lulus          (kasus tepi: pas 75 masuk Lulus)
# status_nilai(-10) => Remedial       (ANEH! -10 dijawab serius)
# status_nilai(150) => Lulus          (ANEH! 150 di luar skala 0-100)

# Kesimpulan uji: AI menjawab input aneh seolah sah, karena
# prompt-nya tidak minta validasi. Prompt yang lebih baik:
#   [Tujuan] ... mengembalikan "Lulus" jika 75 <= nilai <= 100,
#   "Remedial" jika 0 <= nilai < 75, dan "Nilai tidak valid"
#   untuk input lain di luar 0-100.

# ============================================================
# BAGIAN 4 — Tugas 2: prompt KBT versi kamu (slide 09)
# ============================================================
# Tugas: tulis 1 prompt KBT untuk 1 fungsi dari Mini Project 2-mu.
# Pola yang dikejar (contoh solusi — variasi lain yang lengkap juga benar):
#
# [Konteks] Aku siswa SMA, Python dasar, sudah kenal list & function.
# [Bahasa]  Python, singkat, pakai komentar.
# [Tujuan]  Buat fungsi status_nilai(nilai) yang mengembalikan
#           "Lulus" jika 75 <= nilai <= 100, "Remedial" jika
#           0 <= nilai < 75, dan "Nilai tidak valid" untuk input
#           lain di luar 0-100. Sertakan 3 contoh pemanggilan:
#           82, 40, dan 75.

def status_nilai_valid(nilai):
    # "Hasil AI" dari prompt yang lebih baik — sudah tervalidasi.
    # Cek ulang dengan uji kasus tepi di bawah!
    if 75 <= nilai <= 100:
        return "Lulus"
    elif 0 <= nilai < 75:
        return "Remedial"
    else:
        return "Nilai tidak valid"

uji_valid = [82, 40, 75, -10, 150]
for n in uji_valid:
    print(f"status_nilai_valid({n}) => {status_nilai_valid(n)}")
# status_nilai_valid(82)  => Lulus
# status_nilai_valid(40)  => Remedial
# status_nilai_valid(75)  => Lulus            (tepi bawah Lulus)
# status_nilai_valid(-10) => Nilai tidak valid
# status_nilai_valid(150) => Nilai tidak valid

# ============================================================
# BAGIAN 5 — Challenge: perbaiki bug kode AI (slide 11-12)
# ============================================================
# Kode "AI" di slide 11 punya SATU bug karakter. Salin, jalankan,
# uji status_nilai(75) — hasilnya salah dari aturan di prompt.
#
# BUG (jangan di-run dulu — baca, temukan, baru perbaiki):
# def status_nilai(nilai):
#     if nilai > 75:          # BUG! ">" vs ">=" — pas 75 jatuh ke Remedial
#         return "Lulus"
#     else:
#         return "Remedial"
#
# print(status_nilai(75))    # output: Remedial  <- SALAH! harusnya Lulus
#
# Ini logical error: kode jalan tanpa SyntaxError, tidak ada alarm.
# Perbaikan: satu karakter — ganti ">" menjadi ">=". Versi benar
# sudah dipakai di BAGIAN 2 (status_nilai) dan BAGIAN 4.
# Framing: menemukan bug di kode AI bukan bukti AI jelek — itu
# bukti VERIFIKASIMU bekerja.

# ============================================================
# BAGIAN 6 — simulator: siklus lengkap offline (slide 04-13)
# ============================================================
# Program mini yang memainkan seluruh siklus sesi ini:
# prompt -> hasil AI (teks) -> verifikasi -> perbaikan.

def simulator_sesi_15():
    print("=" * 50)
    print("SIMULATOR AI-ASSISTED CODING (offline)")
    print("=" * 50)

    prompt = ("[Konteks] siswa SMA, Python dasar | "
              "[Bahasa] Python | "
              "[Tujuan] fungsi status_nilai(nilai): Lulus jika "
              "75 <= nilai <= 100, Remedial jika 0 <= nilai < 75, "
              "lainnya Nilai tidak valid")
    print("Prompt :", prompt)

    print("\n--- Hasil AI (teks simulasi) ---")
    print("def status_nilai(nilai):")
    print("    if 75 <= nilai <= 100: return 'Lulus'")
    print("    elif 0 <= nilai < 75:  return 'Remedial'")
    print("    else:                  return 'Nilai tidak valid'")

    print("\n--- Verifikasi: uji kasus tepi ---")
    uji = [82, 40, 75, 0, 100, -10, 150]
    for n in uji:
        print(f"status_nilai({n}) => {status_nilai_valid(n)}")
    # status_nilai(82)  => Lulus
    # status_nilai(40)  => Remedial
    # status_nilai(75)  => Lulus
    # status_nilai(0)   => Remedial
    # status_nilai(100) => Lulus
    # status_nilai(-10) => Nilai tidak valid
    # status_nilai(150) => Nilai tidak valid

    print("\n--- Etika ---")
    print("AI membantu, kamu yang paham.")
    print("Tes paham: tutup laptop, jelaskan tiap baris ke teman.")

simulator_sesi_15()

# ============================================================
# PR (opsional) — prompt untuk Final Project (dipakai Sesi 16)
# ============================================================
# Tulis 1 prompt KBT untuk SATU fitur Final Project-mu
# (domain bebas: Nilai Siswa, Perpustakaan, Kasir, Kontak, Todo).
# Contoh pola:
#
# prompt_pr = ("[Konteks] Final Project CLI Python, list[dict] + "
#              "menu while True | "
#              "[Bahasa] Python | "
#              "[Tujuan] fungsi tambah_data() dengan validasi "
#              "try-except untuk input angka")
# print(prompt_pr)
