"""Modul akses data Pencatat Keuangan Pribadi.

Satu-satunya tempat yang membuka koneksi database dan menjalankan SQL;
modul lain cukup memanggil fungsi-fungsi di bawah.
"""

import sqlite3
from contextlib import closing
from pathlib import Path

NAMA_DB = "keuangan.db"
BERKAS_SKEMA = Path(__file__).with_name("schema.sql")


def get_connection(path=NAMA_DB):
    """Buka koneksi baru dengan pengaturan seragam untuk seluruh aplikasi."""
    con = sqlite3.connect(path)
    con.row_factory = sqlite3.Row
    con.execute("PRAGMA foreign_keys = ON")
    con.execute("PRAGMA busy_timeout = 5000")
    return con


def init_db(path=NAMA_DB):
    """Jalankan schema.sql; aman dipanggil berulang karena memakai IF NOT EXISTS."""
    skema = BERKAS_SKEMA.read_text(encoding="utf-8")
    with closing(get_connection(path)) as con:
        con.executescript(skema)


def format_rupiah(jumlah):
    """Format angka menjadi teks rupiah, mis. 5500000 menjadi Rp5.500.000."""
    return f"Rp{jumlah:,.0f}".replace(",", ".")


def insert_transaksi(tanggal, jenis, kategori, jumlah, catatan="", path=NAMA_DB):
    """Simpan satu transaksi, kembalikan id baris baru."""
    with closing(get_connection(path)) as con:
        with con:
            cur = con.execute(
                "INSERT INTO transaksi (tanggal, jenis, kategori, jumlah, catatan)"
                " VALUES (?, ?, ?, ?, ?)",
                (tanggal, jenis, kategori, jumlah, catatan),
            )
            return cur.lastrowid


def transaksi_terakhir(batas=10, path=NAMA_DB):
    """Ambil sejumlah transaksi terbaru, ditata dari yang paling baru."""
    with closing(get_connection(path)) as con:
        return con.execute(
            "SELECT id, tanggal, jenis, kategori, jumlah, catatan"
            " FROM transaksi ORDER BY id DESC LIMIT ?",
            (batas,),
        ).fetchall()
