"""Pencatat Keuangan Pribadi — aplikasi CLI berbasis SQLite."""

import sqlite3
from datetime import date

import db


def tampilkan_menu():
    print("=== Pencatat Keuangan ===")
    print("1. Catat pemasukan")
    print("2. Catat pengeluaran")
    print("3. Lihat transaksi terakhir")
    print("4. Keluar")


def baca_tanggal():
    while True:
        teks = input("Tanggal (YYYY-MM-DD, Enter = hari ini): ").strip()
        if not teks:
            return date.today().isoformat()
        try:
            return date.fromisoformat(teks).isoformat()
        except ValueError:
            print("Format tanggal harus YYYY-MM-DD, mis. 2025-06-15.")


def baca_jumlah():
    while True:
        teks = input("Jumlah (Rp): ").strip()
        try:
            return float(teks)
        except ValueError:
            print("Jumlah harus berupa angka, mis. 25000.")


def baca_teks(label):
    while True:
        teks = input(label).strip()
        if teks:
            return teks
        print("Masukan tidak boleh kosong.")


def catat_transaksi(jenis):
    if jenis == "masuk":
        print("--- Catat Pemasukan ---")
    else:
        print("--- Catat Pengeluaran ---")
    tanggal = baca_tanggal()
    kategori = baca_teks("Kategori: ")
    jumlah = baca_jumlah()
    catatan = input("Catatan (opsional): ").strip()

    try:
        id_baru = db.insert_transaksi(tanggal, jenis, kategori, jumlah, catatan)
    except sqlite3.IntegrityError as e:
        print(f"Transaksi ditolak database: {e}")
        return
    print(f"Transaksi tersimpan dengan id {id_baru}.")


def tampilkan_transaksi():
    daftar = db.transaksi_terakhir()
    if not daftar:
        print("Belum ada transaksi.")
        return
    print(f"{'id':>3}  {'tanggal':<10}  {'jenis':<7}  {'kategori':<14}  {'jumlah':>12}")
    for t in daftar:
        print(
            f"{t['id']:>3}  {t['tanggal']:<10}  {t['jenis']:<7}  "
            f"{t['kategori']:<14}  {db.format_rupiah(t['jumlah']):>12}"
        )


def main():
    db.init_db()
    while True:
        tampilkan_menu()
        pilihan = input("Pilihan: ").strip()

        if pilihan == "1":
            catat_transaksi("masuk")
        elif pilihan == "2":
            catat_transaksi("keluar")
        elif pilihan == "3":
            tampilkan_transaksi()
        elif pilihan == "4":
            print("Sampai jumpa!")
            break
        else:
            print("Pilihan tidak dikenal.")


if __name__ == "__main__":
    main()
